起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

Description

@os-sam

裁决(2026-09-01,维护者,逐字)

立 ADR 起草卡派发

语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

交付物

docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

必须涵盖(取向已裁,ADR 负责论证与留痕)

  1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
  2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
  3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
  4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
  5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
  6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
  7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
  8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
  9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

起草纪律

  • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
  • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
  • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
  • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

关联

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

    Description

    @os-sam

    裁决(2026-09-01,维护者,逐字)

    立 ADR 起草卡派发

    语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

    交付物

    docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

    必须涵盖(取向已裁,ADR 负责论证与留痕)

    1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
    2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
    3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
    4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
    5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
    6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
    7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
    8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
    9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

    起草纪律

    • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
    • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
    • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
    • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

    关联

    Activity

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

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

      Description

      @os-sam

      裁决(2026-09-01,维护者,逐字)

      立 ADR 起草卡派发

      语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

      交付物

      docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

      必须涵盖(取向已裁,ADR 负责论证与留痕)

      1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
      2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
      3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
      4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
      5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
      6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
      7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
      8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
      9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

      起草纪律

      • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
      • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
      • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
      • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

      关联

      Activity

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

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

        Description

        @os-sam

        裁决(2026-09-01,维护者,逐字)

        立 ADR 起草卡派发

        语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

        交付物

        docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

        必须涵盖(取向已裁,ADR 负责论证与留痕)

        1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
        2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
        3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
        4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
        5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
        6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
        7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
        8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
        9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

        起草纪律

        • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
        • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
        • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
        • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

        关联

        Activity

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

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

          Description

          @os-sam

          裁决(2026-09-01,维护者,逐字)

          立 ADR 起草卡派发

          语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

          交付物

          docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

          必须涵盖(取向已裁,ADR 负责论证与留痕)

          1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
          2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
          3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
          4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
          5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
          6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
          7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
          8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
          9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

          起草纪律

          • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
          • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
          • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
          • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

          关联

          Activity

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

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

            Description

            @os-sam

            裁决(2026-09-01,维护者,逐字)

            立 ADR 起草卡派发

            语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

            交付物

            docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

            必须涵盖(取向已裁,ADR 负责论证与留痕)

            1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
            2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
            3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
            4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
            5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
            6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
            7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
            8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
            9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

            起草纪律

            • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
            • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
            • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
            • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

            关联

            Activity

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

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

              Description

              @os-sam

              裁决(2026-09-01,维护者,逐字)

              立 ADR 起草卡派发

              语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

              交付物

              docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

              必须涵盖(取向已裁,ADR 负责论证与留痕)

              1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
              2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
              3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
              4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
              5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
              6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
              7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
              8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
              9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

              起草纪律

              • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
              • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
              • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
              • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

              关联

              Activity

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

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                起草 ADR:发布物作为共同所有权边界 —— 一个发布物、物内 N 个包(#14122) #14144

                Description

                @os-sam

                裁决(2026-09-01,维护者,逐字)

                立 ADR 起草卡派发

                语境:总监席对 #14122(hotlong,一物 N 包提案)的评估结论为「方案合理,建议接受;应当先写 ADR 再派实现」,维护者以上句批准进入 ADR 起草通道。终局接受/修订在 ADR draft PR 的人工合并上落定,本卡只产出 ADR 草案。

                交付物

                docs/adr/ 新增一篇 ADR(编号取现有最大号 +1,起草时以 ls docs/adr 实测为准),主题:发布物(release artifact)作为共同所有权边界 —— 编译按包、产物一个 JSON、物内保留 N 份 manifest、装载按依赖拓扑序注册 N 个包。Status: Proposed。

                必须涵盖(取向已裁,ADR 负责论证与留痕)

                1. Context:引 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 的实测证据(fork 税、Studio 平铺、token 预算无模块边界、CPQ 无可售单元),以及 §2 三条替代路的否决理由(module 标签 = 假模块无边界原语;独立命名空间 = rename-on-install,ADR-0048 明拒;composeStacks = 压平丢身份)。
                2. Decision 核心原则:同一发布物内的包由同一发布者原子交付,物本身即共同所有权声明——安装闸判据从「同一包 id」修正为「同一物内共同所有者」;⛔ 不新增 manifest owner/publisher 字段(推迟至模块独立成物售卖时,与 ADR-0048 2026-08-08 addendum D2 对齐,记入 Non-goals)。
                3. 对 ADR-0019 的边界记录:消费者模型一根不动(装一个/开一个/卸一个,D1-D3 原样);发布物停在控制面,⛔ 永不成为消费者可浏览/安装/卸载的 suite(D3 苹果论证原样适用);D4「a set of namespaces」原文即容纳本案。按仓内惯例以交叉引用/addendum 记录,⛔ 不改写 0019 原文。
                4. 对 ADR-0048 的闸变更记录:命名空间独占今天顺带代理着「无两包同名对象」;放宽(§5.4)必须与安装时逐对象名唯一性检查(§5.6)同批,且机器不可拆——同一 PR 落地 + 一条门测试断言「闸已放宽 ⇒ 唯一性检查存在且拒绝同名对象」。写入 Consequences 作机器判据。
                5. 产物 schema 决策:manifest 单数 → packages: [...],新增可选键、两种都读(有 packages 遍历,无则把 manifest 当单元素列表);前向兼容走既有 manifest.engines.protocol;分段加载的键位在本 ADR 定稿时预留(不必实现,但格式是最难回头改的决策,One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ④)。
                6. 拓扑序为验收条件而非实现细节:物内包注册必须按依赖拓扑序,复用 resolvePluginOrder(⛔ 不写第二排序机制);顺序错误静默失效(扩展不生效不报错),必须有测试钉住。
                7. 一物一版(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 ③ 已认):版本矩阵消失、扩展不悬空;代价(不能单独热修模块)如实写入;要单独售卖的模块独立成物。
                8. 兼容性与验收:存量单 manifest 产物经新装载路径注册结果逐位相同(包记录、对象 FQN、_packageId、命名空间所有者集合)——写成测试的机器判据(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §6.4),不靠 review 判断。
                9. Consequences 枚举后续实现面(One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §5 表,含 objectui 侧 Studio 选择器另开),实现卡待 ADR 合并后按 ADR 派发,⛔ 本卡不写实现代码。

                起草纪律

                • 先通读 One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 全文(含修订 1)、ADR-0019、ADR-0048(含 addendum)、必要时 ADR-0003/0005;引用逐字,锚点给文件行号。
                • 总监席已抽查核实的锚点:0019 D4 原文、0048 三处 rename-on-install non-goal、registry.ts:1456 多所有者 Map、registry.ts:3582-3595 命名空间闸——可直接引用。
                • docs/adr/** 是受管面:PR 恒 draft,终局为维护者直合或钉头批准入队;⛔ 不入队不转 ready。
                • 遵守 ADR 目录既有格式惯例(读近期两三篇为样);docs-only diff 按仓内惯例决定是否需要 changeset(实测 --test 与 lint 门为准)。

                关联

                Activity

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

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions