repo-harness 0.25.0 → 0.25.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/README.md +27 -43
  2. package/agents/fleet/orchestrator.md +5 -4
  3. package/assets/herdr/github-events/bot-event.d.mts +12 -0
  4. package/assets/herdr/github-events/bot-event.mjs +35 -0
  5. package/assets/herdr/github-events/filter.mjs +73 -0
  6. package/assets/herdr/github-events/worker.mjs +91 -0
  7. package/assets/herdr/github-events/wrangler.json +11 -0
  8. package/assets/reference-configs/agentic-development-flow.md +9 -4
  9. package/assets/reference-configs/external-tooling.md +32 -46
  10. package/assets/reference-configs/global-working-rules.md +10 -8
  11. package/assets/reference-configs/harness-overview.md +6 -3
  12. package/assets/reference-configs/herdr-notify.md +140 -79
  13. package/assets/reference-configs/herdr-skill-context.md +38 -49
  14. package/assets/reference-configs/hook-operations.md +2 -3
  15. package/assets/reference-configs/host-invariants.md +2 -3
  16. package/assets/skill-commands/AGENTS.md +1 -1
  17. package/assets/skill-commands/CLAUDE.md +1 -1
  18. package/assets/skill-commands/manifest.json +12 -31
  19. package/assets/skill-commands/repo-harness-architecture/references/worker.md +14 -5
  20. package/assets/skill-commands/repo-harness-ship/SKILL.md +2 -1
  21. package/assets/skill-version.json +2 -2
  22. package/assets/skills/repo-harness-cross-review/SKILL.md +1 -1
  23. package/assets/skills/repo-harness-cross-review/references/generic-review.md +6 -5
  24. package/assets/skills/repo-harness-herdr-portal/SKILL.md +29 -22
  25. package/assets/skills/repo-harness-herdr-portal/references/messaging.md +14 -12
  26. package/assets/skills/repo-harness-herdr-portal/references/spawn.md +51 -68
  27. package/assets/skills/repo-harness-issue-flow/SKILL.md +6 -1
  28. package/assets/skills/repo-harness-issue-flow/references/acceptor.md +6 -1
  29. package/assets/skills/repo-harness-issue-flow/references/board.md +35 -11
  30. package/assets/skills/repo-harness-issue-flow/references/events.md +117 -0
  31. package/assets/skills/repo-harness-issue-flow/references/orchestrator.md +194 -16
  32. package/assets/skills/repo-harness-issue-flow/references/replan.md +99 -0
  33. package/assets/skills/repo-harness-issue-flow/references/templates.md +76 -0
  34. package/assets/skills/repo-harness-issue-flow/references/worker.md +15 -0
  35. package/assets/skills/repo-harness-product/SKILL.md +2 -2
  36. package/assets/skills/repo-harness-test/references/authoring.md +6 -7
  37. package/assets/skills/repo-harness-test/references/verification-plan.md +0 -1
  38. package/assets/templates/helpers/capability-resolver.ts +4 -1
  39. package/assets/templates/runtime.gitignore +1 -0
  40. package/assets/tool-catalog.v1.json +3 -3
  41. package/assets/workflow-contract.v1.json +3 -50
  42. package/cordis.patch.yml +1 -1
  43. package/dist/dsh/client.js +132 -0
  44. package/dist/dsh/package.json +21 -0
  45. package/dist/dsh/plugin.js +4526 -0
  46. package/dist/hook-entry.js +251 -200
  47. package/dist/oar-review-host.js +100 -72
  48. package/dist/operator-ui/assets/ArchitectureWorkspace-rjlN-8R2.js +7 -0
  49. package/dist/operator-ui/assets/{DocsPage-DV2HZUAM.js → DocsPage-CRaTSP3D.js} +4 -4
  50. package/dist/operator-ui/assets/{abnfDiagram-VCTEODGH-Bjvx57sB.js → abnfDiagram-VCTEODGH-BFhgL4_X.js} +1 -1
  51. package/dist/operator-ui/assets/architecture-7GRP2DOG-CAUav40i.js +1 -0
  52. package/dist/operator-ui/assets/{architectureDiagram-5GKGNRK7-DI0vCG--.js → architectureDiagram-5GKGNRK7-1NoOp4es.js} +1 -1
  53. package/dist/operator-ui/assets/{blockDiagram-I7D4REHJ-BZ_YUsUS.js → blockDiagram-I7D4REHJ-D-cnMqjK.js} +1 -1
  54. package/dist/operator-ui/assets/{c4Diagram-7LVT6UL2-DH0Jtlli.js → c4Diagram-7LVT6UL2-DYm9qbaz.js} +1 -1
  55. package/dist/operator-ui/assets/channel-J9t0gGUF.js +1 -0
  56. package/dist/operator-ui/assets/{chunk-4HAMMTFA-tFJtpQE1.js → chunk-4HAMMTFA-BF1G1yi6.js} +1 -1
  57. package/dist/operator-ui/assets/{chunk-75Z2AOVW-CIdpTPCg.js → chunk-75Z2AOVW-B1j-oisA.js} +1 -1
  58. package/dist/operator-ui/assets/{chunk-DU6HZSFF-Bd07S2X4.js → chunk-DU6HZSFF-DsnuxesV.js} +1 -1
  59. package/dist/operator-ui/assets/{chunk-F27PBJKO-DWRq64qg.js → chunk-F27PBJKO-eb7-Ur1D.js} +1 -1
  60. package/dist/operator-ui/assets/{chunk-GMAD6QVW-Dl95AJFc.js → chunk-GMAD6QVW-C09ks1XE.js} +1 -1
  61. package/dist/operator-ui/assets/{chunk-GVQU2GXP-C7OXmRjR.js → chunk-GVQU2GXP-BpZL9Gfs.js} +1 -1
  62. package/dist/operator-ui/assets/{chunk-IMKFNOWR-QL5B_aOs.js → chunk-IMKFNOWR-kyEnT-W3.js} +1 -1
  63. package/dist/operator-ui/assets/{chunk-L3NEJ4N5-ukfpnoE0.js → chunk-L3NEJ4N5-CEQdXQqr.js} +1 -1
  64. package/dist/operator-ui/assets/{chunk-OSK3NFVY-CnHEPnkn.js → chunk-OSK3NFVY-B8eNuair.js} +1 -1
  65. package/dist/operator-ui/assets/{chunk-P2QGCYS3-BpS1hNgD.js → chunk-P2QGCYS3-IC1iPfVx.js} +1 -1
  66. package/dist/operator-ui/assets/{chunk-POPQ4Y6H-CMPd1nz4.js → chunk-POPQ4Y6H-Bb7QgvZD.js} +1 -1
  67. package/dist/operator-ui/assets/{chunk-PWAF6VOD-BX0WsbhE.js → chunk-PWAF6VOD-CwILx0_c.js} +1 -1
  68. package/dist/operator-ui/assets/{chunk-SHT3W25Y-BNEtOwXv.js → chunk-SHT3W25Y-hEd5Dpoe.js} +1 -1
  69. package/dist/operator-ui/assets/{chunk-SVP7TREG-Bxc3jiKi.js → chunk-SVP7TREG-C-QbND6n.js} +1 -1
  70. package/dist/operator-ui/assets/{chunk-TICWLB2K-DyFwShYo.js → chunk-TICWLB2K-DeSQeLFM.js} +1 -1
  71. package/dist/operator-ui/assets/classDiagram-ZZMXUADV-DXPXgEqY.js +1 -0
  72. package/dist/operator-ui/assets/classDiagram-v2-VYDZK3BY-DXPXgEqY.js +1 -0
  73. package/dist/operator-ui/assets/{cynefin-OW5HDTMX-B2H6A8Am.js → cynefin-OW5HDTMX-PhoRwNSU.js} +1 -1
  74. package/dist/operator-ui/assets/{cynefinDiagram-5FMLGOSQ-nBu7H-dN.js → cynefinDiagram-5FMLGOSQ-7OXilZZ1.js} +1 -1
  75. package/dist/operator-ui/assets/{dagre-GXQ25YYZ-B2in2DwM.js → dagre-GXQ25YYZ-Dk48DZQU.js} +1 -1
  76. package/dist/operator-ui/assets/{diagram-S7CK7UJ4-CVqDk_Fk.js → diagram-S7CK7UJ4-CtyC5kUo.js} +1 -1
  77. package/dist/operator-ui/assets/{diagram-UQ7AKVKN-Bhe0hBRp.js → diagram-UQ7AKVKN-Be56sX3m.js} +1 -1
  78. package/dist/operator-ui/assets/{diagram-VSXAHHWV-DCmGVIr0.js → diagram-VSXAHHWV-BhNRjKPt.js} +1 -1
  79. package/dist/operator-ui/assets/{diagram-VX7I27RA-Bs6Vy86z.js → diagram-VX7I27RA-CUr_B8fH.js} +1 -1
  80. package/dist/operator-ui/assets/{diagram-Z3DM3KII-DM7HmIub.js → diagram-Z3DM3KII-CdZCWs9K.js} +1 -1
  81. package/dist/operator-ui/assets/{ebnfDiagram-PWID7BFC-D2y4BOCF.js → ebnfDiagram-PWID7BFC-I8e2x1dF.js} +1 -1
  82. package/dist/operator-ui/assets/{erDiagram-RLTQ6QDP-SM1BNTfU.js → erDiagram-RLTQ6QDP-SMs1WZl6.js} +1 -1
  83. package/dist/operator-ui/assets/eventmodeling-NTZA5JFV-DqJVxgEO.js +1 -0
  84. package/dist/operator-ui/assets/flowDiagram-HODETNUW-NvyYrdhg.js +1 -0
  85. package/dist/operator-ui/assets/{ganttDiagram-EL5Y4UJY-B2P50qAo.js → ganttDiagram-EL5Y4UJY-BV0qL4k_.js} +1 -1
  86. package/dist/operator-ui/assets/{gitGraph-4MIJSDKK-CAF_C8Dc.js → gitGraph-4MIJSDKK-BloiXYXP.js} +1 -1
  87. package/dist/operator-ui/assets/{gitGraphDiagram-WWUBYQGX-SInZ4rJX.js → gitGraphDiagram-WWUBYQGX-B4D8jXky.js} +1 -1
  88. package/dist/operator-ui/assets/index-CAtU8UhN.js +27 -0
  89. package/dist/operator-ui/assets/index-DcWFPCXl.css +2 -0
  90. package/dist/operator-ui/assets/{info-A6RAGUB7-Bllvf-34.js → info-A6RAGUB7-UOZqF0a7.js} +1 -1
  91. package/dist/operator-ui/assets/{infoDiagram-27XIBGKW-D8NT9zyX.js → infoDiagram-27XIBGKW-C6X0pAO1.js} +1 -1
  92. package/dist/operator-ui/assets/{ishikawaDiagram-5VMMS53U-CE8D2a4x.js → ishikawaDiagram-5VMMS53U-Cp3KYNQj.js} +1 -1
  93. package/dist/operator-ui/assets/{journeyDiagram-3NMN7TZE-M29lG_I4.js → journeyDiagram-3NMN7TZE-DCjmPwDY.js} +1 -1
  94. package/dist/operator-ui/assets/{kanban-definition-UXKFOSKX-uofpf--r.js → kanban-definition-UXKFOSKX-f2p6h_X8.js} +1 -1
  95. package/dist/operator-ui/assets/{line-O2iQnsVY.js → line-DGsxynmm.js} +1 -1
  96. package/dist/operator-ui/assets/{mermaid-parser.core-Z8f9As5u.js → mermaid-parser.core-CFVtSnVW.js} +3 -3
  97. package/dist/operator-ui/assets/{mermaid.core-DlT9jDxk.js → mermaid.core-DiouEf_0.js} +4 -4
  98. package/dist/operator-ui/assets/{mindmap-definition-YA3MSWOX-DF-U4w3y.js → mindmap-definition-YA3MSWOX-BNYBhd2k.js} +1 -1
  99. package/dist/operator-ui/assets/{packet-AYTQ26CC-BxumXMQA.js → packet-AYTQ26CC-BxJO6-w_.js} +1 -1
  100. package/dist/operator-ui/assets/{pegDiagram-XKGWAZYB-CEfYiEYk.js → pegDiagram-XKGWAZYB-NFxyKcEL.js} +1 -1
  101. package/dist/operator-ui/assets/{pie-WAS4IAKB-dJWiJit9.js → pie-WAS4IAKB-DRG3g5IX.js} +1 -1
  102. package/dist/operator-ui/assets/{pieDiagram-E7YTZNPT-DNUW3YgV.js → pieDiagram-E7YTZNPT-BM-X8pCs.js} +1 -1
  103. package/dist/operator-ui/assets/{quadrantDiagram-AXDQQJYC-BywHKYmV.js → quadrantDiagram-AXDQQJYC-CfxNqnID.js} +1 -1
  104. package/dist/operator-ui/assets/{radar-RG4KPBEZ-DVXYXIk7.js → radar-RG4KPBEZ-CWp-KDl_.js} +1 -1
  105. package/dist/operator-ui/assets/{railroad-74A4TZTK-DUlxBsRj.js → railroad-74A4TZTK-W7pjUvJr.js} +1 -1
  106. package/dist/operator-ui/assets/railroad-abnf-HS5TGJTU-7fl6y-zk.js +1 -0
  107. package/dist/operator-ui/assets/railroad-ebnf-LZEXJU2U-nFqux8Y2.js +1 -0
  108. package/dist/operator-ui/assets/railroad-peg-WCYAUIDC-DfJI7HIW.js +1 -0
  109. package/dist/operator-ui/assets/{railroadDiagram-O6MQD6OU-BK5ZqcXN.js → railroadDiagram-O6MQD6OU-k_k-e0OU.js} +1 -1
  110. package/dist/operator-ui/assets/{requirementDiagram-BXWQKSXE-BPNZxdR4.js → requirementDiagram-BXWQKSXE-BFUODn2H.js} +1 -1
  111. package/dist/operator-ui/assets/{sankeyDiagram-P5KCCOFB-A3wO6K53.js → sankeyDiagram-P5KCCOFB-BVCdC525.js} +1 -1
  112. package/dist/operator-ui/assets/{sequenceDiagram-WJ2MYXX4-DZH1qETK.js → sequenceDiagram-WJ2MYXX4-CV9FGbzU.js} +1 -1
  113. package/dist/operator-ui/assets/{stateDiagram-D77RDMKH-BAxdK688.js → stateDiagram-D77RDMKH-BCUJLyp9.js} +1 -1
  114. package/dist/operator-ui/assets/stateDiagram-v2-MP3YSRHH-BrcHaQr3.js +1 -0
  115. package/dist/operator-ui/assets/{swimlanes-42K2YHIH-CZCcKZu8.js → swimlanes-42K2YHIH-BhJmqiih.js} +1 -1
  116. package/dist/operator-ui/assets/swimlanesDiagram-VR7AAH4N-BBUuY_m3.js +8 -0
  117. package/dist/operator-ui/assets/{timeline-definition-24CTP7MA-Bj5uQAgY.js → timeline-definition-24CTP7MA-DncmXLjW.js} +1 -1
  118. package/dist/operator-ui/assets/{treeView-Q6P3EWNA-BEmjJl7z.js → treeView-Q6P3EWNA-CZN7aAl9.js} +1 -1
  119. package/dist/operator-ui/assets/{treemap-WGGIJYW6-KNjDwrtc.js → treemap-WGGIJYW6-DEBJHML0.js} +1 -1
  120. package/dist/operator-ui/assets/{vennDiagram-4TSXK5OY-CQcrg6LI.js → vennDiagram-4TSXK5OY-BUU9uzvr.js} +1 -1
  121. package/dist/operator-ui/assets/{wardley-WFR3VGLG-DchAOldS.js → wardley-WFR3VGLG-DNxI3y-4.js} +1 -1
  122. package/dist/operator-ui/assets/{wardleyDiagram-VM6X3IG4-BRXjrmTb.js → wardleyDiagram-VM6X3IG4-Cb3t-YF7.js} +1 -1
  123. package/dist/operator-ui/assets/{xychartDiagram-S5SC5T6Z-BHTOn-Ft.js → xychartDiagram-S5SC5T6Z-BzBOBXOR.js} +1 -1
  124. package/dist/operator-ui/index.html +2 -2
  125. package/package.json +9 -11
  126. package/references/handoff.md +17 -19
  127. package/scripts/axr5-archctx-clean-room.ts +14 -2
  128. package/scripts/change-assessment.ts +16 -39
  129. package/scripts/check-agent-tooling.sh +48 -46
  130. package/scripts/check-state-boundaries.ts +206 -18
  131. package/scripts/check-tarball-install-smoke.sh +3 -13
  132. package/scripts/contract-worktree-runtime.ts +6 -18
  133. package/scripts/contract-worktree.sh +3 -3
  134. package/scripts/lib/path-values.ts +3 -1
  135. package/scripts/lib/project-init-lib.sh +8 -13
  136. package/scripts/report-ci.ts +93 -19
  137. package/scripts/run-skill-routing-eval.ts +6 -10
  138. package/scripts/select-ci-coverage.ts +17 -12
  139. package/scripts/sync-codex-installed-copies.sh +1 -1
  140. package/scripts/sync-helper-sources.ts +0 -9
  141. package/scripts/test-file-durations.json +0 -26
  142. package/scripts/worktree-merge-lib.sh +1 -2
  143. package/src/cli/commands/adoption-plan.ts +14 -1
  144. package/src/cli/commands/board.ts +60 -0
  145. package/src/cli/commands/bots.ts +0 -3
  146. package/src/cli/commands/doctor.ts +33 -180
  147. package/src/cli/commands/events.ts +170 -0
  148. package/src/cli/commands/global-runtime.ts +82 -90
  149. package/src/cli/commands/herdr-skill-render.mjs +5 -7
  150. package/src/cli/commands/herdr-skill.ts +8 -6
  151. package/src/cli/commands/herdr.ts +102 -142
  152. package/src/cli/commands/init-hook.ts +9 -9
  153. package/src/cli/commands/init.ts +15 -54
  154. package/src/cli/commands/mcp.ts +10 -427
  155. package/src/cli/commands/operator.ts +0 -14
  156. package/src/cli/commands/publication.ts +19 -3
  157. package/src/cli/commands/retention.ts +18 -10
  158. package/src/cli/commands/review.ts +13 -13
  159. package/src/cli/commands/run.ts +1 -5
  160. package/src/cli/commands/seats.ts +128 -0
  161. package/src/cli/commands/setup-check-child.ts +2 -1
  162. package/src/cli/commands/setup-snapshot.ts +3 -3
  163. package/src/cli/commands/tools.ts +231 -0
  164. package/src/cli/commands/upgrade-registered.ts +63 -25
  165. package/src/cli/commands/upgrade.ts +39 -7
  166. package/src/cli/hook/mutation-bash.ts +6 -1
  167. package/src/cli/hook/mutation-guard.ts +49 -11
  168. package/src/cli/index.ts +72 -24
  169. package/src/cli/installer/configuration-ownership.ts +12 -3
  170. package/src/cli/installer/global-context.ts +27 -2
  171. package/src/cli/installer/install-profile.ts +16 -6
  172. package/src/cli/installer/uninstall.ts +28 -15
  173. package/src/cli/installer/waza-rules.ts +16 -6
  174. package/src/cli/mcp/audit.ts +0 -42
  175. package/src/cli/mcp/auth.ts +30 -187
  176. package/src/cli/mcp/codegraph-adapter.ts +26 -24
  177. package/src/cli/mcp/doctor.ts +141 -0
  178. package/src/cli/mcp/fleet-tools.ts +4 -87
  179. package/src/cli/mcp/instructions.ts +4 -23
  180. package/src/cli/mcp/paths.ts +27 -11
  181. package/src/cli/mcp/policy.ts +4 -80
  182. package/src/cli/mcp/server.ts +9 -149
  183. package/src/cli/mcp/tools.ts +24 -390
  184. package/src/cli/mcp/types.ts +1 -20
  185. package/src/core/architecture/module-view.ts +1 -10
  186. package/src/core/architecture/projection.ts +10 -1
  187. package/src/core/board/attention.ts +317 -0
  188. package/src/core/board/board.ts +310 -0
  189. package/src/core/board/plan-block.ts +110 -0
  190. package/src/core/board/source.ts +331 -0
  191. package/src/core/capabilities/ownership-blocker.ts +9 -1
  192. package/src/core/capabilities/registry.ts +3 -0
  193. package/src/core/decision/notify-secret-keys.ts +8 -0
  194. package/src/core/fleet/admitted-task-message.ts +7 -6
  195. package/src/core/fleet/board.ts +8 -40
  196. package/src/core/fleet/task-message.ts +9 -15
  197. package/src/core/messages/task-message-error.ts +11 -1
  198. package/src/core/operator/admitted-task-activity.ts +1 -1
  199. package/src/core/operator/admitted-task-context.ts +4 -9
  200. package/src/core/operator/architecture.ts +19 -1
  201. package/src/core/operator/board-read.ts +16 -0
  202. package/src/core/operator/bot-access.ts +60 -218
  203. package/src/core/operator/execution-state.ts +38 -30
  204. package/src/core/operator/fleet-snapshot.ts +2 -21
  205. package/src/core/operator/herdr-pin.ts +44 -10
  206. package/src/core/operator/notify-status.ts +61 -113
  207. package/src/core/operator/pane-prefix.ts +2 -0
  208. package/src/core/operator/runtime-status.ts +25 -25
  209. package/src/core/operator/seat-launch.ts +277 -0
  210. package/src/core/operator/seats-settings.ts +213 -0
  211. package/src/core/operator/slack-review.ts +278 -0
  212. package/src/core/publication/merge-readiness.ts +58 -0
  213. package/src/core/review/acceptance-receipt.ts +6 -0
  214. package/src/core/review/authority-context.ts +8 -0
  215. package/src/core/review/check-records.ts +130 -0
  216. package/src/core/review/runner-port.ts +148 -0
  217. package/src/core/security/secret-patterns.ts +1 -0
  218. package/src/core/sessions/task-sessions.ts +3 -9
  219. package/src/core/setup/decode.ts +1 -1
  220. package/src/core/setup/projection.ts +1 -1
  221. package/src/core/setup/types.ts +3 -7
  222. package/src/core/skill-surface/projection-state.ts +10 -0
  223. package/src/dsh/bridge.ts +5 -4
  224. package/src/dsh/build.ts +71 -0
  225. package/src/dsh/client.tsx +99 -0
  226. package/src/dsh/guard-denials.ts +78 -0
  227. package/src/dsh/package.dist.json +21 -0
  228. package/src/dsh/plugin.ts +19 -3
  229. package/src/dsh/protocol.ts +16 -0
  230. package/src/effects/admission/admission-source.ts +3 -0
  231. package/src/effects/adoption/gitignore-plan.ts +9 -3
  232. package/src/effects/adoption/standard-plan.ts +98 -17
  233. package/src/effects/architecture/archctx-provider.ts +25 -2
  234. package/src/effects/architecture/model-reader.ts +2 -1
  235. package/src/effects/board/collect.ts +181 -0
  236. package/src/effects/bot-registry.ts +18 -17
  237. package/src/effects/external-sources/binding.ts +7 -4
  238. package/src/effects/fleet/board.ts +4 -21
  239. package/src/effects/fleet/provider-feedback.ts +1 -1
  240. package/src/effects/fleet/task-inbox-layout-migration.ts +24 -10
  241. package/src/effects/fleet/task-inbox.ts +23 -39
  242. package/src/effects/host-skill-roots.ts +22 -2
  243. package/src/effects/locking/exclusive-directory-lock.ts +13 -0
  244. package/src/effects/operator/architecture.ts +15 -0
  245. package/src/effects/operator/board-read.ts +124 -0
  246. package/src/effects/operator/bot-access.ts +37 -76
  247. package/src/effects/operator/claude-agent-types.ts +123 -0
  248. package/src/effects/operator/cleanup-file-access.ts +2 -1
  249. package/src/effects/operator/execution-collector.ts +13 -6
  250. package/src/effects/operator/execution-state-worker.ts +25 -6
  251. package/src/effects/operator/execution-state.ts +22 -10
  252. package/src/effects/operator/herdr-runtime-transport.ts +108 -70
  253. package/src/effects/operator/notify-collector.ts +3 -3
  254. package/src/effects/operator/notify-status.ts +28 -98
  255. package/src/effects/operator/runtime-capture-pty.ts +8 -4
  256. package/src/effects/operator/runtime-capture.ts +7 -4
  257. package/src/effects/operator/runtime-service.ts +17 -14
  258. package/src/effects/operator/runtime-source.ts +19 -17
  259. package/src/effects/operator/runtime-status.ts +14 -11
  260. package/src/effects/operator/seats-configuration.ts +146 -0
  261. package/src/effects/operator/seats-settings-route.ts +66 -0
  262. package/src/effects/operator/server.ts +161 -446
  263. package/src/effects/operator/slack-review-collector.ts +254 -0
  264. package/src/effects/operator/task-context.ts +0 -2
  265. package/src/effects/publication/batch-build.ts +478 -0
  266. package/src/effects/publication/merge-executor.ts +88 -17
  267. package/src/effects/publication/merge-readiness.ts +27 -8
  268. package/src/effects/repo-registry.ts +22 -1
  269. package/src/effects/review/acceptance-receipt.ts +13 -15
  270. package/src/effects/review/change-assessment.ts +34 -4
  271. package/src/effects/review/diff-fingerprint.ts +0 -6
  272. package/src/effects/review/generic-review.ts +61 -213
  273. package/src/effects/review/review-isolation.ts +1 -13
  274. package/src/effects/{review/oar-review-host.ts → review-runner/task-oar-host.ts} +24 -28
  275. package/src/effects/{review/pre-prompt-inbox-consumer.ts → review-runner/task-pre-prompt-inbox-consumer.ts} +2 -2
  276. package/src/effects/{review/pre-prompt-inbox.ts → review-runner/task-pre-prompt-inbox.ts} +4 -4
  277. package/src/effects/review-runner/task-review-runner.ts +208 -0
  278. package/src/effects/sessions/admitted-source.ts +2 -5
  279. package/src/effects/sessions/task-sessions.ts +3 -3
  280. package/src/effects/setup/pi-host-probe.ts +32 -0
  281. package/src/effects/state/coordination-worktree-topology.ts +171 -18
  282. package/src/effects/state/resolve-effective-state.ts +20 -17
  283. package/src/effects/terminal/herdr-core.ts +503 -0
  284. package/src/effects/terminal/herdr-notify-install.ts +70 -49
  285. package/src/effects/terminal/herdr.ts +2 -1
  286. package/src/effects/terminal/native-task-session.ts +2 -1
  287. package/src/effects/terminal/notify-relay.ts +263 -0
  288. package/src/effects/terminal/task-session-admission.ts +72 -0
  289. package/src/effects/terminal/task-session-io.ts +24 -2
  290. package/src/effects/terminal/task-session-record.ts +146 -0
  291. package/src/effects/terminal/task-session.ts +200 -588
  292. package/src/effects/terminal/task-worktree-runtime.ts +27 -0
  293. package/src/effects/upgrade/legacy-inventory.ts +127 -7
  294. package/src/effects/upgrade/legacy-worktree-cleanup.ts +1 -1
  295. package/src/effects/upgrade/operator-decisions.ts +1 -0
  296. package/src/operator-web/AdmittedTaskContext.tsx +1 -2
  297. package/src/operator-web/App.tsx +77 -83
  298. package/src/operator-web/ArchitectureHistory.tsx +481 -0
  299. package/src/operator-web/ArchitectureWorkspace.tsx +16 -9
  300. package/src/operator-web/BoardPage.tsx +312 -0
  301. package/src/operator-web/BotsPage.tsx +130 -125
  302. package/src/operator-web/Home.tsx +4 -6
  303. package/src/operator-web/NotifyStatus.tsx +1 -4
  304. package/src/operator-web/RepositoryWorkspace.tsx +8 -87
  305. package/src/operator-web/RuntimeBadges.tsx +3 -0
  306. package/src/operator-web/SeatsPage.tsx +272 -0
  307. package/src/operator-web/SettingsPage.tsx +37 -10
  308. package/src/operator-web/TaskDrawer.tsx +267 -0
  309. package/src/operator-web/WorktreesPage.tsx +1 -2
  310. package/src/operator-web/app.css +109 -14
  311. package/src/operator-web/architecture-map-layout.ts +20 -8
  312. package/src/operator-web/board-view.ts +139 -0
  313. package/src/operator-web/bots.ts +46 -24
  314. package/src/operator-web/dev-activity.ts +2 -57
  315. package/src/operator-web/fixture.ts +2 -47
  316. package/src/operator-web/fixtures/architecture-map.json +5929 -8389
  317. package/src/operator-web/fixtures/board-1474.json +490 -0
  318. package/src/operator-web/fixtures/bots.ts +65 -51
  319. package/src/operator-web/fixtures/dev-activity.ts +6 -6
  320. package/src/operator-web/fixtures/index.ts +25 -10
  321. package/src/operator-web/fixtures/settings.ts +66 -1
  322. package/src/operator-web/fixtures/setup.ts +2 -2
  323. package/src/operator-web/fleet-api.ts +0 -40
  324. package/src/operator-web/i18n.ts +551 -442
  325. package/src/operator-web/labels.ts +0 -13
  326. package/src/operator-web/seats.ts +89 -0
  327. package/src/operator-web/settings.ts +92 -55
  328. package/src/operator-web/types.ts +0 -107
  329. package/src/operator-web/ui.tsx +7 -2
  330. package/src/operator-web/workspace-location.ts +38 -10
  331. package/src/operator-web/worktrees.ts +0 -10
  332. package/agents/engineers/profiles/verification-evals-checks.json +0 -17
  333. package/agents/engineers/profiles/workflow-engine-contract-assets.json +0 -17
  334. package/agents/engineers/sops/verification-evals-checks.md +0 -9
  335. package/agents/engineers/sops/workflow-engine-contract-assets.md +0 -9
  336. package/assets/herdr/webhook-notify/herdr-plugin.toml +0 -10
  337. package/assets/herdr/webhook-notify/notify.mjs +0 -372
  338. package/assets/herdr/webhook-notify/pane-status.mjs +0 -74
  339. package/assets/herdr/webhook-notify/worktree-location.mjs +0 -15
  340. package/assets/skills/repo-harness-chatgpt/SKILL.md +0 -33
  341. package/assets/skills/repo-harness-chatgpt/references/bridge.md +0 -124
  342. package/assets/skills/repo-harness-chatgpt/references/consult.md +0 -92
  343. package/assets/skills/repo-harness-chatgpt/references/continue.md +0 -57
  344. package/assets/skills/repo-harness-chatgpt/references/delegate.md +0 -409
  345. package/assets/skills/repo-harness-chatgpt/references/orchestrate.md +0 -226
  346. package/assets/skills/repo-harness-chatgpt/references/read-back.md +0 -87
  347. package/assets/skills/repo-harness-chatgpt/references/setup.md +0 -199
  348. package/dist/dsh-plugin.js +0 -399
  349. package/dist/operator-ui/assets/ArchitectureWorkspace-BrUOPtga.js +0 -7
  350. package/dist/operator-ui/assets/architecture-7GRP2DOG-DwBb_elr.js +0 -1
  351. package/dist/operator-ui/assets/channel-CM1VQx9C.js +0 -1
  352. package/dist/operator-ui/assets/classDiagram-ZZMXUADV-DbQjXAzM.js +0 -1
  353. package/dist/operator-ui/assets/classDiagram-v2-VYDZK3BY-DbQjXAzM.js +0 -1
  354. package/dist/operator-ui/assets/eventmodeling-NTZA5JFV-BE74fbWW.js +0 -1
  355. package/dist/operator-ui/assets/flowDiagram-HODETNUW-Bv9uAODR.js +0 -1
  356. package/dist/operator-ui/assets/index-CPqSvndN.css +0 -2
  357. package/dist/operator-ui/assets/index-f-CSZ52F.js +0 -25
  358. package/dist/operator-ui/assets/railroad-abnf-HS5TGJTU-DNtifAEn.js +0 -1
  359. package/dist/operator-ui/assets/railroad-ebnf-LZEXJU2U-CYKwwuRu.js +0 -1
  360. package/dist/operator-ui/assets/railroad-peg-WCYAUIDC-DLC4ckY3.js +0 -1
  361. package/dist/operator-ui/assets/stateDiagram-v2-MP3YSRHH-0zIAKCg6.js +0 -1
  362. package/dist/operator-ui/assets/swimlanesDiagram-VR7AAH4N-Bkz-hKOF.js +0 -8
  363. package/docs/images/repo-harness-gptpro-cn.png +0 -0
  364. package/docs/images/repo-harness-gptpro.png +0 -0
  365. package/docs/repo-harness-chatgpt-browser-engine.md +0 -359
  366. package/scripts/codex-handoff-resume.sh +0 -65
  367. package/scripts/prepare-codex-handoff.sh +0 -58
  368. package/scripts/prepare-handoff.sh +0 -57
  369. package/scripts/recovery-view-cli.ts +0 -116
  370. package/src/cli/chatgpt-browser/binding.ts +0 -117
  371. package/src/cli/chatgpt-browser/engine.ts +0 -602
  372. package/src/cli/chatgpt-browser/file-policy.ts +0 -180
  373. package/src/cli/chatgpt-browser/native-provider.ts +0 -622
  374. package/src/cli/chatgpt-browser/oracle-provider.ts +0 -806
  375. package/src/cli/chatgpt-browser/oracle-session-evidence.ts +0 -128
  376. package/src/cli/chatgpt-browser/prompt-assembler.ts +0 -29
  377. package/src/cli/chatgpt-browser/secret-scan.ts +0 -139
  378. package/src/cli/chatgpt-browser/session-store.ts +0 -351
  379. package/src/cli/chatgpt-browser/types.ts +0 -212
  380. package/src/cli/chatgpt-skill/installer.ts +0 -131
  381. package/src/cli/chatgpt-skill/source.ts +0 -60
  382. package/src/cli/commands/chatgpt.ts +0 -440
  383. package/src/cli/commands/integration.ts +0 -218
  384. package/src/cli/mcp/coding-tools.ts +0 -645
  385. package/src/cli/mcp/coding-workspaces.ts +0 -734
  386. package/src/cli/mcp/herdr-tools.ts +0 -267
  387. package/src/cli/mcp/oauth.ts +0 -636
  388. package/src/cli/mcp/process-sessions.ts +0 -749
  389. package/src/cli/mcp/review-publish-tool.ts +0 -106
  390. package/src/cli/mcp/session-store.ts +0 -179
  391. package/src/cli/mcp/setup-ownership.ts +0 -60
  392. package/src/cli/mcp/setup.ts +0 -1419
  393. package/src/cli/mcp/transports/http.ts +0 -874
  394. package/src/cli/mcp/uninstall.ts +0 -119
  395. package/src/core/decision/pane-status.d.mts +0 -9
  396. package/src/core/decision/pane-status.mjs +0 -74
  397. package/src/core/engineers/AGENTS.md +0 -27
  398. package/src/core/engineers/CLAUDE.md +0 -27
  399. package/src/core/engineers/agent-runtime-effect.ts +0 -603
  400. package/src/core/engineers/engineering-overlay.ts +0 -475
  401. package/src/core/engineers/principal-claim.ts +0 -164
  402. package/src/core/engineers/profile-binding.ts +0 -171
  403. package/src/core/engineers/scheduling.ts +0 -540
  404. package/src/core/fleet/task-reply.ts +0 -259
  405. package/src/core/integration/product-acceptance.ts +0 -371
  406. package/src/core/operator/organization-snapshot.ts +0 -147
  407. package/src/core/operator/planning-snapshot.ts +0 -92
  408. package/src/core/operator/repository-snapshot.ts +0 -12
  409. package/src/effects/engineers/agent-runtime-adapters/herdr-cli-agent.ts +0 -48
  410. package/src/effects/engineers/agent-runtime-effect-store.ts +0 -787
  411. package/src/effects/engineers/agent-runtime-feature.ts +0 -65
  412. package/src/effects/engineers/dependency-authority.ts +0 -636
  413. package/src/effects/engineers/engineering-overlay.ts +0 -80
  414. package/src/effects/engineers/scheduling.ts +0 -150
  415. package/src/effects/evidence/recovery-materializer.ts +0 -673
  416. package/src/effects/integration/product-acceptance.ts +0 -595
  417. package/src/effects/operator/repository-snapshot-worker.ts +0 -55
  418. package/src/effects/operator/repository-snapshot.ts +0 -149
  419. package/src/effects/profiles/profile-store.ts +0 -203
  420. package/src/effects/setup/pi-herdr-integration.ts +0 -58
  421. package/src/effects/terminal/herdr-decision.ts +0 -98
  422. package/src/effects/terminal/herdr-observation.ts +0 -127
  423. package/src/effects/terminal/task-session-reader.ts +0 -63
  424. package/src/operator-web/Board.tsx +0 -420
  425. package/src/operator-web/ItemDrawer.tsx +0 -208
  426. package/src/operator-web/OrganizationSummary.tsx +0 -64
  427. package/src/operator-web/PlanningView.tsx +0 -48
