From 19661f97d0d07b0619a09b7c283dd073d34e65ce Mon Sep 17 00:00:00 2001 From: randypanding Date: Wed, 26 Aug 2026 15:56:48 +0000 Subject: [PATCH 1/3] =?UTF-8?q?chore(governance):=20agent-registry=2054=20?= =?UTF-8?q?SHA=20=E7=9B=B4=E6=8E=A8=E8=B1=81=E5=85=8D=E7=99=BB=E8=AE=B0=20?= =?UTF-8?q?+=20REPOS=20=E6=B3=A8=E8=AE=B0=EF=BC=88ADR-0096=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - expected-state.json §8:direct_push_exemptions["agent-registry"] 扩至 54 笔完整 SHA (含 ADR-0030 已登记 2 笔);comment 登记 (c) 类豁免定性——基础设施事件历史重推 (删除重建镜像重推,无新 commit、零内容变更,85/85 blob 零差异) - REPOS.yaml:agent-registry status 注记 ADR-0096 删除重建与退役态复原 --- governance/REPOS.yaml | 2 +- governance/expected-state.json | 58 ++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/governance/REPOS.yaml b/governance/REPOS.yaml index 2d20df7..2627adb 100644 --- a/governance/REPOS.yaml +++ b/governance/REPOS.yaml @@ -37,7 +37,7 @@ repos: - name: agent-registry layer: L1 visibility: public - status: retired # ADR-0085:多 agent 编排声明层退役,GitHub 归档只读;快照=archive/retired/;ADR 家园已迁 archive/adr/ + status: retired # ADR-0085:多 agent 编排声明层退役,GitHub 归档只读;快照=archive/retired/;ADR 家园已迁 archive/adr/。ADR-0096:私有仓计费止血删除重建(public 重推 54 commit 全 SHA 保真、85/85 blob 零差异),§8 豁免 (c) 类已登记 expected-state;退役归档态已复原 role: (退役)注册层——声明快照见 archive/retired/agent-registry/;git 历史即正本存档 - name: archive diff --git a/governance/expected-state.json b/governance/expected-state.json index d5a26a7..3b6f8dd 100644 --- a/governance/expected-state.json +++ b/governance/expected-state.json @@ -154,7 +154,7 @@ ] }, "direct_push_exemptions": { - "comment": "§8 直推检测豁免——两类,均须 ADR 背书,逐完整 SHA 登记(新直推不可能搭便车):(a) 破玻璃直推回填:GM-2 破玻璃的机器可读回填形式(ADR-0016 附录),事件定性见 ADR-0017(.github 两条:净变更仅为 Trae IDE 分享 zip 与误入 gitlink,彼时 PR 流程已运转);(b) 建仓 bootstrap 初始 commit(ADR-0021):仓库创建时序上分支/PR 尚不存在、不可能走 PR——Shorts_Director/agent-tools/Script_Writer 的 Initial commit 类(含 GitHub UI 建仓附带的 README 编辑 commit),登记为豁免而非追认破玻璃;arbiter 建仓 bootstrap 同理(W1-C2 .github#165/ADR-0054)。archive(W1-C1 .github#164/ADR-0053):bootstrap README commit 同属 (b) 类——注意 ADR-0046 后 org-required-workflows ruleset 无 bypass,空仓首推被 required workflow 拦截,豁免操作=对 org ruleset 的 archive 仓库做秒级临时 exclude 后经 contents API 建 commit 并即刻还原(全程约 5 秒,已留痕于 #164);ruleset 最终态与落盘定义一致(drift-check §1 不受影响)。QW_Arena1(.github#345/ADR-0084):(b) 类空仓变体——模板派生未生效(空仓无 base 分支、PR 不可行,org-required-workflows 无 bypass 构成死锁),template-service 基线 72 文件由 owner 凭据经临时 bootstrap 分支落盘、建 main 后切换默认分支完成导入(全程未触碰组织 rulesets,main 根树与 template-service 逐文件 sha 一致)。;cnb-bridge(ADR-0085/IR-0005):(b) 类空仓 bootstrap——README 首commit 经 contents API(Git Data API 对空仓 409),ruleset 未动(与 QW_Arena1 的 exclude 法不同路径,同为建仓时序豁免)。2026-08-25(ADR-0090):org-required-workflows 已补 OrganizationAdmin bypass——空仓首推死锁不再存在,后续建仓 bootstrap 直推首属即合法(仍须 (b) 类逐 SHA 登记);上文临时 exclude/contents API 变通均为历史事实记录。2026-08-25(ADR-0092):Viral_Radar 建仓 bootstrap((b) 类——ADR-0091 决策 1 定性:template-service 经官方 generate endpoint 实例化落 main,非 agent 直推);archive 两笔运行报告直推破玻璃追认((a) 类——运行报告属 C1 治理面必须走 PR,此后先例 archive#27)", + "comment": "§8 直推检测豁免——三类,均须 ADR 背书,逐完整 SHA 登记(新直推不可能搭便车):(a) 破玻璃直推回填:GM-2 破玻璃的机器可读回填形式(ADR-0016 附录),事件定性见 ADR-0017(.github 两条:净变更仅为 Trae IDE 分享 zip 与误入 gitlink,彼时 PR 流程已运转);(b) 建仓 bootstrap 初始 commit(ADR-0021):仓库创建时序上分支/PR 尚不存在、不可能走 PR——Shorts_Director/agent-tools/Script_Writer 的 Initial commit 类(含 GitHub UI 建仓附带的 README 编辑 commit),登记为豁免而非追认破玻璃;arbiter 建仓 bootstrap 同理(W1-C2 .github#165/ADR-0054)。archive(W1-C1 .github#164/ADR-0053):bootstrap README commit 同属 (b) 类——注意 ADR-0046 后 org-required-workflows ruleset 无 bypass,空仓首推被 required workflow 拦截,豁免操作=对 org ruleset 的 archive 仓库做秒级临时 exclude 后经 contents API 建 commit 并即刻还原(全程约 5 秒,已留痕于 #164);ruleset 最终态与落盘定义一致(drift-check §1 不受影响)。QW_Arena1(.github#345/ADR-0084):(b) 类空仓变体——模板派生未生效(空仓无 base 分支、PR 不可行,org-required-workflows 无 bypass 构成死锁),template-service 基线 72 文件由 owner 凭据经临时 bootstrap 分支落盘、建 main 后切换默认分支完成导入(全程未触碰组织 rulesets,main 根树与 template-service 逐文件 sha 一致)。;cnb-bridge(ADR-0085/IR-0005):(b) 类空仓 bootstrap——README 首commit 经 contents API(Git Data API 对空仓 409),ruleset 未动(与 QW_Arena1 的 exclude 法不同路径,同为建仓时序豁免)。2026-08-25(ADR-0090):org-required-workflows 已补 OrganizationAdmin bypass——空仓首推死锁不再存在,后续建仓 bootstrap 直推首属即合法(仍须 (b) 类逐 SHA 登记);上文临时 exclude/contents API 变通均为历史事实记录。2026-08-25(ADR-0092):Viral_Radar 建仓 bootstrap((b) 类——ADR-0091 决策 1 定性:template-service 经官方 generate endpoint 实例化落 main,非 agent 直推);archive 两笔运行报告直推破玻璃追认((a) 类——运行报告属 C1 治理面必须走 PR,此后先例 archive#27)。2026-08-26(ADR-0096):新增 (c) 类——基础设施事件历史重推:agent-registry 私有仓触发 GitHub 安全产品计费,owner 止血删除后以 public 重建并镜像重推,PR 关联随仓删除物理消失致全部 54 笔 commit 呈现直推表象(无新 commit、零内容变更,快照 85/85 blob 零差异);事件定性=owner 止血操作,54 SHA 逐笔登记(含 ADR-0030 已登记 2 笔),线上态已复原(auto-merge/12 治理标签/重新归档);删除重建不可复制为常规手段", ".github": [ "9b056b3a925038484a8f6655ea45f81f071d5df6", "416f5f57fd459f6ece3587f3aa20b772148ad335", @@ -182,8 +182,60 @@ "f5d9b5b58d4dc30a2b0e259449862fc4a3c91f6b" ], "agent-registry": [ + "00492875e1a2db391f9dca49286370f2330a3a28", + "0631366727938b029788625766407364326324c2", + "07bd81acdba414876cb285978a15637aacb3b584", + "083262ce0d5d109ea37f78e61cb02a46ad2b335f", + "09c1e1d69c7d86f7f254d7d1376a7930bf9d3269", + "135751f3fb3114a5d9653d6d61ab8d6f0f53a890", + "1657a99945960c4ab99346afad1c1130ed4af476", + "23469877761c1f838f7256ce10a01e0682723788", + "277fa7ce0aa254ef2ad532de2cbf9161cef5d719", + "304e79c04066cdd4c08575343ebcc3cbcb44a830", + "320582f4b133611f07dd1e0b3c6bbbbb5f1cf0c4", + "3421c44b8aea70c6933c0e7a8f01ceca62fabea0", + "345a16847dddc8c6aa72f51ce48aaffc787fb841", + "34f47b8799f86504b7954d666cb559700375f31a", + "37c8870d08777e859e965e0389ce7e588e48e293", + "3eb8f765cd276aed27d7015a2d8ea8dd450009f1", + "41d4215aab6feb8cac988e174976ceef41368abd", + "42ce4b664741dca344d030470bfe88c963106b2d", + "4951a0ef1cba383f54ff6a877c4804b2872a69fd", + "54b834a1a0a67781f694ef0b77ea00e56f862497", + "5832f4e75d4e1512b266e880577ffbe433cef657", + "587d6bc5f6bc0f114d43e9f6044075360f7822f1", + "5e7b1067e793125ba54af460cc5a16b97568cdbb", "60bd1557481fa89d0358302e150a8f7d9381309c", - "e9424d220ded331c221b37135faa9d6e9cd1ecac" + "61ea498d1239af5596e55b47544c26295b90d4ab", + "67922a46e1ff0d65a1643afc276b3c4b9d124223", + "68bd17f353b3802bde3f9d47989c32c6df815d3b", + "6abbfd6f3db4fac15f2c0c5eacca6eca19548b6d", + "6fb65ccc060eaa6e2fed5e234e0c4f5af0c534bb", + "71e9e5aea1839000cec26293f38e7394388dfd38", + "722fa4cfdcb4da19c464b75687a126b278e572e7", + "84232fe816bc80f0a9990aa3d2553f5ffc232bc1", + "84decffa2807ae315595e66fbbba7373f41ae197", + "856ae267d37b263350c75c7cd77630b227076e2f", + "86a55a39d20e7c5bd1f05c32b36a09ae0c580c5f", + "8da7a897ab702972705c5ac1889bb8ea16eecf10", + "8e217ec37f7b26306651f4f45dad6a18828e5e0f", + "9111deca0d207fb4ab8ae1272cf566aa08d85eca", + "91a7181e5a3d91fc1d5722c155ddf346a5a0eaee", + "a8f632946e55b73c8ca0f1c956ce35d1df886a7c", + "aa3dfe421a4c6b149e3c7298cee5979dacda8e43", + "b045c335fd5d5748e24b52fc11dfa8cbd3f4761d", + "b1afa485724e0ef0b1b2a9357aacec3c35aa2e7a", + "b7a425b5ecf48767eb7fbbb02ff7035e87dde9f0", + "b8c5ec2fec8624d8669215c612736762555f1f54", + "bf8f4a7542b764940a62e30f7ed0e1d70447787f", + "c36ef3974719fcdb9b97073d7673f9d409489209", + "cd5b2b168591a063667763e05e1c20c7053c0360", + "d9bf29b5f7038e5eff699408db1a190b129d20b0", + "e2c2964119e33c637b18e3208b400c2806d68e2c", + "e486aff7943ba6621ab190e9b6070a4e042c2beb", + "e9424d220ded331c221b37135faa9d6e9cd1ecac", + "f743c10d0f63dff49c1a732eaf7897d83276f372", + "f89e864e89bf2e90d70609f0a147770459dfa90c" ], "holdout": [ "63360c581524510ef37150dd7540cb333d283014" @@ -239,4 +291,4 @@ "notes": { "adr_0085": "ADR-0085:agent-registry/agent-platform/agent-tools 退役(GitHub 归档只读);CNB 双账号 secret 登记(EX-1 三接缝);cnb-bridge 入 verifier 挂载面" } -} \ No newline at end of file +} From 94cf5ae97c616b12643566df1aecfcc92ffc61e7 Mon Sep 17 00:00:00 2001 From: randypanding Date: Wed, 26 Aug 2026 16:04:38 +0000 Subject: [PATCH 2/3] =?UTF-8?q?feat(governance):=20conductor=20=E4=BB=93?= =?UTF-8?q?=E4=BD=8D=E6=97=A0=E5=85=B3=E5=8C=96=20+=20App=20=E6=8C=82?= =?UTF-8?q?=E8=BD=BD=E9=9D=A2=E5=A3=B0=E6=98=8E=EF=BC=88ADR-0097=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - conductor.yml:route 守卫改 repository_owner(.github + 8 产品仓 + template-service 同字节部署);治理真源(transitions.yaml + gh-app-token.sh)经 sparse-checkout 从 .github 仓就地取用;App 令牌按事件仓铸造;spec job target_repo 与 on-failure 评论回事件仓(顺修 on-failure 令牌未传 gh 的潜伏 401——export GH_TOKEN) - expected-state.json:github_app.repositories 声明实际挂载面(API 实查 16 仓; 补 QW_Arena1/Viral_Radar/Media-Monitor,不含 holdout) - ROLE-IR/PLAYBOOK/NAVIGATION:机器面边界注记改为 ADR-0097 全仓事件面现状 --- .github/workflows/conductor.yml | 53 +++++++++++++++++++++++---------- docs/NAVIGATION.md | 5 ++-- docs/agent/ROLE-IR.md | 5 ++-- docs/pm/PLAYBOOK.md | 2 +- governance/expected-state.json | 21 ++++++++++++- 5 files changed, 65 insertions(+), 21 deletions(-) diff --git a/.github/workflows/conductor.yml b/.github/workflows/conductor.yml index c09a62c..86828a0 100644 --- a/.github/workflows/conductor.yml +++ b/.github/workflows/conductor.yml @@ -1,7 +1,10 @@ name: conductor -# 状态机路由器(IR-0001 W0-C3 / ADR-0049)。W0 事件面=本仓(issues.labeled + -# issue_comment);跨仓扩展随产品仓接入。全部状态标签写操作以 cloudbrid-agent -# App 令牌执行(INV-02:GITHUB_TOKEN 身份不持有状态写权)。 +# 状态机路由器(IR-0001 W0-C3 / ADR-0049)。事件面=组织活跃仓(ADR-0097 仓位无关 +# 部署:issues/issue_comment 事件只在 workflow 文件所在仓触发、org required +# workflows 不支持 issue 事件——故本文件以同一字节部署 .github + 8 产品仓 + +# template-service;治理真源不复制,经 sparse-checkout 从 .github 仓就地取用)。 +# 全部状态标签写操作以 cloudbrid-agent App 令牌执行(INV-02:GITHUB_TOKEN 身份 +# 不持有状态写权;令牌按事件仓铸造单仓作用域)。 # W4-C1(ADR-0079 / ISSUE-263 AC-12):T5/T6 路由增强——suite 就绪谓词 + # 三元组 survived 记录校验 + needs-human 不可直跳 wave-planned 断言。 # W1-C3(ADR-0055 决策 6):写入类 front-desk 命令(/claim /release)前置转介 @@ -28,11 +31,11 @@ concurrency: cancel-in-progress: false permissions: - contents: read # checkout 本仓(transitions.yaml + gh-app-token.sh)+ arbiter(adjudicate.sh,ADR-0055) + contents: read # checkout 事件仓(T5/T9 specs 谓词)+ .github 治理真源(sparse)+ arbiter(adjudicate.sh,ADR-0055) jobs: route: - if: github.repository == 'Cloudbird-Software/.github' + if: github.repository_owner == 'Cloudbird-Software' # ADR-0097:仓位无关(.github + 产品仓同字节部署) runs-on: ubuntu-latest timeout-minutes: 10 outputs: @@ -44,28 +47,41 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false + # 治理真源 sparse-checkout(ADR-0097):transitions.yaml 与 gh-app-token.sh + # 的唯一真源在 .github 仓——产品仓部署不携带副本,每次运行取 main 最新 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: Cloudbird-Software/.github + path: gov + sparse-checkout: | + governance/transitions.yaml + scripts/gh-app-token.sh + persist-credentials: false # arbiter 受信 checkout(ADR-0055):conductor 只在 main 上下文运行事件路由, - # arbiter main 与本仓 transitions.yaml 同级信任——裁决内核不落本仓副本 + # arbiter main 与治理真源 transitions.yaml 同级信任——裁决内核不落本仓副本 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: Cloudbird-Software/arbiter path: arbiter persist-credentials: false - - name: 铸 App 令牌(AG-2:本仓 + arbiter 各一枚单仓作用域) + - name: 铸 App 令牌(AG-2:事件仓 + arbiter 各一枚单仓作用域) id: tokens env: CB_APP_ID: ${{ secrets.CB_APP_ID }} AGENT_APP_SECRET: ${{ secrets.AGENT_APP_SECRET }} + EVENT_REPO: ${{ github.event.repository.name }} run: | set -euo pipefail - TOKEN=$(REPO=.github CB_APP_ID="$CB_APP_ID" AGENT_APP_SECRET="$AGENT_APP_SECRET" \ - bash scripts/gh-app-token.sh) + # ADR-0097:按事件仓铸造(REPO=裸仓名——gh-app-token.sh 单仓作用域契约, + # .github 自身部署时 EVENT_REPO=.github,行为不变) + TOKEN=$(REPO="$EVENT_REPO" CB_APP_ID="$CB_APP_ID" AGENT_APP_SECRET="$AGENT_APP_SECRET" \ + bash gov/scripts/gh-app-token.sh) # 用 step output 传递(避免 GITHUB_ENV 的 zizmor github-env 告警) echo "app_token=$TOKEN" >>"$GITHUB_OUTPUT" # 第二枚(ADR-0055):REPO=arbiter 单仓作用域(租约宿主仓,installation # #154584760)——adjudicate.sh 优先取 env 令牌、免二次铸币 ATOKEN=$(REPO=arbiter CB_APP_ID="$CB_APP_ID" AGENT_APP_SECRET="$AGENT_APP_SECRET" \ - bash scripts/gh-app-token.sh) + bash gov/scripts/gh-app-token.sh) echo "arbiter_token=$ATOKEN" >>"$GITHUB_OUTPUT" # 事件路由与守卫:transitions.yaml 是唯一转移定义;guard 受限求值 # (变量白名单注入、无内建);非授权=静默丢弃(回退标签、不评论、审计进 @@ -233,7 +249,7 @@ jobs: # ---- 转移表匹配(幂等:from_state 不符=no-op)---- # /release 不在表内(transitions.yaml 未列该事件)——纯租约面命令: # 直达 arbiter 裁决,不产生任何标签转移(ADR-0055 决策 6) - table = yaml.safe_load(open("governance/transitions.yaml", encoding="utf-8")) + table = yaml.safe_load(open("gov/governance/transitions.yaml", encoding="utf-8")) cands = [t for t in table["transitions"] if t["event"] == ev] t = next((x for x in cands if x["from_state"] == current), None) if t is None and ev != "comment:/release": @@ -534,7 +550,7 @@ jobs: uses: Cloudbird-Software/CI-Workflows/.github/workflows/spec-author.yml@4676c98047f816f7c888591eb882bf941e5c9fe0 # v1.4.3(irRef/taskId 事件真值覆写修复) with: issue_number: ${{ fromJson(needs.route.outputs.issue) }} - target_repo: 'Cloudbird-Software/.github' + target_repo: ${{ github.repository }} # ADR-0097:IR 所在仓=spec PR 目标仓 ir_ref: ${{ needs.route.outputs.ir_ref }} ciw_ref: '4676c98047f816f7c888591eb882bf941e5c9fe0' # 与上方 uses 钉点同值(ADR-0043 钉源) # 显式传递(zizmor secrets-inherit:调用方 secrets 必须显式点名) @@ -545,6 +561,7 @@ jobs: on-failure: # BEH-01:启动失败在原 issue 评论原因(人类只看 issue 就能知道卡在哪) + # ADR-0097:评论回事件仓 issue(令牌按事件仓铸造);gh 经 GH_TOKEN 取 App 令牌 needs: [route, spec] if: always() && (needs.route.result == 'failure' || needs.spec.result == 'failure') runs-on: ubuntu-latest @@ -554,19 +571,25 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + repository: Cloudbird-Software/.github + path: gov + sparse-checkout: | + scripts/gh-app-token.sh persist-credentials: false - name: 评论失败原因 env: CB_APP_ID: ${{ secrets.CB_APP_ID }} AGENT_APP_SECRET: ${{ secrets.AGENT_APP_SECRET }} + EVENT_REPO: ${{ github.event.repository.name }} ISSUE: ${{ needs.route.outputs.issue }} ROUTE_RC: ${{ needs.route.result }} SPEC_RC: ${{ needs.spec.result }} RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} run: | - TOKEN=$(REPO=.github CB_APP_ID="$CB_APP_ID" AGENT_APP_SECRET="$AGENT_APP_SECRET" \ - bash scripts/gh-app-token.sh) - gh api "repos/Cloudbird-Software/.github/issues/$ISSUE/comments" \ + TOKEN=$(REPO="$EVENT_REPO" CB_APP_ID="$CB_APP_ID" AGENT_APP_SECRET="$AGENT_APP_SECRET" \ + bash gov/scripts/gh-app-token.sh) + export GH_TOKEN="$TOKEN" # INV-02:App 身份评论(GITHUB_TOKEN 无 issues:write) + gh api "repos/${{ github.repository }}/issues/$ISSUE/comments" \ -f body="**conductor:spec 阶段启动失败**(BEH-01,须人类介入) route=${ROUTE_RC} spec=${SPEC_RC} run:${RUN_URL} diff --git a/docs/NAVIGATION.md b/docs/NAVIGATION.md index 52842a2..212292d 100644 --- a/docs/NAVIGATION.md +++ b/docs/NAVIGATION.md @@ -60,8 +60,9 @@ `/g060-reject` 驳回(TTL 72h)。首次创建 suite 同样走此路径——无豁免通道是刻意的。 - **conductor / arbiter 怎么触发**:不用也无法手动调用。conductor 监听 issue 事件 (`state:*` 标签、评论 `/start` `/claim` `/retry`),arbiter 由 conductor 转介执行 - CAS 租约。你只管评论与打标签,状态换签是机器的事。(机器面现状:conductor 事件面 - 限 .github 仓,产品仓 IR/卡状态由 owner 手动换签——ADR-0095 机器面边界。) + CAS 租约。你只管评论与打标签,状态换签是机器的事。(机器面 ADR-0097:conductor + 事件面覆盖 .github + 8 产品仓 + template-service——IR 所在仓即事件仓,全状态机 + 语义各仓一致。) - **测试先行 vs gate 要绿**:红测试不进 main。spec PR 的 suite 断言制度/结构不变量, 合入时必须绿;修 bug 的失败复现测试走 bug 流(B2 reproduced 锚定 base 红, fix PR 合入时转绿)。 diff --git a/docs/agent/ROLE-IR.md b/docs/agent/ROLE-IR.md index 931a707..b91c999 100644 --- a/docs/agent/ROLE-IR.md +++ b/docs/agent/ROLE-IR.md @@ -32,8 +32,9 @@ ## 签署(不是你的动作) - owner 评论 `/start` 或打 `state:ir-signed` ——**只有 owner 能签,你不代签**。 -- 机器面现状(ADR-0095 诚实申报):conductor 状态机事件面当前仅覆盖 .github 仓, - 产品仓 IR 的签署标签由 owner 手动打;跨仓事件面扩展是已登记的后续工作。 +- 机器面(ADR-0097):conductor 事件面已覆盖全部活跃仓(.github + 8 产品仓 + + template-service,同字节部署)——owner 在 IR 所在仓评论/打标签即自动换签, + 产品仓无需手动干预。 ## 开完之后 diff --git a/docs/pm/PLAYBOOK.md b/docs/pm/PLAYBOOK.md index 340bf1f..9c4845c 100644 --- a/docs/pm/PLAYBOOK.md +++ b/docs/pm/PLAYBOOK.md @@ -50,7 +50,7 @@ worker 视角的认领/开工协议(AGENTS.md entry-protocol v2 块)对 PM 标签);治理 IR 开 .github 仓。字段全必填(IFACE-01,IR-0001);编号 IR-NNNN 全局唯一(标题前缀,开立前 `bash ghcb board` 查重)。 - **签署**:owner 评论 `/start`(T2)或打 `state:ir-signed` 标签(T1)——只有 owner 能签,你不代签。 - (机器面现状:conductor 事件面限 .github 仓,产品仓 IR 签署由 owner 手动换签——ADR-0095 机器面边界。) + (机器面 ADR-0097:conductor 事件面已覆盖 .github + 8 产品仓 + template-service,产品仓签署/开卡/收卡同机自动换签。) - **spec 谁写**:两条制度等价路径(ADR-0085 决策 5,PR338 先例追认): - 你自己写——完全合法,且是深度理解 IR 的最好方式; - spec-author 快速通道:CI-Workflows `spec-author.yml` 流水线生成骨架你再修。 diff --git a/governance/expected-state.json b/governance/expected-state.json index 3b6f8dd..1b9982f 100644 --- a/governance/expected-state.json +++ b/governance/expected-state.json @@ -117,7 +117,26 @@ "must_not_have": [ "workflows", "administration" - ] + ], + "repositories": [ + ".github", + "AI_Web_School", + "CI-Workflows", + "Media-Monitor", + "QW_Arena1", + "Script_Writer", + "Shorts_Director", + "Use-up-Plan", + "Viral_Radar", + "agent-platform", + "agent-tools", + "arbiter", + "archive", + "cnb-bridge", + "mutual", + "template-service" + ], + "repositories_comment": "ADR-0097 对齐实际挂载面(installation#154584760,repository_selection=selected,API 实查 16 仓):conductor 事件面扩展至 8 产品仓 + template-service 的身份前提。holdout 严禁出现(DECISION-02/ADR-0056 §18 live 断言;ADR-0080 起由 verifier-app 挂载);agent-platform/agent-tools 为退役仓只读挂载(ADR-0085——archived 仓写路径已封死);agent-registry 删除重建后未重新挂载(ADR-0096,退役归档态)。新仓挂载后须同步本清单(此前 QW_Arena1/Viral_Radar/Media-Monitor 挂载即陈旧无声明的教训),后续以本清单为对账基线。" }, "verifier_app": { "comment": "ISSUE-263 / ADR-0080:验证者 APP,仅测试/验证路径写权;holdout 挂载唯一合法身份(drift-check §18);与 cloudbrid-agent 身份分离(AG-1,ADR-0076)", From 97915a070fb81622d0050c69cac9afa6c58cdfe4 Mon Sep 17 00:00:00 2001 From: randypanding Date: Wed, 26 Aug 2026 16:46:33 +0000 Subject: [PATCH 3/3] =?UTF-8?q?style:=20conductor.yml=20prettier=20?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96=E2=80=94=E2=80=94=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=E5=BD=92=E4=B8=80/=E5=BC=95=E5=8F=B7?= =?UTF-8?q?=E8=A7=84=E8=8C=83=EF=BC=88Viral=5FRadar=20CI=20lint=20?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=EF=BC=8CADR-0097=20=E5=85=A8=E4=BB=93?= =?UTF-8?q?=E5=90=8C=E5=AD=97=E8=8A=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/conductor.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/conductor.yml b/.github/workflows/conductor.yml index 86828a0..054e33f 100644 --- a/.github/workflows/conductor.yml +++ b/.github/workflows/conductor.yml @@ -31,11 +31,11 @@ concurrency: cancel-in-progress: false permissions: - contents: read # checkout 事件仓(T5/T9 specs 谓词)+ .github 治理真源(sparse)+ arbiter(adjudicate.sh,ADR-0055) + contents: read # checkout 事件仓(T5/T9 specs 谓词)+ .github 治理真源(sparse)+ arbiter(adjudicate.sh,ADR-0055) jobs: route: - if: github.repository_owner == 'Cloudbird-Software' # ADR-0097:仓位无关(.github + 产品仓同字节部署) + if: github.repository_owner == 'Cloudbird-Software' # ADR-0097:仓位无关(.github + 产品仓同字节部署) runs-on: ubuntu-latest timeout-minutes: 10 outputs: @@ -550,9 +550,9 @@ jobs: uses: Cloudbird-Software/CI-Workflows/.github/workflows/spec-author.yml@4676c98047f816f7c888591eb882bf941e5c9fe0 # v1.4.3(irRef/taskId 事件真值覆写修复) with: issue_number: ${{ fromJson(needs.route.outputs.issue) }} - target_repo: ${{ github.repository }} # ADR-0097:IR 所在仓=spec PR 目标仓 + target_repo: ${{ github.repository }} # ADR-0097:IR 所在仓=spec PR 目标仓 ir_ref: ${{ needs.route.outputs.ir_ref }} - ciw_ref: '4676c98047f816f7c888591eb882bf941e5c9fe0' # 与上方 uses 钉点同值(ADR-0043 钉源) + ciw_ref: "4676c98047f816f7c888591eb882bf941e5c9fe0" # 与上方 uses 钉点同值(ADR-0043 钉源) # 显式传递(zizmor secrets-inherit:调用方 secrets 必须显式点名) secrets: LLM_API_KEY: ${{ secrets.LLM_API_KEY }}