package/README.md CHANGED
@@ -43,7 +43,7 @@ files let Claude and Codex resume work across sessions.
43
43
 
44
44
  ### 1. Install the CLI
45
45
 
46
- Prerequisites: a Git working tree, `bun`, and usable `herdr` >=0.9.5 for host readiness; macOS/Linux also require `bash`,
46
+ Prerequisites: a Git working tree, `bun`, and `hc` (herdr-core) >= `external_tooling.herdr_core.min_version` for host readiness; macOS/Linux also require `bash`,
47
47
  while Windows requires Git for Windows (including its Bash and `usr/bin`
48
48
  tools). `jq` is optional. No Node.js required — the installer uses Bun >=
49
49
  1.4.0 as the runtime, installing or upgrading Bun first when needed.
@@ -67,9 +67,10 @@ repo-harness install
67
67
  npx -y repo-harness@latest install # npx fallback; the CLI still runs on Bun
68
68
  ```
69
69
 
70
- Install herdr from [herdr.dev](https://herdr.dev/) and verify `herdr --version`.
70
+ Install `hc` through Herdr.app or a herdr-core release. Verify that `hc --version`
71
+ reports at least `.ai/harness/policy.json#external_tooling.herdr_core.min_version`.
71
72
  Persistent review hosting requires POSIX process groups; on Windows use WSL.
72
- Missing or unusable herdr blocks host readiness. Before upgrading from tmux,
73
+ Missing, unusable or older hc blocks host readiness. Before upgrading from tmux,
73
74
  drain existing reviewers using the previous version and explicitly rebind terminal
74
75
  endpoints. See [runtime cutover](https://github.com/Ancienttwo/repo-harness/blob/archive/docs-researches-20261004/docs/researches/20260909-herdr-runtime-cutover.md).
75
76
 
@@ -145,9 +146,8 @@ bun test
145
146
 
146
147
  ### Success looks like this
147
148
 
148
- Init writes repo-local files and two files under `HOME`: the repo registry
149
- entry and, when verification runs, the global Codex handoff packet under
150
- `~/.codex/handoffs/`. It writes no install-managed host files. When the
149
+ Init writes repo-local files and one file under `HOME`: the repo registry
150
+ entry. It writes no install-managed host files. When the
151
151
  required Herdr skill or the architecture projection preference is missing, init
152
152
  reports a skipped step that names `repo-harness update`. repo-harness supplies tools and evidence; the Bot
153
153
  decides what to schedule.
@@ -156,8 +156,8 @@ Apply ends with `=== Migration Report ===`, naming where generated hook behavior
156
156
  comes from, the user-level `~/.claude/settings.json` and `~/.codex/hooks.json`
157
157
  adapter target, the repo-local surfaces created or refreshed, and an
158
158
  `--- External Tooling ---` readiness block. Stable intent then lives in
159
- `docs/spec.md` and `docs/prds/`, task state in the GitHub issue and PR,
160
- resume state in `.ai/harness/handoff/`. If the dry run looks wrong, stop and
159
+ `docs/spec.md` and `docs/prds/`, task and resume state in the GitHub issue,
160
+ its claim comments and the PR. If the dry run looks wrong, stop and
161
161
  read
162
162
  [`hook-operations.md`](docs/reference-configs/hook-operations.md) first.
163
163
 
@@ -172,8 +172,6 @@ repo-harness upgrade decide --keep <path> # record an operator decision for a re
172
172
  repo-harness upgrade --registered # preview project refresh for every registered repo; no writes
173
173
  repo-harness uninstall --dry-run # preview owned user configuration cleanup
174
174
  repo-harness uninstall # remove owned configuration; preserve user changes/history
175
- repo-harness mcp uninstall --dry-run # preview independent MCP setup cleanup
176
- repo-harness mcp uninstall --services-stopped # after stopping all MCP HTTP services
177
175
  ```
178
176
 
179
177
  `update` and `setup check` print one leftover count. `update` does not apply
@@ -216,10 +214,9 @@ release line have no supported historical proof and remain report-only.
216
214
  ## Why repo-harness
217
215
 
218
216
  - **File-backed sessions, not chat memory.** Separate Claude and Codex sessions
219
- stay coordinated through the repo. `SessionStart` injects the prior session's
220
- resume packet, and `Stop` writes the handoff and resume views. A session can
221
- end mid-task and the next one resumes the exact next step, blockers, and
222
- changed files without re-deriving them.
217
+ stay coordinated through the repo and its GitHub issue and PR. A session can
218
+ end mid-task. The next one reads the issue, the latest claim status and the
219
+ PR, and resumes the exact next step without re-deriving it.
223
220
  - **Token-lean by design.** Instead of grep-and-read loops that re-scan the repo
224
221
  every session, the harness leans on a pre-built CodeGraph index for structural
225
222
  queries and on progressive context loading: a stable ~12KB root context plus
@@ -237,7 +234,6 @@ In an adopted repo, the surface area is intentionally small:
237
234
  | `docs/spec.md` and `docs/reference-configs/` | Shared standards and stable product intent that every agent session can read. |
238
235
  | `docs/prds/` | Product intent and optional design briefs. |
239
236
  | `tasks/lessons.md` | The one local lesson ledger. Task identity and history stay in the issue and PR. |
240
- | `.ai/harness/handoff/` | Session journal and resumable status, derived from the issue, PR and repository state instead of chat memory. |
241
237
 
242
238
  ## Task Authority
243
239
 
@@ -265,7 +261,7 @@ callers while the contract lifecycle is removed.
265
261
  | **Session handoff** | Record the issue, branch, evidence and next action so another agent can continue |
266
262
  | **Progressive context loading** | A ~12KB stable root context plus ~1KB capability contracts loaded only for the files actually being touched |
267
263
  | **CodeGraph integration** | Structural queries (callers, callees, definitions) answered from a pre-built index instead of repeated grep-and-read passes |
268
- | **MCP planner sidecar** | ChatGPT reads real repo state and writes PRD/Sprint/Goal artifacts; Codex executes them, with no default source-code write access |
264
+ | **MCP planner sidecar** | A local MCP client reads real repo state over stdio and writes PRD artifacts, with no default source-code write access |
269
265
  | **Claude + Codex alignment** | One user-level adapter contract, one workflow contract, and one set of repo-local artifacts shared by both hosts |
270
266
 
271
267
  ## How It Works
@@ -399,7 +395,7 @@ A dedicated linked checkout hosts one fleet `deep-reasoner` task-agent in the ad
399
395
 
400
396
  ### Bot merge
401
397
 
402
- A local Herdr Bot merges through the MCP `merge_pull_request` tool of the `orchestrator` profile. A cloud-only Bot runs `repo-harness publication merge` in a sandbox that has repo-harness, a working `gh auth` and a checkout. Both use the same executor. It merges only when `publication.acceptance_merge` is `on` in the policy on the PR base, and it needs strict required checks and enforce_admins on the default branch. A Bot record does not grant merge permission. See [the control Bot boundary](docs/control-bot-boundary.md#bot-modes-and-merge).
398
+ A local Herdr Bot runs `repo-harness publication merge` in its shell. A cloud-only Bot runs the same command in a sandbox that has repo-harness, a working `gh auth` and a checkout. It merges only when `publication.acceptance_merge` is `on` in the policy on the PR base, and it needs strict required checks and enforce_admins on the default branch. A Bot record does not grant merge permission. See [the control Bot boundary](docs/control-bot-boundary.md#bot-modes-and-merge).
403
399
 
404
400
  ## Hooks
405
401
 
@@ -461,7 +457,7 @@ Read committed architecture facts or export a module review prompt:
461
457
 
462
458
  ```bash
463
459
  repo-harness module list --json
464
- repo-harness module review-prompt capability.runtime-harness.engineer-bindings --json
460
+ repo-harness module review-prompt capability.runtime-harness.task-agent-host --json
465
461
  ```
466
462
 
467
463
  The prompt uses HEAD content. It reports uncommitted paths and their content
@@ -472,29 +468,19 @@ shards arrive. Diff mode requires both `--base <rev>` and `--head <rev>`.
472
468
 
473
469
  ## MCP Connector
474
470
 
475
- As an optional sidecar, `repo-harness mcp` exposes workflow artifacts to MCP
476
- clients through the default `planner` profile. ChatGPT reads real repo state,
477
- writes PRDs under `docs/prds/`, and reads the linked GitHub issue — with no
478
- default source-code write access, arbitrary shell execution, or default runner. The task owner directs an explicitly addressed Herdr agent to execute the task goal.
471
+ As an optional sidecar, `repo-harness mcp serve` exposes workflow artifacts to a
472
+ local MCP client over stdio through the default `planner` profile or the
473
+ `executor` profile. The client reads real repo state and writes PRDs under
474
+ `docs/prds/`. It has no default source-code write access, no shell and no runner. The
475
+ task owner directs an explicitly addressed Herdr agent to execute the task goal.
479
476
 
480
477
  ```bash
481
- repo-harness mcp setup chatgpt --repo .
482
- repo-harness mcp serve --repo . --transport http --host 127.0.0.1 --port 8765 --profile planner
478
+ repo-harness mcp serve --repo . --profile planner
479
+ repo-harness mcp doctor --repo .
483
480
  ```
484
481
 
485
- Expose that local server through an HTTPS tunnel, register the `/mcp` URL, and
486
- the human workflow is:
487
-
488
- 1. ChatGPT reads repo-harness workflow files through MCP.
489
- 2. ChatGPT writes a PRD with `write_prd_from_idea`.
490
- 3. ChatGPT lists existing PRDs under `docs/prds/` and reads the linked issue.
491
- 4. The task owner orders GitHub issues through `repo-harness-issue-flow` and
492
- sends the issue Goal to an explicitly addressed Herdr agent.
493
-
494
- General repo reader/writer tools, snapshot and index consistency, server
495
- profiles, and the opt-in dev runner:
496
- [`general-repo-mcp.md`](docs/reference-configs/general-repo-mcp.md). Direct-coding
497
- profile: [`chatgpt-coding-mcp.md`](docs/reference-configs/chatgpt-coding-mcp.md).
482
+ General repo reader/writer tools, snapshot and index consistency, and server profiles:
483
+ [`general-repo-mcp.md`](docs/reference-configs/general-repo-mcp.md).
498
484
  Index-stale, CodeGraph-down, and rollback operations:
499
485
  [`general-repo-mcp-codegraph.md`](deploy/runbooks/general-repo-mcp-codegraph.md).
500
486
 
@@ -517,7 +503,7 @@ Agents read source artifacts before derived summaries:
517
503
  | Current user prompt and referenced files | PR description |
518
504
  | `AGENTS.md` / `CLAUDE.md` | Changed files and diff |
519
505
  | The GitHub issue and PR | Verification Plan execution records and run trace |
520
- | Latest handoff in `.ai/harness/handoff/` | Residual risks and rollback |
506
+ | Latest claim status comment on the issue | Residual risks and rollback |
521
507
  If it disagrees with the issue, PR, checks, or handoff, the source artifacts win.
522
508
 
523
509
  Runtime-heavy validators (Unity, browser E2E, mobile simulators, hardware rigs,
@@ -545,7 +531,6 @@ control context loading. They do not add a host permission boundary.
545
531
  | `repo-harness-ship` | Bot | Explicit publication and cleanup decisions |
546
532
  | `obsidian-memory` | Bot | Explicit memory recall or persistence |
547
533
  | `repo-harness-cross-review` | Bot | Generic review; direct advisory runtime retired |
548
- | `repo-harness-chatgpt` | Bot | Explicit integration mode and advisory decisions |
549
534
  | `repo-harness-setup` | Worker | Assigned install, migration, repair or scaffold |
550
535
  | `repo-harness-test` | Worker | Source tests and real fixtures |
551
536
  | `repo-harness-architecture` | Worker | Assigned model, projection or diagram work |
@@ -609,10 +594,9 @@ dependencies.
609
594
  | [Hylarucoder](https://x.com/hylarucoder) / Geju | P1/P2/P3 due-diligence method and Geju practice that shaped the planning, tracing, and decision-rationale discipline in this workflow | Methodology contribution and acknowledgement; not a bundled dependency |
610
595
  | Waza by [TW93](https://x.com/HiTw93), including `think`, `hunt`, `check`, and `health` | Daily planning, bug hunts, verification, health checks, and Codex-first skill sync | Installed through the skills CLI into host skill roots |
611
596
  | `mermaid` | Authoring and readability review for Mermaid architecture and system-flow source | Runtime-referenced review skill, not vendored into generated repos and never an HTML artifact generator |
612
- | [herdr](https://herdr.dev/) | Required peer-terminal runtime: notification dispatch, peer collaboration, and hosting the persistent acceptance reviewer | Externally installed binary, checksum-pinned in `.ai/harness/policy.json`; replaces the retired tmux runtime |
597
+ | [herdr](https://herdr.dev/) (`hc`, herdr-core) | Required peer-terminal runtime: notification dispatch, peer collaboration, and hosting the persistent acceptance reviewer | Externally installed `hc` binary, pinned in `.ai/harness/policy.json#external_tooling.herdr_core` (`min_version` floor and checksum-verified CI release asset); replaces the retired tmux runtime |
613
598
  | [`reverse-skill-router`](https://github.com/zhaoxuya520/reverse-skill) | Routes reverse-engineering and security tasks to specialist playbooks | Recommended explicit-only Skill (`--with-reverse-skill`); not profile-selected because upstream's target-mention authorization assumption requires independent scope review |
614
599
  | CodeGraph (`@colbymchenry/codegraph`) | Symbol-aware navigation, impact tracing, and readiness checks for this self-host repo | Dev dependency in this repo; generated repos stay global-MCP-first unless policy opts in |
615
- | [Oracle](https://github.com/steipete/oracle) by [Peter Steinberger](https://x.com/steipete) (`@steipete/oracle`, MIT) | Default GPT Pro / ChatGPT Web browser consult engine that the `chatgpt-browser` Oracle provider shells out to for `gptpro` consults | Externally-resolved binary (`--oracle-bin`, `REPO_HARNESS_ORACLE_BIN`, `node_modules/.bin`, or `PATH`); never auto-downloaded, and a missing binary is a hard `ORACLE_NOT_INSTALLED` failure |
616
600
  | OpenAI Codex | Primary execution agent for repo-local implementation, verification, and GitHub contributor attribution when a commit materially includes Codex-authored work | External agent runtime; attribution is an explicit commit trailer, not hidden hook automation |
617
601
 
618
602
  ### GitHub Contributor Attribution
@@ -629,8 +613,8 @@ repo-harness commit scripts or hooks unless that repo adopts the same policy.
629
613
 
630
614
  ## Current Release
631
615
 
632
- - npm package: `repo-harness@0.25.0`
633
- - Generated workflow stamp: `repo-harness@0.25.0+template@0.25.0`
616
+ - npm package: `repo-harness@0.25.3`
617
+ - Generated workflow stamp: `repo-harness@0.25.3+template@0.25.3`
634
618
  - GitHub repository: `Ancienttwo/repo-harness`
635
619
  - Release notes and history: [`docs/CHANGELOG.md`](docs/CHANGELOG.md)
636
620
 
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: orchestrator
3
- description: Dispatch-only issue-flow coordinator. Suggested model: Opus at xhigh effort. The Claude entry runs with `claude --agent orchestrator`; other hosts load the issue-flow skill's orchestrator mode. Reads archimap and capability docs, splits issues, dispatches work, and follows PRs and CI. Never edits product code, reviews its own dispatched PRs, or dispatches subagents.
4
- tools: ["Read", "Grep", "Glob", "Bash"]
3
+ description: Dispatch-only issue-flow coordinator. Suggested model: Opus at high effort. The Claude entry runs with `claude --agent orchestrator`; other hosts load the issue-flow skill's orchestrator mode. Reads archimap and capability docs, splits issues, dispatches work, and follows PRs and CI. Never edits product code, reviews its own dispatched PRs, or dispatches subagents.
4
+ tools: ["Read", "Grep", "Glob", "Bash", "TaskCreate", "TaskUpdate", "TaskList", "TaskGet"]
5
5
  model: opus
6
- effort: xhigh
6
+ effort: high
7
7
  ---
8
8
 
9
9
  You are the orchestrator. You run as a long-lived top-level session, not as a subagent. Any host may run this seat. The model and effort in this file are a suggestion for the Claude entry.
@@ -16,8 +16,9 @@ You may:
16
16
  - Read code and docs with Read, Grep and Glob.
17
17
  - Run read-only checks with Bash. Examples: `git status`, `git log`, `gh issue view`, `gh pr view`, `gh pr checks`.
18
18
  - Create issues and comments with `gh issue create --body-file -` and `gh issue comment --body-file -`. Send the body on standard input. Do not write the body to a file.
19
- - Dispatch work with `herdr agent prompt` or the MCP tool `prompt_task_agent`. Each dispatch names the issue, the file scope, the verification command and the forbidden areas.
19
+ - Dispatch work with the `hc` commands of the Herdr Dispatch runbook (`docs/reference-configs/herdr-notify.md`): `hc send <t> <comment URL>` to message a worker, `hc read <t>` and `hc wait <t>` to follow it. Each dispatch names the issue, the file scope, the verification command and the forbidden areas.
20
20
  - Follow open PRs and CI. Report each result to the issue.
21
+ - Keep worker notices in a triage queue with TaskCreate, TaskUpdate, TaskList and TaskGet. Follow `references/orchestrator.md` §8.1 of `repo-harness-issue-flow`: answer the owner first, then take one queue item at a time by priority.
21
22
 
22
23
  You must not:
23
24
  - Edit product code, tests or configuration.
@@ -0,0 +1,12 @@
1
+ export declare const BOT_EVENT_PROTOCOL: 'repo-harness.bot-event/v1';
2
+ export declare const NAME_PATTERN: RegExp;
3
+ export interface BotEvent {
4
+ readonly protocol: 'repo-harness.bot-event/v1';
5
+ readonly source: 'herdr' | 'github';
6
+ readonly repository: string | null;
7
+ readonly kind: string;
8
+ readonly ts: string;
9
+ readonly data: Readonly<Record<string, unknown>>;
10
+ }
11
+ export declare function assertBotEvent(value: unknown): BotEvent;
12
+ export declare function botEvent(input: Omit<BotEvent, 'protocol'>): BotEvent;
@@ -0,0 +1,35 @@
1
+ // The one bot event envelope. The notify relay and the GitHub event Worker both send it, so it
2
+ // stays plain ESM with no dependency and no Node-only API.
3
+ export const BOT_EVENT_PROTOCOL = 'repo-harness.bot-event/v1';
4
+ export const NAME_PATTERN = /^[\w.-]{1,128}$/;
5
+
6
+ const SOURCES = ['herdr', 'github'];
7
+ const KIND_PATTERN = /^[a-z]+(\.[a-z_]+)+$/;
8
+
9
+ function isPlainObject(value) {
10
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;
11
+ const prototype = Object.getPrototypeOf(value);
12
+ return prototype === Object.prototype || prototype === null;
13
+ }
14
+
15
+ function isIsoTimestamp(value) {
16
+ return typeof value === 'string' && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString() === value;
17
+ }
18
+
19
+ export function assertBotEvent(value) {
20
+ const checks = [
21
+ ['protocol', value?.protocol === BOT_EVENT_PROTOCOL],
22
+ ['source', SOURCES.includes(value?.source)],
23
+ ['repository', value?.repository === null || (typeof value?.repository === 'string' && NAME_PATTERN.test(value.repository))],
24
+ ['kind', typeof value?.kind === 'string' && KIND_PATTERN.test(value.kind)],
25
+ ['ts', isIsoTimestamp(value?.ts)],
26
+ ['data', isPlainObject(value?.data)],
27
+ ];
28
+ const invalid = checks.find(([, valid]) => !valid);
29
+ if (invalid) throw new Error(`invalid bot event: ${invalid[0]}`);
30
+ return value;
31
+ }
32
+
33
+ export function botEvent({ source, repository, kind, ts, data }) {
34
+ return assertBotEvent({ protocol: BOT_EVENT_PROTOCOL, source, repository, kind, ts, data });
35
+ }
@@ -0,0 +1,73 @@
1
+ // GitHub event filter of the events Worker. The Worker entry can export only handlers (workerd),
2
+ // so the rules live in this module.
3
+
4
+ // The comment headers of assets/skills/repo-harness-issue-flow/references/templates.md.
5
+ export const PROTOCOL_HEADERS = [
6
+ 'repo-harness issue claim', 'repo-harness issue claim status', 'repo-harness boundary question',
7
+ 'repo-harness scope change', 'repo-harness decision', 'repo-harness plan', 'repo-harness handoff',
8
+ 'repo-harness acceptance claim', 'repo-harness acceptance record', 'repo-harness review reply',
9
+ 'repo-harness unblocked', 'repo-harness integration status',
10
+ ];
11
+ export const REQUIRED_CHECK = 'Required / CI';
12
+
13
+ function pullRequest(payload) {
14
+ const pull = payload.pull_request;
15
+ return { number: pull.number, url: pull.html_url, head_sha: pull.head.sha };
16
+ }
17
+
18
+ const protocolHeader = (body) => {
19
+ const header = (body ?? '').split(/\r?\n/, 1)[0].trim();
20
+ return PROTOCOL_HEADERS.includes(header) ? header : null;
21
+ };
22
+
23
+ // One GitHub delivery gives one bot event or null. `debounce` names the PR whose later pushes replace this one.
24
+ export function classify(name, payload, orchestratorLogin) {
25
+ const action = payload.action;
26
+ // GitHub logins are case-insensitive. The orchestrator must not wake itself with its own issues, comments or reviews.
27
+ const byOrchestrator = payload.sender?.login?.toLowerCase() === orchestratorLogin.toLowerCase();
28
+ switch (name) {
29
+ case 'issue_comment': {
30
+ const header = action === 'created' && !byOrchestrator ? protocolHeader(payload.comment.body) : null;
31
+ return header && { kind: 'issue.comment', data: { number: payload.issue.number, url: payload.comment.html_url, header } };
32
+ }
33
+ case 'issues':
34
+ if (action !== 'opened' || byOrchestrator) return null;
35
+ return { kind: payload.issue.title.startsWith('[CI repair]') ? 'issue.ci_repair' : 'issue.opened',
36
+ data: { number: payload.issue.number, url: payload.issue.html_url } };
37
+ case 'pull_request_review': {
38
+ const review = payload.review;
39
+ // GitHub wraps each single review comment and thread reply in an empty `commented` review; those arrive as review comments.
40
+ if (action !== 'submitted' || byOrchestrator || (review.state.toLowerCase() === 'commented' && !review.body)) return null;
41
+ return { kind: 'pr.review', data: { ...pullRequest(payload), url: review.html_url } };
42
+ }
43
+ case 'pull_request_review_comment': {
44
+ if (action !== 'created' || byOrchestrator) return null;
45
+ const url = payload.comment.html_url;
46
+ if (!payload.comment.in_reply_to_id) return { kind: 'pr.review_thread', data: { ...pullRequest(payload), url } };
47
+ // A reply belongs to an existing thread. Only a protocol reply, such as `review reply`, is a notice.
48
+ const header = protocolHeader(payload.comment.body);
49
+ return header && { kind: 'pr.review_reply', data: { ...pullRequest(payload), url, header } };
50
+ }
51
+ case 'pull_request':
52
+ if (action === 'closed') return { kind: payload.pull_request.merged ? 'pr.merged' : 'pr.closed', data: pullRequest(payload) };
53
+ if (action === 'synchronize') {
54
+ return { kind: 'pr.pushed', data: pullRequest(payload), debounce: `pr:${payload.repository.id}:${payload.pull_request.number}` };
55
+ }
56
+ return null;
57
+ case 'check_run': {
58
+ const run = payload.check_run;
59
+ // The job runs only for pull requests; other runs report it as skipped. The other jobs of a run are dropped.
60
+ if (action !== 'completed' || run.name !== REQUIRED_CHECK || run.conclusion === 'skipped') return null;
61
+ return { kind: 'ci.pr', data: { pull_requests: run.pull_requests.map((pull) => pull.number), url: run.html_url,
62
+ head_sha: run.head_sha, conclusion: run.conclusion } };
63
+ }
64
+ case 'workflow_run': {
65
+ const run = payload.workflow_run;
66
+ // `Required / CI` does not run on push. A cancelled run has no result.
67
+ if (action !== 'completed' || run.event !== 'push' || run.head_branch !== payload.repository.default_branch || run.conclusion === 'cancelled') return null;
68
+ return { kind: 'ci.main', data: { branch: run.head_branch, workflow: run.name, url: run.html_url, head_sha: run.head_sha, conclusion: run.conclusion } };
69
+ }
70
+ default:
71
+ return null;
72
+ }
73
+ }
@@ -0,0 +1,91 @@
1
+ // GitHub App webhook receiver. It filters GitHub events in code and sends a short bot event
2
+ // to the Bot routine webhook. It never calls a GitHub API and makes no decision.
3
+ // `repo-harness events install` stages this directory, and wrangler bundles it.
4
+ import { botEvent } from './bot-event.mjs';
5
+ import { classify } from './filter.mjs';
6
+
7
+ const DEBOUNCE_SECONDS = 60;
8
+ const DELIVERY_TTL_SECONDS = 7 * 24 * 60 * 60;
9
+ const MARK_TTL_SECONDS = 24 * 60 * 60;
10
+ const MAX_BODY_BYTES = 1024 * 1024;
11
+ const SEND_TIMEOUT_MS = 5_000;
12
+ const DELIVERY_PATTERN = /^[\w-]{1,128}$/;
13
+ const encoder = new TextEncoder();
14
+
15
+ function hexBytes(hex) {
16
+ const bytes = new Uint8Array(hex.length / 2);
17
+ for (let index = 0; index < bytes.length; index++) bytes[index] = parseInt(hex.slice(index * 2, index * 2 + 2), 16);
18
+ return bytes;
19
+ }
20
+
21
+ async function signatureValid(secret, header, body) {
22
+ const match = /^sha256=([0-9a-f]{64})$/.exec(header ?? '');
23
+ if (!match) return false;
24
+ const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);
25
+ return crypto.subtle.verify('HMAC', key, hexBytes(match[1]), body);
26
+ }
27
+
28
+ async function sendToBot(env, event) {
29
+ const response = await fetch(env.BOT_WEBHOOK_URL, {
30
+ method: 'POST', redirect: 'manual', signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
31
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${env.BOT_WEBHOOK_KEY}`, 'x-webhook-key': env.BOT_WEBHOOK_KEY },
32
+ body: JSON.stringify(event),
33
+ });
34
+ if (!response.ok) throw new Error(`Bot webhook returned HTTP ${response.status}.`);
35
+ }
36
+
37
+ // KV is eventually consistent between locations. A stale read can repeat an event; it never drops one.
38
+ const wasSent = async (env, delivery) => await env.EVENTS_STATE.get(`delivery:${delivery}`) !== null;
39
+
40
+ async function deliver(env, { delivery, event, debounce, at }) {
41
+ if (await wasSent(env, delivery)) return 'duplicate';
42
+ if (debounce && Number(await env.EVENTS_STATE.get(debounce)) > at) return 'superseded';
43
+ await sendToBot(env, event);
44
+ // The Bot has the event. A failed mark write must not make the caller send it again.
45
+ try { await env.EVENTS_STATE.put(`delivery:${delivery}`, '1', { expirationTtl: DELIVERY_TTL_SECONDS }); }
46
+ catch { console.error(`Delivery ${delivery} was sent, but its dedupe mark was not written.`); }
47
+ return 'sent';
48
+ }
49
+
50
+ const reply = (status, text) => new Response(text, { status });
51
+
52
+ export default {
53
+ async fetch(request, env) {
54
+ if (!env.GITHUB_WEBHOOK_SECRET || !env.BOT_WEBHOOK_URL || !env.BOT_WEBHOOK_KEY || !env.ORCHESTRATOR_LOGIN) return reply(500, 'Worker config is missing.');
55
+ if (request.method !== 'POST') return reply(405, 'POST only.');
56
+ const body = await request.arrayBuffer();
57
+ if (body.byteLength > MAX_BODY_BYTES) return reply(413, 'Payload is too large.');
58
+ if (!await signatureValid(env.GITHUB_WEBHOOK_SECRET, request.headers.get('x-hub-signature-256'), body)) return reply(401, 'Invalid signature.');
59
+ const delivery = request.headers.get('x-github-delivery') ?? '';
60
+ const name = request.headers.get('x-github-event') ?? '';
61
+ if (!DELIVERY_PATTERN.test(delivery) || !name) return reply(400, 'Missing GitHub delivery headers.');
62
+ let payload;
63
+ try { payload = JSON.parse(new TextDecoder().decode(body)); } catch { return reply(400, 'Invalid JSON.'); }
64
+ const match = classify(name, payload, env.ORCHESTRATOR_LOGIN);
65
+ if (!match) return reply(204, null);
66
+ const at = Date.now();
67
+ const event = botEvent({ source: 'github', repository: payload.repository.name, kind: match.kind, ts: new Date(at).toISOString(), data: match.data });
68
+ if (match.debounce) {
69
+ if (await wasSent(env, delivery)) return reply(200, 'duplicate');
70
+ // Each push moves the PR mark forward. The queued copy sends only when no later push arrived.
71
+ // Queue first: a failed mark write then repeats the older push instead of dropping this one.
72
+ await env.EVENTS_QUEUE.send({ delivery, at, event, debounce: match.debounce }, { delaySeconds: DEBOUNCE_SECONDS });
73
+ await env.EVENTS_STATE.put(match.debounce, String(at), { expirationTtl: MARK_TTL_SECONDS });
74
+ return reply(202, 'queued');
75
+ }
76
+ try {
77
+ return reply(200, await deliver(env, { delivery, at, event }));
78
+ } catch {
79
+ // GitHub records the failed delivery for a redelivery, and the queue retries it now.
80
+ await env.EVENTS_QUEUE.send({ delivery, at, event });
81
+ return reply(502, 'Bot delivery failed.');
82
+ }
83
+ },
84
+
85
+ async queue(batch, env) {
86
+ for (const message of batch.messages) {
87
+ try { await deliver(env, message.body); message.ack(); }
88
+ catch { message.retry(); }
89
+ }
90
+ },
91
+ };
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "repo-harness-github-events",
3
+ "main": "worker.mjs",
4
+ "compatibility_date": "2025-09-01",
5
+ "workers_dev": true,
6
+ "kv_namespaces": [{ "binding": "EVENTS_STATE" }],
7
+ "queues": {
8
+ "producers": [{ "binding": "EVENTS_QUEUE", "queue": "repo-harness-github-events" }],
9
+ "consumers": [{ "queue": "repo-harness-github-events", "max_retries": 10, "retry_delay": 60 }]
10
+ }
11
+ }
@@ -9,7 +9,7 @@
9
9
  2. Open a branch; isolate a worktree when concurrent edits overlap. Preserve unrelated work.
10
10
  3. Make small, bounded commits. Ordinary tasks live in the PR description: goal, changes, verification, risk and rollback.
11
11
  4. Freeze the candidate and verify once: typecheck plus affected tests. Reviewers and closeout consume the same evidence. Reopen acceptance only for blocking defects or changed inputs that affect the result. Record non-blocking improvements separately; do not change the frozen candidate for them.
12
- 5. A model may squash-merge into main only when the current task explicitly authorizes main publication, the branch contains the current main tip, the required checks pass on that exact head, and GitHub has no outstanding change requests or unresolved review threads. An explicit no-merge instruction always wins. The next merge does not wait for the main push CI of the previous merge. Pending main push CI is not an extra acceptance gate. Read its status before the next merge; when it fails, the next merge is the revert or the fix. Each PR still meets its own exact-head and current-main requirements. Record the GitHub merge SHA and parent SHA. Record `git revert --no-edit <squash-commit>`. Do not create rollback tags.
12
+ 5. A model may squash-merge into main only when the current task explicitly authorizes main publication, the branch contains the current main tip, the required checks pass on that exact head, and GitHub has no outstanding change requests or unresolved review threads that a person started. A thread that a review bot (a GitHub App account such as Codex or Copilot) started is advisory and does not block the merge. An explicit no-merge instruction always wins. The next merge does not wait for the main push CI of the previous merge. Pending main push CI is not an extra acceptance gate. Read its status before the next merge; when it fails, the next merge is the revert or the fix. Each PR still meets its own exact-head and current-main requirements. Record the GitHub merge SHA and parent SHA. Record `git revert --no-edit <squash-commit>`. Do not create rollback tags.
13
13
  6. Run the full suite daily, automatically open a repair task on failure, and produce the daily merge/check/rollback report. Run the [Lessons Retro](#lessons-retro) in the same nightly window.
14
14
  7. Use the [Report SOP](#report-sop) for formal progress, phase and final reports to the user, including the daily user summary. Raw automated CI reports are evidence inputs; they do not replace that summary and do not require this format.
15
15
 
@@ -93,7 +93,7 @@ An internal PR uses Daily Flow step 5 and the main-merge boundary in [Four opera
93
93
  An external PR never uses the internal flow. A worker produces the ready-for-GO bundle from `references/pr-verification.md`, whose hazard scan uses the [change hazard list](#change-hazards). The PR merges only after automated checks pass and the repository owner gives an explicit GO for the reviewed head SHA. Merge with `gh pr merge <pr> --squash --match-head-commit <reviewed-sha>`. A new head SHA needs a new bundle and a new GO.
94
94
 
95
95
  ## Four operation boundaries
96
- - Main merge requires explicit current-task authorization, current automated checks, no outstanding change requests or unresolved review threads, exact head/base and conflict safety.
96
+ - Main merge requires explicit current-task authorization, current automated checks, no outstanding change requests or unresolved review threads that a person started, exact head/base and conflict safety.
97
97
  - Only merged, clean, inactive worktrees/branches may be deleted automatically; other deletion requires the user.
98
98
  - Credentials, permissions, sandbox/write grants and confirmation-bypass settings require user approval of the exact change.
99
99
  - Release and production effects require user approval of the exact artifact and operation.
@@ -104,8 +104,8 @@ breakdown, dispatch, follow-up and evidence-based reports. Coding agents own
104
104
  source edits, tests and repairs. Follow the shared PM boundary in the
105
105
  `repo-harness` Skill for the permitted tool surface and reporting duties.
106
106
  Keep direct development sessions and explicitly assigned coding workers outside
107
- that PM restriction. OAR owns coding-agent execution. Herdr owns panes and
108
- visibility. A new Bot host adapts to that path; it does not add a new coding
107
+ that PM restriction. OAR owns coding-agent execution. herdr-core (`hc`) owns
108
+ terminals, and Herdr.app owns panes and visibility. A new Bot host adapts to that path; it does not add a new coding
109
109
  runtime or task authority.
110
110
 
111
111
  The `orchestrator` fleet role is the long-lived coordinator and integrator seat
@@ -138,6 +138,10 @@ The diff sets the tier. The author does not: a human change and a model change w
138
138
 
139
139
  Review follows the `repo-harness-issue-flow` skill, [references/acceptor.md](../../assets/skills/repo-harness-issue-flow/references/acceptor.md). The tier selects the depth: no independent review for Low, one fresh-context review for Medium, and the gatekeeper plus one cross-model review for High, one round each. The Acceptor SOP owns the round, findings and publish steps.
140
140
 
141
+ Low accept-seat skip: a Low PR whose `Required / CI` is SUCCESS on the PR head and whose PR body holds the author verification evidence (the commands and their outcomes) takes no accept seat and no acceptance record. Do not dispatch a Codex, Herdr or OAR accept seat for it. `Required / CI` and that evidence are the proof surface. A Low PR that lacks either condition is not eligible to merge until both hold. Medium and High keep the full Acceptor SOP.
142
+
143
+ Worked example (docs-only Low path): the PR edits `docs/bot-onboarding.md` only. The author runs one check command and records the command and its outcome (exit 0) in the PR body. `Required / CI` is SUCCESS on the PR head. The PR needs no reviewer, and it is eligible to merge with no accept seat and no acceptance record.
144
+
141
145
  Rules for every tier:
142
146
  - The reviewer reads the current diff only. A defect in code the diff did not touch is a non-blocking note; open an issue for it, do not add a finding.
143
147
  - From the second round, the reviewer reads only the hunks that changed after the previous round. The three-round limit stays.
@@ -145,6 +149,7 @@ Rules for every tier:
145
149
  - A low tier adds no review. A new test file or a rebase does not raise the tier.
146
150
  - Changing implementation and test assertions together does not raise the tier. Within the tier's existing review, check whether assertions preserve the intended behavior and whether removed or weakened coverage has a valid requirement-based reason. At Low, the author performs this check in self-review. Record the reason for each assertion change in the PR; never change assertions only to make a test pass. Do not dispatch a separate test-review gate.
147
151
  - A parent, coordinator or merge session reuses recorded acceptance when the reviewed diff, relevant base context, verification inputs and environment still match, and the review meets the current tier. The PR records the reviewed revision or diff, commands, results and finding dispositions. A change of session or reviewer is not a reason to repeat acceptance.
152
+ - A batch integration PR (`repo-harness-issue-flow`, [references/orchestrator.md](../../assets/skills/repo-harness-issue-flow/references/orchestrator.md) §9.3) reuses the acceptance record of each member when every member merged without conflict and the batch adds no commit of its own. It needs no new review round. A Low member has no acceptance record to reuse. Required checks on the batch head still apply.
148
153
  - After a change, verify the affected behavior and review the changed hunks with their affected context. Retain valid evidence for unchanged scope; add only missing tier coverage. A rebase alone does not require a new full review, but changed base behavior or conflict resolution can invalidate affected evidence. Reuse never substitutes for required checks on the current head or the current-main merge requirement.
149
154
  - A downstream repository maps its own release surfaces, for example public API, wire format, DDL/SQL and permissions, to the High tier.
150
155
 
@@ -131,7 +131,7 @@ then `repo-harness uninstall --recover-interrupted` to apply it. This explicit
131
131
  recovery restores the recorded fragments even if they were edited after interruption;
132
132
  sibling fields remain. The target must include every affected host.
133
133
 
134
- Package-manager globals, the official Codex plugin, independent MCP setup/workspaces,
134
+ Package-manager globals, the official Codex plugin, the MCP config,
135
135
  archives and runtime history remain. Repository unadoption and package removal are
136
136
  separate operations; this command does not enumerate other repositories or remove
137
137
  third-party packages. Remove the CLI package only after configuration cleanup.
@@ -308,31 +308,18 @@ updates skills.
308
308
 
309
309
  ### Waza
310
310
 
311
- Both hosts:
311
+ Every host uses one command. The `codex` agent writes the staging copy in
312
+ `~/.agents/skills`:
312
313
 
313
314
  ```bash
314
- bunx skills add tw93/Waza -g -a claude-code codex -s think hunt check health -y
315
+ bunx skills add tw93/Waza -g -a codex -s think hunt check health -y
315
316
  ```
316
317
 
317
- Single host:
318
-
319
- ```bash
320
- bunx skills add tw93/Waza -g -a claude-code -s think hunt check health -y
321
- ```
318
+ Then `repo-harness install` links the host skill roots to the staging copy.
322
319
 
323
- Replace `claude-code` with `codex` when installing for Codex only.
324
-
325
- After installing or updating through the skills CLI, verify Codex has its own
326
- runtime copy:
320
+ Verify that the Codex skills and shared rules match the staging copy:
327
321
 
328
322
  ```bash
329
- for d in think hunt check health; do
330
- rsync -a --delete ~/.agents/skills/$d/ ~/.codex/skills/$d/
331
- done
332
- mkdir -p ~/.codex/rules
333
- for f in anti-patterns.md chinese.md durable-context.md english.md; do
334
- cp ~/.agents/rules/$f ~/.codex/rules/$f
335
- done
336
323
  for d in think hunt check health; do
337
324
  diff -qr ~/.agents/skills/$d ~/.codex/skills/$d
338
325
  done
@@ -387,42 +374,47 @@ boundary explicit:
387
374
 
388
375
  | Capability | Owner | Required for |
389
376
  |---|---|---|
390
- | `herdr` | user install (herdr.dev) | required at the version pinned in `.ai/harness/policy.json#external_tooling.herdr`; peer terminals and persistent task reviewer hosting |
377
+ | `herdr_core` (`hc`) | user install (Herdr.app or a herdr-core release) | required, at least the version pinned in `.ai/harness/policy.json#external_tooling.herdr_core`; persistent agent terminals, task sessions, review hosting and the notify relay |
391
378
  | `bun` | repo-harness | repo-harness-owned global installs, local dependency install, tests, and runtime execution |
392
379
  | `bash` | repo-harness | helper scripts, migration, setup checks, and contract verification wrappers; Git-for-Windows Bash is the Windows platform contract |
393
380
  | `npm` | npm registry | registry readbacks, publish gates, and opt-in update checks; not repo-harness-owned global install repair |
394
381
  | `npx` / `skills_cli` | external Skills CLI | Waza and Mermaid skill bootstrap/update commands |
395
- | `rsync` | platform filesystem | Waza staging-to-Codex sync and installed-copy runtime mirroring |
382
+ | `rsync` | platform filesystem | installed-copy runtime mirroring |
396
383
  | `symlink` | platform filesystem | link-mode aliases; copy mode is the fallback |
397
384
 
398
- `.ai/harness/policy.json#external_tooling.herdr` is the single herdr pin: it owns
399
- the `min_version` floor and the checksum-verified `release_assets` entry that CI
400
- installs. Install herdr through its official installer or platform package manager
401
- and verify `herdr --version` reports at least that pinned `min_version`.
402
- `check-agent-tooling.sh --strict-readiness` reads the same key and fails if herdr is
403
- missing, unusable, or older than the pin; `setup check` projects `runtime.herdr`. Repo-harness does not install it or edit user Herdr config.
385
+ `.ai/harness/policy.json#external_tooling.herdr_core` is the single herdr pin: it
386
+ owns the `min_version` floor and the checksum-verified `release_assets` entry that
387
+ CI installs. Install hc through Herdr.app or a herdr-core release and verify
388
+ `hc --version` reports at least that pinned `min_version`.
389
+ `check-agent-tooling.sh --strict-readiness` reads the same key and fails if hc is
390
+ missing, unusable, or older than the pin. A missing or malformed pin is a
391
+ `configuration-error`. `setup check` projects `runtime.herdr_core`. Repo-harness
392
+ does not install hc or edit user Herdr config. Herdr.app is not a readiness
393
+ requirement: it has no Intel macOS build.
404
394
  The root `repo-harness` skill requires the `herdr` skill on Codex and Claude.
405
- `repo-harness install` and `repo-harness update` combine the CLI reference from
406
- `herdr --skill` with the caller-context policy in
407
- `assets/reference-configs/herdr-skill-context.md`. The shared renderer replaces
408
- the binary's introductory environment gate and rejects an unknown section layout.
409
- Both hosts receive the same generated skill. When Codex is selected, an existing
395
+ `repo-harness install` and `repo-harness update` put the caller-context policy in
396
+ `assets/reference-configs/herdr-skill-context.md` before the hc manual from
397
+ `hc --skill`. The shared renderer keeps the manual verbatim and rejects output
398
+ that is not the hc manual. Both hosts receive the same generated skill. When Codex is selected, an existing
410
399
  shared copy at `~/.agents/skills/herdr` is also updated and checked because Codex
411
400
  can discover it. Claude-only operations leave that shared copy unchanged.
412
401
  Install refuses to replace a
413
402
  user-edited or unowned copy. Strict readiness compares against the same renderer.
414
403
  Missing tool environment variables do not prove that the user is outside Herdr.
415
- Read-only discovery lists running sessions and panes by the task's exact path.
416
- Reuse a suitable task reviewer or create a new pane in the matched workspace.
404
+ Read-only discovery lists live hc terminals (`hc ls --json`) by the task's exact path.
405
+ Reuse a suitable task reviewer or start a new terminal at the task path.
417
406
  Path matching selects a location; it does not transfer another agent's task.
418
- Use explicit session and pane IDs for control after discovery.
407
+ Use explicit hc terminal addresses for control after discovery.
419
408
  The persistent reviewer still requires POSIX process groups: use macOS/Linux or
420
409
  WSL. Native Windows review lifecycle support is not implied by Herdr support.
421
- Admitted task sessions start only in a Herdr pane, so they and their Task Inbox and operator diff consumers are POSIX-only; on Windows, session start fails closed with `herdr_endpoint_platform_unsupported`.
410
+ Admitted task sessions start only in an hc terminal, so they and their Task Inbox and operator diff consumers are POSIX-only.
422
411
  Drain old tmux reviewers with the previous repo-harness version before upgrading.
423
- Rebind endpoints explicitly as `herdr-cli-agent`; old adapter policy, capabilities
424
- and live session metadata are not translated. The self-host runtime remains off.
425
412
  No runtime or collaboration path automatically falls back to tmux.
413
+
414
+ herdr-core (`hc`) has persistent terminals and a JSON-RPC API, and it has
415
+ built-in remote host access (`hc machine`, `hc run --on <machine>`). It has no
416
+ sessions, panes, workspaces or plugins. Doctor has no Herdr Pi integration
417
+ check: Pi reports its terminal status to hc natively.
426
418
  The native protected-helper tool contract below remains a separate boundary.
427
419
 
428
420
  The policy is Bun-first, not Bun-only. Repo-harness-owned install/repair commands
@@ -676,13 +668,7 @@ boundary for untrusted repositories.
676
668
 
677
669
  ```bash
678
670
  bunx skills update
679
- for d in think hunt check health; do
680
- rsync -a --delete ~/.agents/skills/$d/ ~/.codex/skills/$d/
681
- done
682
- mkdir -p ~/.codex/rules
683
- for f in anti-patterns.md chinese.md durable-context.md english.md; do
684
- cp ~/.agents/rules/$f ~/.codex/rules/$f
685
- done
671
+ repo-harness install
686
672
  for d in think hunt check health; do
687
673
  diff -qr ~/.agents/skills/$d ~/.codex/skills/$d
688
674
  done
@@ -726,7 +712,7 @@ network fetch. The managed list is `explorer`, `deep-reasoner`, `fast-worker`,
726
712
  `~/.codex/agents/orchestrator.toml`, and the checker does not expect one.
727
713
  Start it as a long-lived session with `claude --agent orchestrator`. It is
728
714
  the coordinator and integrator seat of `repo-harness-issue-flow`
729
- (`opus/xhigh`, read-only tools plus `gh` and `herdr agent prompt`). It has no
715
+ (`opus/xhigh`, read-only tools plus `gh` and `hc send`). It has no
730
716
  Codex target because a Codex fleet TOML runs in a read-only sandbox without
731
717
  network access, which cannot run `gh`.
732
718