@bolloon/bolloon-agent 0.1.0

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 (808) hide show
  1. package/README.md +462 -0
  2. package/dist/agents/constraint-layer.js +211 -0
  3. package/dist/agents/constraint-layer.js.map +1 -0
  4. package/dist/agents/pi-sdk.js +1199 -0
  5. package/dist/agents/pi-sdk.js.map +1 -0
  6. package/dist/agents/protocol.js +229 -0
  7. package/dist/agents/subagent-manager.js +361 -0
  8. package/dist/agents/workflow-engine.js +222 -0
  9. package/dist/agents/workflow-engine.js.map +1 -0
  10. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.d.ts +48 -0
  11. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.js +261 -0
  12. package/dist/bollharness-integration/bollharness-integration/context-router.d.ts +110 -0
  13. package/dist/bollharness-integration/bollharness-integration/context-router.js +542 -0
  14. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.d.ts +87 -0
  15. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.js +231 -0
  16. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.d.ts +30 -0
  17. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.js +91 -0
  18. package/dist/bollharness-integration/bollharness-integration/guard-checker.d.ts +105 -0
  19. package/dist/bollharness-integration/bollharness-integration/guard-checker.js +353 -0
  20. package/dist/bollharness-integration/bollharness-integration/index.d.ts +66 -0
  21. package/dist/bollharness-integration/bollharness-integration/index.js +32 -0
  22. package/dist/bollharness-integration/bollharness-integration/integration.d.ts +219 -0
  23. package/dist/bollharness-integration/bollharness-integration/integration.js +420 -0
  24. package/dist/bollharness-integration/bollharness-integration/skill-adapter.d.ts +151 -0
  25. package/dist/bollharness-integration/bollharness-integration/skill-adapter.js +518 -0
  26. package/dist/bollharness-integration/context-router-judgment.js +269 -0
  27. package/dist/bollharness-integration/context-router-judgment.js.map +1 -0
  28. package/dist/bollharness-integration/context-router.js +584 -0
  29. package/dist/bollharness-integration/context-router.js.map +1 -0
  30. package/dist/bollharness-integration/gate-state-machine.js +349 -0
  31. package/dist/bollharness-integration/gate-state-machine.js.map +1 -0
  32. package/dist/bollharness-integration/gate-transition-hooks.js +136 -0
  33. package/dist/bollharness-integration/gate-transition-hooks.js.map +1 -0
  34. package/dist/bollharness-integration/guard-checker.js +400 -0
  35. package/dist/bollharness-integration/guard-checker.js.map +1 -0
  36. package/dist/bollharness-integration/index.js +142 -0
  37. package/dist/bollharness-integration/index.js.map +1 -0
  38. package/dist/bollharness-integration/integration.js +427 -0
  39. package/dist/bollharness-integration/integration.js.map +1 -0
  40. package/dist/bollharness-integration/llm/pi-ai.d.ts +60 -0
  41. package/dist/bollharness-integration/llm/pi-ai.js +397 -0
  42. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +153 -0
  43. package/dist/bollharness-integration/pi-ecosystem-colony/index.js +365 -0
  44. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +136 -0
  45. package/dist/bollharness-integration/pi-ecosystem-goals/index.js +458 -0
  46. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +117 -0
  47. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.js +300 -0
  48. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +78 -0
  49. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.js +291 -0
  50. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +139 -0
  51. package/dist/bollharness-integration/pi-ecosystem-judgment/index.js +445 -0
  52. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +127 -0
  53. package/dist/bollharness-integration/pi-ecosystem-mcp/index.js +331 -0
  54. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +95 -0
  55. package/dist/bollharness-integration/pi-ecosystem-subagents/index.js +303 -0
  56. package/dist/bollharness-integration/skill-adapter.js +564 -0
  57. package/dist/bollharness-integration/skill-adapter.js.map +1 -0
  58. package/dist/cli/interface.js +181 -0
  59. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  60. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  61. package/dist/constraint-runtime/src/agent/index.js +1 -0
  62. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  63. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  64. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  65. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  66. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  67. package/dist/constraint-runtime/src/cli/index.js +12 -0
  68. package/dist/constraint-runtime/src/command_graph.js +10 -0
  69. package/dist/constraint-runtime/src/commands.js +50 -0
  70. package/dist/constraint-runtime/src/components/index.js +12 -0
  71. package/dist/constraint-runtime/src/constants/index.js +12 -0
  72. package/dist/constraint-runtime/src/constraint/budget.js +27 -0
  73. package/dist/constraint-runtime/src/constraint/budget.js.map +1 -0
  74. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  75. package/dist/constraint-runtime/src/constraint/permission.js +25 -0
  76. package/dist/constraint-runtime/src/constraint/permission.js.map +1 -0
  77. package/dist/constraint-runtime/src/context.js +30 -0
  78. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  79. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  80. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  81. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  82. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  83. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  84. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  85. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  86. package/dist/constraint-runtime/src/history.js +9 -0
  87. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  88. package/dist/constraint-runtime/src/index.js +26 -0
  89. package/dist/constraint-runtime/src/ink.js +4 -0
  90. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  91. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  92. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  93. package/dist/constraint-runtime/src/models.js +3 -0
  94. package/dist/constraint-runtime/src/models.js.map +1 -0
  95. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  96. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  97. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  98. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  99. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  100. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  101. package/dist/constraint-runtime/src/prefetch.js +9 -0
  102. package/dist/constraint-runtime/src/query.js +1 -0
  103. package/dist/constraint-runtime/src/remote/index.js +12 -0
  104. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  105. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  106. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  107. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  108. package/dist/constraint-runtime/src/screens/index.js +12 -0
  109. package/dist/constraint-runtime/src/server/index.js +12 -0
  110. package/dist/constraint-runtime/src/services/index.js +12 -0
  111. package/dist/constraint-runtime/src/session_store.js +22 -0
  112. package/dist/constraint-runtime/src/setup.js +30 -0
  113. package/dist/constraint-runtime/src/skills/index.js +1 -0
  114. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  115. package/dist/constraint-runtime/src/state/index.js +12 -0
  116. package/dist/constraint-runtime/src/system_init.js +20 -0
  117. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  118. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  119. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  120. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  121. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  122. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  123. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +6 -0
  124. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +6 -0
  125. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +5 -0
  126. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +6 -0
  127. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +4 -0
  128. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  129. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  130. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +6 -0
  131. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  132. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  133. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  134. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  135. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +29 -0
  136. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +10 -0
  137. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +13 -0
  138. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +22 -0
  139. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +25 -0
  140. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +10 -0
  141. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +25 -0
  142. package/dist/constraint-runtime/src/tools.js +70 -0
  143. package/dist/constraint-runtime/src/transcript.js +19 -0
  144. package/dist/constraint-runtime/src/types/index.js +12 -0
  145. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  146. package/dist/constraint-runtime/src/utils/index.js +12 -0
  147. package/dist/constraint-runtime/src/vim/index.js +12 -0
  148. package/dist/constraint-runtime/src/voice/index.js +12 -0
  149. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  150. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  151. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  152. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  153. package/dist/constraints/commands.js +100 -0
  154. package/dist/constraints/index.js +11 -0
  155. package/dist/constraints/index.js.map +1 -0
  156. package/dist/constraints/permissions.js +37 -0
  157. package/dist/constraints/runtime.js +135 -0
  158. package/dist/constraints/session.js +48 -0
  159. package/dist/constraints/system-init.js +51 -0
  160. package/dist/constraints/tools.js +104 -0
  161. package/dist/documents/reader.js +104 -0
  162. package/dist/documents/reader.js.map +1 -0
  163. package/dist/electron-preload.js +15 -0
  164. package/dist/electron-preload.js.map +1 -0
  165. package/dist/electron.js +206 -0
  166. package/dist/electron.js.map +1 -0
  167. package/dist/index.js +1053 -0
  168. package/dist/llm/config-store.js +301 -0
  169. package/dist/llm/config-store.js.map +1 -0
  170. package/dist/llm/minimax-provider.js +46 -0
  171. package/dist/llm/minimax.js +45 -0
  172. package/dist/llm/pi-ai.js +471 -0
  173. package/dist/llm/pi-ai.js.map +1 -0
  174. package/dist/network/agent-network.js +692 -0
  175. package/dist/network/agent-network.js.map +1 -0
  176. package/dist/network/iroh-integration.js +117 -0
  177. package/dist/network/iroh-integration.js.map +1 -0
  178. package/dist/network/iroh-transport.js +506 -0
  179. package/dist/network/iroh-transport.js.map +1 -0
  180. package/dist/network/p2p.js +864 -0
  181. package/dist/network/p2p.js.map +1 -0
  182. package/dist/network/storage/adapters/json-adapter.js +401 -0
  183. package/dist/network/storage/adapters/json-adapter.js.map +1 -0
  184. package/dist/pi-ecosystem-colony/index.js +426 -0
  185. package/dist/pi-ecosystem-colony/index.js.map +1 -0
  186. package/dist/pi-ecosystem-goals/index.js +512 -0
  187. package/dist/pi-ecosystem-goals/index.js.map +1 -0
  188. package/dist/pi-ecosystem-judgment/decision.js +318 -0
  189. package/dist/pi-ecosystem-judgment/decision.js.map +1 -0
  190. package/dist/pi-ecosystem-judgment/distillation.js +304 -0
  191. package/dist/pi-ecosystem-judgment/distillation.js.map +1 -0
  192. package/dist/pi-ecosystem-judgment/human-value-store.js +463 -0
  193. package/dist/pi-ecosystem-judgment/human-value-store.js.map +1 -0
  194. package/dist/pi-ecosystem-judgment/index.js +581 -0
  195. package/dist/pi-ecosystem-judgment/index.js.map +1 -0
  196. package/dist/pi-ecosystem-judgment/value-injection.js +592 -0
  197. package/dist/pi-ecosystem-judgment/value-injection.js.map +1 -0
  198. package/dist/pi-ecosystem-mcp/index.js +385 -0
  199. package/dist/pi-ecosystem-mcp/index.js.map +1 -0
  200. package/dist/pi-ecosystem-subagents/index.js +352 -0
  201. package/dist/pi-ecosystem-subagents/index.js.map +1 -0
  202. package/dist/runtime/context/minimax-prompt.js +178 -0
  203. package/dist/runtime/context/sys-prompt.js +1 -0
  204. package/dist/social/ant-colony/AdaptiveHeartbeat.js +106 -0
  205. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +1 -0
  206. package/dist/social/ant-colony/PheromoneEngine.js +265 -0
  207. package/dist/social/ant-colony/PheromoneEngine.js.map +1 -0
  208. package/dist/social/ant-colony/types.js +28 -0
  209. package/dist/social/ant-colony/types.js.map +1 -0
  210. package/dist/social/channels/ChannelManager.js +444 -0
  211. package/dist/social/channels/ChannelManager.js.map +1 -0
  212. package/dist/social/channels/DiapChannelBridge.js +451 -0
  213. package/dist/social/channels/DiapChannelBridge.js.map +1 -0
  214. package/dist/social/channels/InterestMatcher.js +135 -0
  215. package/dist/social/channels/InterestMatcher.js.map +1 -0
  216. package/dist/social/channels/types.js +21 -0
  217. package/dist/social/channels/types.js.map +1 -0
  218. package/dist/social/global-shared-context.js +368 -0
  219. package/dist/social/global-shared-context.js.map +1 -0
  220. package/dist/social/heartbeat.js +865 -0
  221. package/dist/social/heartbeat.js.map +1 -0
  222. package/dist/test/constraint-layer.test.js +164 -0
  223. package/dist/test/global-shared-context.test.js +315 -0
  224. package/dist/test/pi-sdk.test.js +47 -0
  225. package/dist/test/set-persona.test.js +38 -0
  226. package/dist/test/subagent-manager.test.js +276 -0
  227. package/dist/test/workflow-engine.test.js +87 -0
  228. package/dist/web/api-config.html +265 -0
  229. package/dist/web/client.js +1401 -0
  230. package/dist/web/components/p2p/index.js +357 -0
  231. package/dist/web/components/p2p/p2p-connection.js +161 -0
  232. package/dist/web/components/p2p/p2p-identity.js +78 -0
  233. package/dist/web/components/p2p/p2p-manager.js +82 -0
  234. package/dist/web/components/p2p/p2p-messages.js +186 -0
  235. package/dist/web/components/p2p/p2p-store-memory.js +129 -0
  236. package/dist/web/components/p2p/types.js +23 -0
  237. package/dist/web/index.html +192 -0
  238. package/dist/web/server.js +1647 -0
  239. package/dist/web/server.js.map +1 -0
  240. package/dist/web/style.css +3260 -0
  241. package/dist/workflows/collaboration.js +374 -0
  242. package/dist/workflows/index.js +54 -0
  243. package/docs/agent-communication.md +333 -0
  244. package/docs/plans/2026-05-15-document-agent-design.md +479 -0
  245. package/docs/plans/2026-05-15-document-agent-implementation-plan.md +792 -0
  246. package/docs/plans/2026-05-16-chat-ui-design.md +86 -0
  247. package/docs/plans/2026-05-16-constraint-runtime-design.md +106 -0
  248. package/docs/plans/2026-05-16-constraint-runtime-implementation.md +441 -0
  249. package/docs//346/225/260/345/255/246/350/276/205/345/212/251/346/231/272/350/203/275/344/275/223-/346/240/270/345/277/203/346/225/210/346/236/234/345/256/232/344/271/211.md +287 -0
  250. package/package.json +121 -0
  251. package/scripts/build-web.ts +61 -0
  252. package/src/agents/constraint-layer.ts +309 -0
  253. package/src/agents/pi-sdk.ts +1591 -0
  254. package/src/agents/protocol.ts +304 -0
  255. package/src/agents/subagent-manager.ts +553 -0
  256. package/src/agents/workflow-engine.ts +332 -0
  257. package/src/bollharness/.boll/CLAUDE.md.template +34 -0
  258. package/src/bollharness/.boll/MANIFEST.yaml +213 -0
  259. package/src/bollharness/.boll/active-review-agents/.gitkeep +0 -0
  260. package/src/bollharness/.boll/agents/review-base.yaml +108 -0
  261. package/src/bollharness/.boll/deploy-allowlist.yaml +38 -0
  262. package/src/bollharness/.boll/inbox/schema/message-v1.json +99 -0
  263. package/src/bollharness/.boll/install-staging/.gitkeep +0 -0
  264. package/src/bollharness/.boll/issue-adapter.yaml +31 -0
  265. package/src/bollharness/.boll/plugins/boll-mode-toolkit/contracts/mode-contract.md +85 -0
  266. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  267. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  268. package/src/bollharness/.boll/rules/backend-routes.md +31 -0
  269. package/src/bollharness/.boll/rules/closure-semantics.md +30 -0
  270. package/src/bollharness/.boll/rules/env-vars.md +32 -0
  271. package/src/bollharness/.boll/rules/hanis-protocol.md +145 -0
  272. package/src/bollharness/.boll/rules/repo-structure.md +42 -0
  273. package/src/bollharness/.boll/rules/review-agent-isolation.md +73 -0
  274. package/src/bollharness/.boll/rules/source-of-truth.md +33 -0
  275. package/src/bollharness/.boll/settings.json +180 -0
  276. package/src/bollharness/.boll/settings.json.template +31 -0
  277. package/src/bollharness/.boll/skills/arch/SKILL.md +372 -0
  278. package/src/bollharness/.boll/skills/bug-pipeline/SKILL.md +168 -0
  279. package/src/bollharness/.boll/skills/bug-triage/SKILL.md +161 -0
  280. package/src/bollharness/.boll/skills/context-chains/SKILL.md +250 -0
  281. package/src/bollharness/.boll/skills/context-chains/context-chain-index.md +48 -0
  282. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/code_change_extractor.ts +142 -0
  283. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/debugging_extractor.ts +126 -0
  284. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/design_extractor.ts +148 -0
  285. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/planning_extractor.ts +162 -0
  286. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/question_extractor.ts +116 -0
  287. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/review_extractor.ts +136 -0
  288. package/src/bollharness/.boll/skills/crystal-learn/SKILL.md +93 -0
  289. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-0.md +34 -0
  290. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-1.md +34 -0
  291. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-2.md +35 -0
  292. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-3.md +34 -0
  293. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-4.md +43 -0
  294. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-5.md +34 -0
  295. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-6.md +37 -0
  296. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-7.md +46 -0
  297. package/src/bollharness/.boll/skills/guardian-fixer/PROMPT.md +415 -0
  298. package/src/bollharness/.boll/skills/guardian-fixer/SKILL.md +320 -0
  299. package/src/bollharness/.boll/skills/harness-dev/SKILL.md +93 -0
  300. package/src/bollharness/.boll/skills/harness-dev/examples/README.md +227 -0
  301. package/src/bollharness/.boll/skills/harness-dev-handoff/SKILL.md +165 -0
  302. package/src/bollharness/.boll/skills/harness-eng/SKILL.md +110 -0
  303. package/src/bollharness/.boll/skills/harness-eng-test/SKILL.md +79 -0
  304. package/src/bollharness/.boll/skills/harness-lab/SKILL.md +170 -0
  305. package/src/bollharness/.boll/skills/harness-ops/SKILL.md +57 -0
  306. package/src/bollharness/.boll/skills/harness-voice/SKILL.md +183 -0
  307. package/src/bollharness/.boll/skills/judgment/SKILL.md +115 -0
  308. package/src/bollharness/.boll/skills/lead/SKILL.md +245 -0
  309. package/src/bollharness/.boll/skills/lead/install-wow-harness.md +77 -0
  310. package/src/bollharness/.boll/skills/lead/ref-review-sop.md +91 -0
  311. package/src/bollharness/.boll/skills/lead/ref-stages.md +129 -0
  312. package/src/bollharness/.boll/skills/skill-discovery/SKILL.md +169 -0
  313. package/src/bollharness/.boll/skills/task-arch/SKILL.md +106 -0
  314. package/src/bollharness/.boll/skills/toolkit/SKILL.md +57 -0
  315. package/src/bollharness/.boll/tasks/.gitkeep +0 -0
  316. package/src/bollharness/.boll/toolkit-index.yaml +112 -0
  317. package/src/bollharness/.claude/agents/review-base.yaml +108 -0
  318. package/src/bollharness/.claude/plugins/boll-mode-toolkit/.claude-plugin/plugin.json +44 -0
  319. package/src/bollharness/.claude/plugins/boll-review-toolkit/.claude-plugin/plugin.json +24 -0
  320. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  321. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  322. package/src/bollharness/.claude/settings.json +157 -0
  323. package/src/bollharness/.claude/skills/arch/SKILL.md +64 -0
  324. package/src/bollharness/.claude/skills/crystal-learn/SKILL.md +93 -0
  325. package/src/bollharness/.claude/skills/guardian-fixer/PROMPT.md +44 -0
  326. package/src/bollharness/.claude/skills/guardian-fixer/SKILL.md +324 -0
  327. package/src/bollharness/.claude/skills/harness-dev/SKILL.md +93 -0
  328. package/src/bollharness/.claude/skills/harness-dev/examples/README.md +17 -0
  329. package/src/bollharness/.claude/skills/harness-dev-handoff/SKILL.md +165 -0
  330. package/src/bollharness/.claude/skills/harness-eng/SKILL.md +183 -0
  331. package/src/bollharness/.claude/skills/harness-eng-test/SKILL.md +57 -0
  332. package/src/bollharness/.claude/skills/harness-ops/SKILL.md +57 -0
  333. package/src/bollharness/.claude/skills/harness-voice/SKILL.md +84 -0
  334. package/src/bollharness/.claude/skills/lead/INDEX.md +28 -0
  335. package/src/bollharness/.claude/skills/lead/SKILL.md +24 -0
  336. package/src/bollharness/.claude/skills/lead/install-wow-harness.md +77 -0
  337. package/src/bollharness/.claude/skills/lead/ref-review-sop.md +48 -0
  338. package/src/bollharness/.claude/skills/lead/ref-stages.md +58 -0
  339. package/src/bollharness/.claude/skills/plan-lock/SKILL.md +74 -0
  340. package/src/bollharness/.claude/skills/skill-discovery/SKILL.md +120 -0
  341. package/src/bollharness/.claude/skills/task-arch/SKILL.md +106 -0
  342. package/src/bollharness/.claude/skills/toolkit/SKILL.md +57 -0
  343. package/src/bollharness/.claude/skills/toolkit/list.sh +92 -0
  344. package/src/bollharness/.githooks/pre-commit +21 -0
  345. package/src/bollharness/.github/workflows/ci.yml +88 -0
  346. package/src/bollharness/.sanitize-report.json +13 -0
  347. package/src/bollharness/CLAUDE.md +73 -0
  348. package/src/bollharness/LICENSE +21 -0
  349. package/src/bollharness/README.md +143 -0
  350. package/src/bollharness/README.zh-CN.md +131 -0
  351. package/src/bollharness/docs/decisions/ADR-030-guard-signal-protocol-and-governance-reload.md +1076 -0
  352. package/src/bollharness/docs/decisions/ADR-038-harness-optimization-strategy.md +2039 -0
  353. package/src/bollharness/docs/decisions/ADR-041-codex-claude-code-division-of-labor.md +128 -0
  354. package/src/bollharness/docs/decisions/ADR-H1-crystal-learn-revival.md +188 -0
  355. package/src/bollharness/docs/decisions/ADR-H2-identity-isolation.md +183 -0
  356. package/src/bollharness/docs/decisions/ADR-H3-memory-scope.md +133 -0
  357. package/src/bollharness/docs/decisions/ADR-H4-prompt-governance.md +146 -0
  358. package/src/bollharness/docs/decisions/ADR-H5-gate-quantization.md +212 -0
  359. package/src/bollharness/docs/decisions/ADR-H6-state-file-health.md +211 -0
  360. package/src/bollharness/docs/decisions/ADR-H8-issue-and-doc-compliance.md +202 -0
  361. package/src/bollharness/docs/decisions/ADR-H9-mailbox.md +231 -0
  362. package/src/bollharness/docs/decisions/PLAN-H1-crystal-learn-revival.md +270 -0
  363. package/src/bollharness/docs/decisions/PLAN-H2-identity-isolation.md +291 -0
  364. package/src/bollharness/docs/decisions/PLAN-H3-memory-scope.md +228 -0
  365. package/src/bollharness/docs/decisions/PLAN-H4-prompt-governance.md +227 -0
  366. package/src/bollharness/docs/decisions/PLAN-H5-gate-quantization.md +239 -0
  367. package/src/bollharness/docs/decisions/PLAN-H6-state-file-health.md +325 -0
  368. package/src/bollharness/docs/decisions/PLAN-H8-issue-and-doc-compliance.md +242 -0
  369. package/src/bollharness/docs/decisions/PLAN-H9-mailbox.md +378 -0
  370. package/src/bollharness/docs/launch-article-en.md +276 -0
  371. package/src/bollharness/docs/launch-article-zh.md +305 -0
  372. package/src/bollharness/docs/practice.html +356 -0
  373. package/src/bollharness/docs/practice.md +82 -0
  374. package/src/bollharness/docs/research/round-1/README.md +11 -0
  375. package/src/bollharness/docs/research/round-2/README.md +11 -0
  376. package/src/bollharness/docs/research/round-3/README.md +11 -0
  377. package/src/bollharness/docs/research/round-4/README.md +11 -0
  378. package/src/bollharness/docs/research/round-5/README.md +11 -0
  379. package/src/bollharness/docs/research/round-6/README.md +11 -0
  380. package/src/bollharness/package-lock.json +48 -0
  381. package/src/bollharness/package.json +20 -0
  382. package/src/bollharness/reference/SOURCE-COMMIT.txt +3 -0
  383. package/src/bollharness/reference/boll-reference/.claude/rules/backend-routes.md +268 -0
  384. package/src/bollharness/reference/boll-reference/.claude/rules/bridge.md +20 -0
  385. package/src/bollharness/reference/boll-reference/.claude/rules/closure-semantics.md +30 -0
  386. package/src/bollharness/reference/boll-reference/.claude/rules/coaching.md +13 -0
  387. package/src/bollharness/reference/boll-reference/.claude/rules/env-vars.md +50 -0
  388. package/src/bollharness/reference/boll-reference/.claude/rules/hackathon.md +12 -0
  389. package/src/bollharness/reference/boll-reference/.claude/rules/repo-structure.md +184 -0
  390. package/src/bollharness/reference/boll-reference/.claude/rules/review-agent-isolation.md +112 -0
  391. package/src/bollharness/reference/boll-reference/.claude/rules/scenes.md +12 -0
  392. package/src/bollharness/reference/boll-reference/.claude/skills/arch/SKILL.md +551 -0
  393. package/src/bollharness/reference/boll-reference/.claude/skills/boll-animation/SKILL.md +26 -0
  394. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/SKILL.md +227 -0
  395. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/agents/openai.yaml +4 -0
  396. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-failure-taxonomy.md +142 -0
  397. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-validation-ladder.md +107 -0
  398. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal/SKILL.md +893 -0
  399. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal-learn/SKILL.md +89 -0
  400. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/SKILL.md +93 -0
  401. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/examples/README.md +209 -0
  402. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev-handoff/SKILL.md +165 -0
  403. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng/SKILL.md +110 -0
  404. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-frontend/SKILL.md +203 -0
  405. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-hdc/SKILL.md +27 -0
  406. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-orchestrator/SKILL.md +28 -0
  407. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-prompt/SKILL.md +27 -0
  408. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-test/SKILL.md +79 -0
  409. package/src/bollharness/reference/boll-reference/.claude/skills/boll-lab/SKILL.md +372 -0
  410. package/src/bollharness/reference/boll-reference/.claude/skills/boll-run/SKILL.md +437 -0
  411. package/src/bollharness/reference/boll-reference/.claude/skills/boll-ux-appstore/SKILL.md +27 -0
  412. package/src/bollharness/reference/boll-reference/.claude/skills/boll-voice/SKILL.md +442 -0
  413. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/PROMPT.md +421 -0
  414. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/SKILL.md +326 -0
  415. package/src/bollharness/reference/boll-reference/.claude/skills/lead/SKILL.md +155 -0
  416. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-review-sop.md +91 -0
  417. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-stages.md +129 -0
  418. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-preview.png +0 -0
  419. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v2.png +0 -0
  420. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v3.png +0 -0
  421. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v4.png +0 -0
  422. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/SKILL.md +425 -0
  423. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-three-checks.md +62 -0
  424. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-wp-templates.md +78 -0
  425. package/src/bollharness/reference/boll-reference/.claude/skills/task-arch/SKILL.md +76 -0
  426. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/SKILL.md +57 -0
  427. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/beads-graph.sh +153 -0
  428. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/SKILL.md +52 -0
  429. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/beads-auto-link.sh +76 -0
  430. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/SKILL.md +50 -0
  431. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/beads-sync-proj.sh +108 -0
  432. package/src/bollharness/reference/boll-reference/docs/architecture/AGENT-PROFILE.md +151 -0
  433. package/src/bollharness/reference/boll-reference/docs/architecture/COST-STRUCTURE.md +56 -0
  434. package/src/bollharness/reference/boll-reference/docs/architecture/INDEX.md +76 -0
  435. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE1-INTENT-FIELD.md +116 -0
  436. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE2-CRYSTALLIZATION.md +200 -0
  437. package/src/bollharness/reference/boll-reference/docs/architecture/PRINCIPLES.md +84 -0
  438. package/src/bollharness/reference/boll-reference/docs/architecture/PROTOCOL-CORE.md +209 -0
  439. package/src/bollharness/reference/boll-reference/docs/architecture/VISION.md +181 -0
  440. package/src/bollharness/reference/boll-reference/docs/architecture/discussions/D-01-MARKET-SCENE-PROTOCOL.md +754 -0
  441. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +12 -0
  442. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +27 -0
  443. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +57 -0
  444. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +57 -0
  445. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +67 -0
  446. package/src/bollharness/scripts/checks/next_decision_number.sh +48 -0
  447. package/src/bollharness/scripts/ci/count-components.sh +65 -0
  448. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +14 -0
  449. package/src/bollharness/scripts/context-fragments/auth-consumers.md +17 -0
  450. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +13 -0
  451. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +18 -0
  452. package/src/bollharness/scripts/context-fragments/closure-checklist.md +13 -0
  453. package/src/bollharness/scripts/context-fragments/contract-consumers.md +15 -0
  454. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +15 -0
  455. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +19 -0
  456. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +11 -0
  457. package/src/bollharness/scripts/context-fragments/issue-first.md +8 -0
  458. package/src/bollharness/scripts/context-fragments/mcp-parity.md +16 -0
  459. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +74 -0
  460. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +15 -0
  461. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +15 -0
  462. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +13 -0
  463. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +15 -0
  464. package/src/bollharness/scripts/context-fragments/two-language.md +15 -0
  465. package/src/bollharness/scripts/context-fragments/version-sources.md +14 -0
  466. package/src/bollharness/scripts/hooks/find-project-root.sh +47 -0
  467. package/src/bollharness/scripts/hooks/inbox-poll.sh +78 -0
  468. package/src/bollharness/scripts/hooks/precompact.sh +56 -0
  469. package/src/bollharness/scripts/hooks/stop-evaluator.md +83 -0
  470. package/src/bollharness/scripts/sync-from-upstream.sh +281 -0
  471. package/src/bollharness/src/index.ts +5 -0
  472. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +11 -0
  473. package/src/bollharness/src/scripts/checks/check_api_types.ts +52 -0
  474. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +156 -0
  475. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +11 -0
  476. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +11 -0
  477. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +11 -0
  478. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +11 -0
  479. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +141 -0
  480. package/src/bollharness/src/scripts/checks/check_doc_links.ts +36 -0
  481. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +11 -0
  482. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +40 -0
  483. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +70 -0
  484. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +51 -0
  485. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +11 -0
  486. package/src/bollharness/src/scripts/checks/check_security.ts +54 -0
  487. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +11 -0
  488. package/src/bollharness/src/scripts/checks/check_versions.ts +11 -0
  489. package/src/bollharness/src/scripts/checks/finding.ts +35 -0
  490. package/src/bollharness/src/scripts/checks/next_decision_number.ts +24 -0
  491. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +11 -0
  492. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +14 -0
  493. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +14 -0
  494. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +14 -0
  495. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +14 -0
  496. package/src/bollharness/src/scripts/context_router.ts +76 -0
  497. package/src/bollharness/src/scripts/deploy-guard.ts +182 -0
  498. package/src/bollharness/src/scripts/guard-feedback.ts +215 -0
  499. package/src/bollharness/src/scripts/guard_router.ts +194 -0
  500. package/src/bollharness/src/scripts/hooks/_hook_output.js +3 -0
  501. package/src/bollharness/src/scripts/hooks/_hook_output.ts +11 -0
  502. package/src/bollharness/src/scripts/hooks/auto-python3.ts +10 -0
  503. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +10 -0
  504. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +10 -0
  505. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +111 -0
  506. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +74 -0
  507. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +10 -0
  508. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +10 -0
  509. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +10 -0
  510. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +10 -0
  511. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +10 -0
  512. package/src/bollharness/src/scripts/hooks/loop-detection.ts +83 -0
  513. package/src/bollharness/src/scripts/hooks/owner-guard.ts +10 -0
  514. package/src/bollharness/src/scripts/hooks/precompact.ts +10 -0
  515. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +10 -0
  516. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +121 -0
  517. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +10 -0
  518. package/src/bollharness/src/scripts/hooks/session-reflection.ts +12 -0
  519. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +12 -0
  520. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +12 -0
  521. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +12 -0
  522. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +164 -0
  523. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +10 -0
  524. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +14 -0
  525. package/src/bollharness/src/scripts/install/install-trust-token.ts +13 -0
  526. package/src/bollharness/src/scripts/install/multi_project_registry.ts +13 -0
  527. package/src/bollharness/src/scripts/install/phase2_auto.ts +28 -0
  528. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +10 -0
  529. package/src/bollharness/src/scripts/install/tier_selector.ts +10 -0
  530. package/src/bollharness/src/scripts/install/transcript_miner.ts +13 -0
  531. package/src/bollharness/src/scripts/lib/claim_patterns.ts +11 -0
  532. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +13 -0
  533. package/src/bollharness/src/scripts/sanitize.ts +9 -0
  534. package/src/bollharness/templates/persona/default.json +19 -0
  535. package/src/bollharness/templates/scaffold/.boll/guard/.gitkeep +0 -0
  536. package/src/bollharness/templates/scaffold/.boll/metrics/.gitkeep +0 -0
  537. package/src/bollharness/templates/scaffold/.boll/state/.gitkeep +0 -0
  538. package/src/bollharness/templates/scaffold/.gitignore.append +16 -0
  539. package/src/bollharness/templates/scaffold/CLAUDE.md +89 -0
  540. package/src/bollharness/templates/scaffold/docs/INDEX.md +3 -0
  541. package/src/bollharness/templates/scaffold/docs/decisions/ADR_TEMPLATE.md +38 -0
  542. package/src/bollharness/templates/scaffold/docs/decisions/PLAN_TEMPLATE.md +45 -0
  543. package/src/bollharness/templates/scaffold/docs/decisions/tasks/.gitkeep +2 -0
  544. package/src/bollharness/templates/scaffold/docs/issues/.gitkeep +0 -0
  545. package/src/bollharness/templates/scaffold/docs/issues/GUARD_ISSUE_TEMPLATE.md +35 -0
  546. package/src/bollharness/templates/scaffold/docs/issues/ISSUE_TEMPLATE.md +51 -0
  547. package/src/bollharness/tsconfig.json +26 -0
  548. package/src/bollharness-integration/channel-judgment-engine.ts +634 -0
  549. package/src/bollharness-integration/context-chain-router.ts +474 -0
  550. package/src/bollharness-integration/context-router-judgment.ts +339 -0
  551. package/src/bollharness-integration/context-router.ts +583 -0
  552. package/src/bollharness-integration/gate-state-machine.ts +444 -0
  553. package/src/bollharness-integration/gate-transition-hooks.ts +137 -0
  554. package/src/bollharness-integration/guard-checker.ts +451 -0
  555. package/src/bollharness-integration/index.ts +219 -0
  556. package/src/bollharness-integration/integration.ts +538 -0
  557. package/src/bollharness-integration/judgment-prompts.yaml +535 -0
  558. package/src/bollharness-integration/llm-judgment-engine.ts +712 -0
  559. package/src/bollharness-integration/skill-adapter.ts +646 -0
  560. package/src/cli/interface.ts +211 -0
  561. package/src/constraint-runtime/package-lock.json +48 -0
  562. package/src/constraint-runtime/package.json +34 -0
  563. package/src/constraint-runtime/src/_archive_helper.ts +16 -0
  564. package/src/constraint-runtime/src/agent/coordinator.ts +71 -0
  565. package/src/constraint-runtime/src/agent/index.ts +1 -0
  566. package/src/constraint-runtime/src/assistant/index.ts +15 -0
  567. package/src/constraint-runtime/src/bootstrap/index.ts +15 -0
  568. package/src/constraint-runtime/src/bootstrap_graph.ts +17 -0
  569. package/src/constraint-runtime/src/bridge/index.ts +15 -0
  570. package/src/constraint-runtime/src/buddy/index.ts +15 -0
  571. package/src/constraint-runtime/src/cli/index.ts +15 -0
  572. package/src/constraint-runtime/src/command_graph.ts +20 -0
  573. package/src/constraint-runtime/src/commands.ts +83 -0
  574. package/src/constraint-runtime/src/components/index.ts +15 -0
  575. package/src/constraint-runtime/src/constants/index.ts +15 -0
  576. package/src/constraint-runtime/src/constraint/budget.ts +25 -0
  577. package/src/constraint-runtime/src/constraint/index.ts +3 -0
  578. package/src/constraint-runtime/src/constraint/permission.ts +28 -0
  579. package/src/constraint-runtime/src/context.ts +45 -0
  580. package/src/constraint-runtime/src/coordinator/index.ts +15 -0
  581. package/src/constraint-runtime/src/cost_hook.ts +6 -0
  582. package/src/constraint-runtime/src/cost_tracker.ts +9 -0
  583. package/src/constraint-runtime/src/deferred_init.ts +18 -0
  584. package/src/constraint-runtime/src/direct_modes.ts +13 -0
  585. package/src/constraint-runtime/src/dynamic-tool-loader.ts +115 -0
  586. package/src/constraint-runtime/src/entrypoints/index.ts +15 -0
  587. package/src/constraint-runtime/src/execution_registry.ts +41 -0
  588. package/src/constraint-runtime/src/history.ts +16 -0
  589. package/src/constraint-runtime/src/hooks/index.ts +15 -0
  590. package/src/constraint-runtime/src/index.ts +28 -0
  591. package/src/constraint-runtime/src/ink.ts +4 -0
  592. package/src/constraint-runtime/src/keybindings/index.ts +15 -0
  593. package/src/constraint-runtime/src/memdir/index.ts +15 -0
  594. package/src/constraint-runtime/src/migrations/index.ts +15 -0
  595. package/src/constraint-runtime/src/models.ts +49 -0
  596. package/src/constraint-runtime/src/moreright/index.ts +15 -0
  597. package/src/constraint-runtime/src/native_ts/index.ts +15 -0
  598. package/src/constraint-runtime/src/output_styles/index.ts +15 -0
  599. package/src/constraint-runtime/src/parity_audit.ts +23 -0
  600. package/src/constraint-runtime/src/plugins/index.ts +15 -0
  601. package/src/constraint-runtime/src/port_manifest.ts +20 -0
  602. package/src/constraint-runtime/src/prefetch.ts +17 -0
  603. package/src/constraint-runtime/src/query.ts +7 -0
  604. package/src/constraint-runtime/src/reference_data/archive_surface_snapshot.json +63 -0
  605. package/src/constraint-runtime/src/reference_data/commands_snapshot.json +1037 -0
  606. package/src/constraint-runtime/src/reference_data/subsystems/OpenCLI.json +10 -0
  607. package/src/constraint-runtime/src/reference_data/subsystems/PolymarketSDK.json +12 -0
  608. package/src/constraint-runtime/src/reference_data/subsystems/SafeSDK.json +14 -0
  609. package/src/constraint-runtime/src/reference_data/subsystems/assistant.json +8 -0
  610. package/src/constraint-runtime/src/reference_data/subsystems/bootstrap.json +8 -0
  611. package/src/constraint-runtime/src/reference_data/subsystems/bridge.json +32 -0
  612. package/src/constraint-runtime/src/reference_data/subsystems/buddy.json +13 -0
  613. package/src/constraint-runtime/src/reference_data/subsystems/cli.json +26 -0
  614. package/src/constraint-runtime/src/reference_data/subsystems/components.json +32 -0
  615. package/src/constraint-runtime/src/reference_data/subsystems/constants.json +28 -0
  616. package/src/constraint-runtime/src/reference_data/subsystems/coordinator.json +8 -0
  617. package/src/constraint-runtime/src/reference_data/subsystems/entrypoints.json +15 -0
  618. package/src/constraint-runtime/src/reference_data/subsystems/hooks.json +32 -0
  619. package/src/constraint-runtime/src/reference_data/subsystems/keybindings.json +21 -0
  620. package/src/constraint-runtime/src/reference_data/subsystems/memdir.json +15 -0
  621. package/src/constraint-runtime/src/reference_data/subsystems/migrations.json +18 -0
  622. package/src/constraint-runtime/src/reference_data/subsystems/moreright.json +8 -0
  623. package/src/constraint-runtime/src/reference_data/subsystems/native_ts.json +11 -0
  624. package/src/constraint-runtime/src/reference_data/subsystems/outputStyles.json +8 -0
  625. package/src/constraint-runtime/src/reference_data/subsystems/plugins.json +9 -0
  626. package/src/constraint-runtime/src/reference_data/subsystems/remote.json +11 -0
  627. package/src/constraint-runtime/src/reference_data/subsystems/schemas.json +8 -0
  628. package/src/constraint-runtime/src/reference_data/subsystems/screens.json +10 -0
  629. package/src/constraint-runtime/src/reference_data/subsystems/server.json +10 -0
  630. package/src/constraint-runtime/src/reference_data/subsystems/services.json +32 -0
  631. package/src/constraint-runtime/src/reference_data/subsystems/skills.json +27 -0
  632. package/src/constraint-runtime/src/reference_data/subsystems/state.json +13 -0
  633. package/src/constraint-runtime/src/reference_data/subsystems/types.json +18 -0
  634. package/src/constraint-runtime/src/reference_data/subsystems/upstreamproxy.json +9 -0
  635. package/src/constraint-runtime/src/reference_data/subsystems/utils.json +32 -0
  636. package/src/constraint-runtime/src/reference_data/subsystems/vim.json +12 -0
  637. package/src/constraint-runtime/src/reference_data/subsystems/voice.json +8 -0
  638. package/src/constraint-runtime/src/reference_data/tools_snapshot.json +1042 -0
  639. package/src/constraint-runtime/src/remote/index.ts +15 -0
  640. package/src/constraint-runtime/src/remote_runtime.ts +17 -0
  641. package/src/constraint-runtime/src/runtime/index.ts +1 -0
  642. package/src/constraint-runtime/src/runtime/session.ts +42 -0
  643. package/src/constraint-runtime/src/schemas/index.ts +15 -0
  644. package/src/constraint-runtime/src/screens/index.ts +15 -0
  645. package/src/constraint-runtime/src/server/index.ts +15 -0
  646. package/src/constraint-runtime/src/services/index.ts +15 -0
  647. package/src/constraint-runtime/src/session_store.ts +32 -0
  648. package/src/constraint-runtime/src/setup.ts +50 -0
  649. package/src/constraint-runtime/src/skills/index.ts +1 -0
  650. package/src/constraint-runtime/src/skills/skill-registry.ts +40 -0
  651. package/src/constraint-runtime/src/state/index.ts +15 -0
  652. package/src/constraint-runtime/src/system_init.ts +21 -0
  653. package/src/constraint-runtime/src/thinking/engine.ts +61 -0
  654. package/src/constraint-runtime/src/thinking/index.ts +1 -0
  655. package/src/constraint-runtime/src/tool_pool.ts +20 -0
  656. package/src/constraint-runtime/src/tools/OpenCLI/execAdapter.ts +12 -0
  657. package/src/constraint-runtime/src/tools/OpenCLI/listAdapters.ts +12 -0
  658. package/src/constraint-runtime/src/tools/OpenCLI/runCommand.ts +13 -0
  659. package/src/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.ts +10 -0
  660. package/src/constraint-runtime/src/tools/PolymarketSDK/createOrder.ts +13 -0
  661. package/src/constraint-runtime/src/tools/PolymarketSDK/getMarket.ts +14 -0
  662. package/src/constraint-runtime/src/tools/PolymarketSDK/getOrders.ts +10 -0
  663. package/src/constraint-runtime/src/tools/PolymarketSDK/listMarkets.ts +24 -0
  664. package/src/constraint-runtime/src/tools/SafeSDK/confirmTransaction.ts +13 -0
  665. package/src/constraint-runtime/src/tools/SafeSDK/createTransaction.ts +23 -0
  666. package/src/constraint-runtime/src/tools/SafeSDK/deploySafe.ts +12 -0
  667. package/src/constraint-runtime/src/tools/SafeSDK/executeTransaction.ts +12 -0
  668. package/src/constraint-runtime/src/tools/SafeSDK/getBalance.ts +10 -0
  669. package/src/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.ts +10 -0
  670. package/src/constraint-runtime/src/tools/SafeSDK/proposeTransaction.ts +14 -0
  671. package/src/constraint-runtime/src/tools/WalletTools/autoPay.ts +58 -0
  672. package/src/constraint-runtime/src/tools/WalletTools/createWallet.ts +19 -0
  673. package/src/constraint-runtime/src/tools/WalletTools/getBalance.ts +28 -0
  674. package/src/constraint-runtime/src/tools/WalletTools/importWallet.ts +34 -0
  675. package/src/constraint-runtime/src/tools/WalletTools/sendTransaction.ts +50 -0
  676. package/src/constraint-runtime/src/tools/WalletTools/signMessage.ts +23 -0
  677. package/src/constraint-runtime/src/tools/WalletTools/transferToken.ts +49 -0
  678. package/src/constraint-runtime/src/tools.ts +100 -0
  679. package/src/constraint-runtime/src/transcript.ts +23 -0
  680. package/src/constraint-runtime/src/types/index.ts +15 -0
  681. package/src/constraint-runtime/src/upstream_proxy/index.ts +15 -0
  682. package/src/constraint-runtime/src/utils/index.ts +15 -0
  683. package/src/constraint-runtime/src/vim/index.ts +15 -0
  684. package/src/constraint-runtime/src/voice/index.ts +15 -0
  685. package/src/constraint-runtime/tests/agent.test.ts +20 -0
  686. package/src/constraint-runtime/tests/constraint.test.ts +47 -0
  687. package/src/constraint-runtime/tests/skill.test.ts +23 -0
  688. package/src/constraint-runtime/tests/thinking.test.ts +28 -0
  689. package/src/constraint-runtime/tsconfig.json +13 -0
  690. package/src/constraints/index.ts +6 -0
  691. package/src/documents/reader.ts +80 -0
  692. package/src/electron-preload.ts +25 -0
  693. package/src/electron.ts +200 -0
  694. package/src/index.ts +1606 -0
  695. package/src/llm/config-store.ts +312 -0
  696. package/src/llm/llm-judgment-client.ts +470 -0
  697. package/src/llm/pi-ai.ts +522 -0
  698. package/src/network/agent-network.ts +800 -0
  699. package/src/network/hybrid-messenger.ts +199 -0
  700. package/src/network/iroh-bootstrap.ts +57 -0
  701. package/src/network/iroh-discovery.ts +207 -0
  702. package/src/network/iroh-integration.ts +158 -0
  703. package/src/network/iroh-transport.ts +594 -0
  704. package/src/network/p2p.ts +963 -0
  705. package/src/network/storage/adapters/json-adapter.ts +439 -0
  706. package/src/network/storage/index.ts +187 -0
  707. package/src/network/storage/types.ts +166 -0
  708. package/src/pi-ecosystem/index.ts +453 -0
  709. package/src/pi-ecosystem-colony/index.ts +482 -0
  710. package/src/pi-ecosystem-goals/index.ts +585 -0
  711. package/src/pi-ecosystem-judgment/decision.ts +431 -0
  712. package/src/pi-ecosystem-judgment/distillation.ts +398 -0
  713. package/src/pi-ecosystem-judgment/human-value-store.ts +580 -0
  714. package/src/pi-ecosystem-judgment/index.ts +678 -0
  715. package/src/pi-ecosystem-judgment/value-injection.ts +744 -0
  716. package/src/pi-ecosystem-mcp/index.ts +427 -0
  717. package/src/pi-ecosystem-subagents/index.ts +408 -0
  718. package/src/social/ant-colony/AdaptiveHeartbeat.ts +131 -0
  719. package/src/social/ant-colony/PheromoneEngine.ts +302 -0
  720. package/src/social/ant-colony/index.ts +18 -0
  721. package/src/social/ant-colony/types.ts +94 -0
  722. package/src/social/channels/ChannelManager.ts +485 -0
  723. package/src/social/channels/DiapChannelBridge.ts +501 -0
  724. package/src/social/channels/InterestMatcher.ts +189 -0
  725. package/src/social/channels/agent-workflow-config.json +214 -0
  726. package/src/social/channels/agent-workflow-config.yaml +334 -0
  727. package/src/social/channels/channel-agent-session.ts +407 -0
  728. package/src/social/channels/channel-heartbeat-agent.ts +622 -0
  729. package/src/social/channels/diap-doc-parser.ts +282 -0
  730. package/src/social/channels/harness-workflow-integrator.ts +594 -0
  731. package/src/social/channels/index.ts +22 -0
  732. package/src/social/channels/types.ts +115 -0
  733. package/src/social/global-shared-context.ts +506 -0
  734. package/src/social/heartbeat.ts +1041 -0
  735. package/src/social/persona/enhanced-persona.ts +359 -0
  736. package/src/test/ai-judgment-test.ts +92 -0
  737. package/src/test/bollharness-integration.test.ts +398 -0
  738. package/src/test/channel-agent-multi-dialogue.ts +265 -0
  739. package/src/test/channel-heartbeat-agent-test.ts +244 -0
  740. package/src/test/constraint-layer.test.ts +191 -0
  741. package/src/test/diap-identity-test.ts +222 -0
  742. package/src/test/diap-quick-test.ts +73 -0
  743. package/src/test/global-shared-context.test.ts +393 -0
  744. package/src/test/harness-judgment-injection.test.ts +353 -0
  745. package/src/test/harness-workflow-integrator-test.ts +285 -0
  746. package/src/test/human-value-store.test.ts +316 -0
  747. package/src/test/hybrid-integration-test.ts +126 -0
  748. package/src/test/hybrid-messenger-verify.ts +68 -0
  749. package/src/test/iroh-bistream-debug.ts +50 -0
  750. package/src/test/iroh-communication.test.ts +81 -0
  751. package/src/test/iroh-debug-test.ts +69 -0
  752. package/src/test/iroh-diap-test.ts +90 -0
  753. package/src/test/iroh-direct-connect.ts +65 -0
  754. package/src/test/iroh-e2e-fixed.ts +106 -0
  755. package/src/test/iroh-e2e-same-process.ts +83 -0
  756. package/src/test/iroh-e2e.ts +83 -0
  757. package/src/test/iroh-final-e2e.ts +84 -0
  758. package/src/test/iroh-relay-test.ts +46 -0
  759. package/src/test/iroh-simple-test.ts +49 -0
  760. package/src/test/iroh-transport-verify.ts +60 -0
  761. package/src/test/iroh-transport.test.ts +47 -0
  762. package/src/test/iroh-two-nodes.ts +87 -0
  763. package/src/test/iroh-verify.ts +55 -0
  764. package/src/test/judgment-decision.test.ts +373 -0
  765. package/src/test/llm-judgment-integration.test.ts +257 -0
  766. package/src/test/p2p-agent-complex-dialogue.ts +490 -0
  767. package/src/test/p2p-agent-dialogue.ts +423 -0
  768. package/src/test/p2p-agent-full-bidirectional.ts +686 -0
  769. package/src/test/p2p-agent-harness-flow.ts +562 -0
  770. package/src/test/p2p-agent-harness-single.ts +175 -0
  771. package/src/test/p2p-ai-dialogue-test.ts +374 -0
  772. package/src/test/p2p-cid-connect-test.ts +245 -0
  773. package/src/test/p2p-connect-receiver.ts +85 -0
  774. package/src/test/p2p-iroh-test.ts +214 -0
  775. package/src/test/p2p-minimal-test.ts +264 -0
  776. package/src/test/p2p-node-1.ts +172 -0
  777. package/src/test/p2p-node-2.ts +172 -0
  778. package/src/test/p2p-server.ts +335 -0
  779. package/src/test/p2p-two-nodes-test.ts +542 -0
  780. package/src/test/pi-sdk.test.ts +47 -0
  781. package/src/test/set-persona.ts +56 -0
  782. package/src/test/simple.test.ts +11 -0
  783. package/src/test/storage-integration.test.ts +191 -0
  784. package/src/test/subagent-manager.test.ts +392 -0
  785. package/src/test/test-gate-flow.test.ts +92 -0
  786. package/src/test/workflow-engine.test.ts +101 -0
  787. package/src/web/api-config.html +265 -0
  788. package/src/web/client.js +1401 -0
  789. package/src/web/components/p2p/P2PModal.tsx +328 -0
  790. package/src/web/components/p2p/index.ts +404 -0
  791. package/src/web/components/p2p/index.tsx +297 -0
  792. package/src/web/components/p2p/p2p-connection.ts +186 -0
  793. package/src/web/components/p2p/p2p-identity.ts +92 -0
  794. package/src/web/components/p2p/p2p-manager.ts +109 -0
  795. package/src/web/components/p2p/p2p-messages.ts +219 -0
  796. package/src/web/components/p2p/p2p-modal.ts +685 -0
  797. package/src/web/components/p2p/p2p-store-memory.ts +162 -0
  798. package/src/web/components/p2p/types.ts +112 -0
  799. package/src/web/design.md +99 -0
  800. package/src/web/index.html +192 -0
  801. package/src/web/server.ts +1878 -0
  802. package/src/web/style.css +3260 -0
  803. package/src/workflows/collaboration.ts +455 -0
  804. package/src/workflows/index.ts +64 -0
  805. package/tsconfig.electron.json +20 -0
  806. package/tsconfig.json +19 -0
  807. package/vitest.config.ts +12 -0
  808. package//346/203/263/346/263/225.md +79 -0
@@ -0,0 +1,1076 @@
1
+ # ADR-030: Guard Signal Protocol and Governance Reload
2
+
3
+ **Status**: Proposed
4
+ **Date**: 2026-03-22
5
+ **Revised**: 2026-03-22 (v6 — Part B governance reload 完整设计:上下文路由 + 上下文片段 + guard-feedback.ts 双重机制)
6
+ **Origin**: PLAN-057 后续讨论 — 如何让 coherence guard 的思维范式永久存活
7
+
8
+ ---
9
+
10
+ ## 1. 问题
11
+
12
+ ### 1.1 直接诱因:19 个审计发现
13
+
14
+ 2026-03-21 的全局系统审计(`docs/reviews/global-system-audit-2026-03-21.md`)揭示了 19 个跨系统的问题,涵盖 P0(安全/正确性)到 P2(质量/规范):
15
+
16
+ | 编号 | 级别 | 问题 | 类型 |
17
+ |------|------|------|------|
18
+ | 4.1 | P0 | 真相源导航断裂(MEMORY.md/INDEX.md 死链) | 真相漂移 |
19
+ | 4.2 | P0 | MCP 默认公网 HTTP 传输 bearer token | 承诺 vs 现实 |
20
+ | 4.3 | P0 | run_events 读模型截断导致长 run 状态不正确 | 共享结构过载 |
21
+ | 4.4 | P0 | /protocol/runs/{id}/prompt 双重 O(history) 扫描 | 共享结构过载 |
22
+ | 4.5 | P0 | 事件写入按 run 序列化(扩展瓶颈) | 共享结构过载 |
23
+ | 4.6 | P1 | BYOK base_url 从受控中继退化为任意 SSRF 面 | 承诺 vs 现实 |
24
+ | 4.7 | P1 | SecondMe 回调仍允许公网 HTTP origin | 承诺 vs 现实 |
25
+ | 4.8 | P1 | Node MCP 未收敛到 PLAN-051 auth surface | 多实现漂移 |
26
+ | 4.9 | P1 | smart-home-butler 承诺真实协议,跑 demo fallback | 承诺 vs 现实 |
27
+ | 4.10 | P1 | 网站暴露 startup-hub 路由解析为 null | 承诺 vs 现实 |
28
+ | 4.11 | P1 | Bridge admin stdout_chunk 信任模型弱于主事件路径 | 边界模糊 |
29
+ | 4.12 | P1 | Bridge 回归门禁文档说关了,实际标准调用失败 | 承诺 vs 现实 |
30
+ | 4.13 | P1 | Discovery 仍为全表扫描 + N+1 过滤 | 共享结构过载 |
31
+ | 4.14 | P1 | AgentWork Inbox 消费旧契约 | 多实现漂移 |
32
+ | 4.15 | P2 | MCP 本地配置文件为明文非原子密钥存储 | 真相漂移 |
33
+ | 4.16 | P2 | bridge_listen.ts 在一条完成路径上伪装成功 | 承诺 vs 现实 |
34
+ | 4.17 | P2 | ENGINEERING_REFERENCE.md 过期但仍被当基线用 | 元层漂移 |
35
+ | 4.18 | P2 | 版本/部署/生成产物的真相碎片化 | 真相漂移 |
36
+ | 4.19 | P2 | 公开 Agent API 暴露稳定的 owner-identity 映射 | 边界模糊 |
37
+
38
+ ### 1.2 病因分析:不是 19 个独立 bug
39
+
40
+ 这 19 个 finding 聚成 5 个共同病因(审计 Section 7 的根因分析):
41
+
42
+ 1. **代码演化快,真相收敛慢**(7.1)— 代码改了但文档/测试/消费方没同步。多层真相源(代码、CLAUDE.md、MEMORY.md、INDEX.md、plans、.boll memory、部署现实)没有显式治理。
43
+ 2. **目标态文档跑在实现前面**(7.2)— plan/ADR 写的是"已完成"语气,代码还在过渡态。场景文档说"真实协议",跑的是 demo fallback。
44
+ 3. **共享数据结构承担太多角色**(7.3)— `run_events` 同时是审计日志、重放历史、进度来源、轮次来源。一旦过载,每个消费方都从一个不完整的存储中推断语义。
45
+ 4. **多实现产品缺乏主动一致性治理**(7.4)— Python MCP 和 Node MCP 不会"自动"保持一致。auth、config、版本号各自漂移。
46
+ 5. **元层漂移是第一等风险**(7.5)— 过期的 skill/指南文档不只是"文档不准"——它会主动把未来的 AI 开发引向错误方向。
47
+
48
+ 审计的核心结论:
49
+
50
+ > **Bollharness 的本地实现能力已经超过了系统级协调能力。核心问题不再是"能不能实现复杂功能",而是"能不能维护一个关于'已经实现了什么'的一致的、可信的解释"。**
51
+
52
+ ### 1.3 标和本
53
+
54
+ 用户要求:"既要能够解决我们目前遇到的几十个问题,又要是一套美的方式防止以后出现类似的问题,而且其本身也是可维护的。本质和实现我都要,标和本我都要治。"
55
+
56
+ - **治标**:PLAN-057 逐条修复 19 个 finding(已完成,19 WP + 672 测试)
57
+ - **治本**:本 ADR(ADR-030)建立机制,让这 5 类病因不再反复发作
58
+
59
+ ### 1.4 为什么这些 bug 会反复出现
60
+
61
+ 每一类病因的复发机制都相同:**AI 在改代码的那个瞬间,缺乏"这段代码在系统中的完整位置感"。**
62
+
63
+ - 改了 Python MCP auth 但不知道 Node MCP 是消费方 → 病因 4(多实现漂移)
64
+ - 改了 run_events 的读取逻辑但不知道 6 个消费方 → 病因 3(共享结构过载)
65
+ - 改了 scene 文档承诺但不知道运行时还是 fallback → 病因 2(承诺 vs 现实)
66
+ - 改了 CLAUDE.md 的版本号但不知道 pyproject.toml 也要改 → 病因 1(真相漂移)
67
+ - 改了 skill 文档但不知道旧版还在其他地方被引用 → 病因 5(元层漂移)
68
+
69
+ **共同根因**:AI 做决策时,相关的上下文不在它的窗口里。
70
+
71
+ 这不是 prompt 问题("告诉 AI 要注意消费方"),不是记忆问题("让 AI 记住 Python/Node 是一对"),不是流程问题("要求 AI 先查消费方再改代码")。
72
+
73
+ 这是**上下文工程问题**:在合适的时候,把合适的上下文投影到 AI 的工作窗口中。
74
+
75
+ ### 1.5 核心问题的精确定义
76
+
77
+ > **如何让每一次代码变更都在完整的上下文下发生——AI 知道这个改动涉及哪些消费方、哪些约定、哪些承诺、哪些已知教训——从而在源头防止这 5 类病因反复出现?**
78
+
79
+ 具体而言:
80
+ - 改 `mcp-server/boll_mcp/server.ts` 时,AI 窗口里有 `mcp-server-node/` 的对应文件路径和 parity 约定
81
+ - 改 `backend/product/bridge/` 时,AI 窗口里有 Bridge 宪法 5 条规则
82
+ - 改 issue doc 标 Fixed 时,AI 窗口里有 "Fixed 三层"定义
83
+ - 改 scene 文档承诺时,AI 窗口里有该 scene 的实际 runtime fidelity 分级
84
+ - 改 `CLAUDE.md` 版本号时,AI 窗口里有所有版本号来源的清单
85
+ - 改契约(URL/schema/env var)时,AI 窗口里有消费方列表
86
+
87
+ 这些上下文不靠 AI 自己想起来,不靠 skill 碰巧被加载,不靠人提醒。由代码确定性地路由和注入。
88
+
89
+ ### 1.6 这本质是什么
90
+
91
+ > **这是上下文工程——在合适的时候给出合适的上下文,而不是 prompt。**
92
+
93
+ Prompt 是静态的、全量的、前置的指令。上下文工程是动态的、精准的、按需的知识投影。
94
+
95
+ 区别:
96
+ - Prompt 把所有规则塞给 AI,希望它记住 → 注意力稀释,规模不可扩展
97
+ - 上下文工程检测 AI 正在做什么,投影此刻相关的知识 → 精准,可扩展,由代码控制
98
+
99
+ LLM 的工作方式是:上下文窗口里有什么,它就用什么来推理。上下文工程利用这个特性——把正确的输入放进窗口,让 transformer 自然产出正确的输出。不是"告诉 AI 应该怎么想",而是"让 AI 的输入中包含它需要的知识"。
100
+
101
+ ### 1.7 PLAN-057 的思维范式贡献(仍然重要)
102
+
103
+ PLAN-057 除了修复 19 个 finding,还沉淀了一套思维范式:
104
+
105
+ - "Fixed"有三层(runtime / prevention / mechanism),不是症状消失就算完
106
+ - Guard > Memory:如果一件事靠记忆维护,它一定会出错
107
+ - 一个事实只允许一个定义,其余自动派生或自动报警
108
+ - 验证看最后一公里,不是"服务启动了"就算过
109
+
110
+ 这些思维范式是上下文工程要投影的**内容**之一。当 AI 改 issue doc 时,"Fixed 三层"框架应该出现在它的窗口里。当 AI 新增一个版本号时,"一个事实只允许一个定义"应该出现在它的窗口里。
111
+
112
+ **核心矛盾依然存在**:思维方式不能被机械执行(你不能写代码检测"AI 有没有想清楚"),但如果不机械化地把相关思维框架放进 AI 的窗口,它一定会蒸发。上下文工程是解决这个矛盾的机制。
113
+
114
+ ## 2. 关键洞察
115
+
116
+ ### 2.1 思维范式不是被"记住"的,是被"要求输出"的
117
+
118
+ 你不能机械检测"有没有正确思考",但你可以:
119
+
120
+ 1. 定义"正确思考的产物长什么样"(Convention)
121
+ 2. 写代码检查产物格式(Guard)
122
+ 3. 检测到违反时,强制把 AI 拉回正确思维轨道(Signal → Governance Reload)
123
+
124
+ 例:
125
+
126
+ | 思维规则 | 约定(机器可检查的输出) | Guard |
127
+ |---|---|---|
128
+ | Fixed 不等于症状消失 | issue.md frontmatter 必须包含 `prevention_status` 字段 | `check_issue_closure.ts` |
129
+ | 改代码前要规划 | 代码变更必须伴随 issue/plan artifact | `check_artifact_link.ts` |
130
+ | 一个事实只允许一个定义 | Python/Node MCP 工具名和行为必须一致 | `check_mcp_parity.ts` |
131
+ | Guard > Memory | issue 标 Fixed 时必须指向 guard 或标 `not_applicable` | `check_issue_closure.ts` |
132
+
133
+ Guard 不只是语法检查——**它是思维规则的可执行编码**。当 guard 拒绝接受缺少 `prevention_status` 的 issue doc 时,它在教每一个新会话:你必须思考 prevention。
134
+
135
+ ### 2.2 这是上下文工程,不是 Prompt
136
+
137
+ 19 个审计 finding 的共同根因:**AI 做决策时,相关上下文不在它的窗口里。**
138
+
139
+ - 改了 Python MCP 但不知道 Node MCP 是消费方(窗口里没有 parity 约定)
140
+ - 改了 run_events 读取逻辑但不知道 6 个消费方(窗口里没有消费方列表)
141
+ - 改了 scene 文档承诺但不知道运行时是 fallback(窗口里没有 fidelity 分级)
142
+
143
+ 传统的解决方式是 prompt:"把所有规则写进 CLAUDE.md / skill,让 AI 记住"。
144
+
145
+ 问题:
146
+ - 规则太多 → 注意力稀释
147
+ - 静态全量 → 改 bridge 和改前端需要的知识完全不同,但 prompt 不区分
148
+ - Advisory → AI 读完可以不照做
149
+ - 上下文压缩 → 长会话后早期 prompt 被挤掉
150
+
151
+ **上下文工程是不同的路径**:检测 AI 正在做什么 → 用代码确定性地投影此刻相关的知识到窗口 → LLM 自然用它来推理。
152
+
153
+ 这不是"告诉 AI 应该怎么想"(prompt),而是"让 AI 的输入中包含它需要的知识"(context engineering)。路由是代码控制的确定性操作,AI 不参与"要不要加载"的决策。
154
+
155
+ ### 2.3 两部分的成熟度
156
+
157
+ | 部分 | 内容 | 成熟度 | 行业对标 |
158
+ |------|------|--------|---------|
159
+ | **Part A: Enforcement** | Convention + Guard + Signal + Blocking Gates | 设计完整,可用现成工具(pre-commit framework, GitHub Actions) | 任何大公司的 CI/CD |
160
+ | **Part B: Governance Reload** | 上下文路由 + 上下文片段 + 动态投影 | **本 ADR 的核心贡献**,设计见 Section 3.4.1 | AI 开发时代的新问题,无行业先例 |
161
+
162
+ Part A 治标(阻止错误产出进入代码库),Part B 治本(让 AI 在源头就用正确的知识做决策)。
163
+
164
+ ## 3. 决策
165
+
166
+ ### 3.1 架构总览
167
+
168
+ ```
169
+ Bollharness Mechanism Stack
170
+ ════════════════════
171
+
172
+ ┌─────────────────────────────────────────────────┐
173
+ │ Layer 1: Convention │
174
+ │ 定义"正确的产物长什么样" │
175
+ │ 载体: CLAUDE.md + docs/ + issue/plan 格式约定 │
176
+ │ 覆盖: 通用 │
177
+ ├─────────────────────────────────────────────────┤
178
+ │ Layer 2: Guard │
179
+ │ 检查约定是否被遵守 │
180
+ │ 载体: scripts/checks/*.ts │
181
+ │ 覆盖: 通用(纯 TypeScript,任何环境可跑) │
182
+ ├─────────────────────────────────────────────────┤
183
+ │ Layer 3: Signal │
184
+ │ 把 guard 结果写入文件系统 │
185
+ │ 载体: .boll/guard/session-{pid}.json │
186
+ │ 覆盖: 通用(JSON 文件,任何工具/人可读) │
187
+ ├─────────────────────────────────────────────────┤
188
+ │ Layer 4: Trigger │
189
+ │ 什么时候跑 guard │
190
+ │ 载体: git hooks + deploy.sh (通用) │
191
+ │ + Claude Code hooks (Claude-specific) │
192
+ ├─────────────────────────────────────────────────┤
193
+ │ Layer 5: Governance Reload(上下文工程) │
194
+ │ 在 AI 编辑代码时,动态投影相关思维框架到窗口 │
195
+ │ 两个机制: │
196
+ │ 主动投影: 文件路径→上下文片段(每次编辑都做) │
197
+ │ 被动重载: guard 报红→required_skills/reads │
198
+ │ 载体: context-router.ts + context-fragments/ │
199
+ │ 覆盖: Claude Code (native), Codex (adapter) │
200
+ ├─────────────────────────────────────────────────┤
201
+ │ Layer 6: Blocking Gates │
202
+ │ 不允许带病通过 │
203
+ │ 载体: pre-commit + deploy.sh + remote CI │
204
+ │ 覆盖: 通用(git hooks + shell + GitHub Actions)│
205
+ └─────────────────────────────────────────────────┘
206
+ ```
207
+
208
+ #### 3.1.1 Enforcement Plane vs Feedback Plane
209
+
210
+ Mechanism Stack 中的 6 层分属两个截然不同的平面:
211
+
212
+ ```
213
+ ╔══════════════════════════════════════════════════╗
214
+ ║ FEEDBACK PLANE(反馈面) ║
215
+ ║ 目的: 让 AI/开发者在编辑时立刻知道问题 ║
216
+ ║ 特征: 不阻断操作,stderr 输出,advisory ║
217
+ ║ 组件: PostToolUse hook, PreToolUse hook, ║
218
+ ║ session signal files, governance reload ║
219
+ ║ 覆盖: Claude Code (native), Codex (via signal) ║
220
+ ╠══════════════════════════════════════════════════╣
221
+ ║ ENFORCEMENT PLANE(强制面) ║
222
+ ║ 目的: 硬性阻止坏代码进入 repo/生产 ║
223
+ ║ 特征: exit ≠ 0 → 操作失败,不可绕过 ║
224
+ ║ 组件: pre-commit hook, deploy.sh, ║
225
+ ║ remote CI (GitHub Actions coherence) ║
226
+ ║ 覆盖: 通用(任何 git client、任何 CI 平台) ║
227
+ ╚══════════════════════════════════════════════════╝
228
+ ```
229
+
230
+ **关键裁决**:
231
+
232
+ 1. **反馈面和强制面不能混淆**。PostToolUse 的 `exit 2` 是反馈(AI 收到信息但可以选择继续),不是阻断。真正的阻断只发生在 pre-commit、deploy、remote CI。
233
+ 2. **反馈面的价值是速度**:AI 编辑文件后 1-2 秒内收到 signal,不需要等到 commit 时才发现问题。
234
+ 3. **强制面的价值是不可绕过**:local pre-commit 可以被 `--no-verify` 跳过,deploy.sh 可以被绕过,但 remote CI 不能。Remote gate 是最终防线。
235
+ 4. **两者互补而非替代**:反馈面减少到达强制面时的问题数量;强制面保证漏网的问题不能落地。
236
+
237
+ ### 3.2 Guard Signal Protocol
238
+
239
+ Guard 运行后,每个进程写自己的 session 文件到 `.boll/guard/`:
240
+
241
+ ```
242
+ .boll/guard/
243
+ session-{pid}.json # 每个进程独立写,不互相覆盖
244
+ .session-notified-{pid} # SessionStart 通知标记(见 3.5)
245
+ ```
246
+
247
+ 单个 session 文件格式:
248
+
249
+ ```json
250
+ {
251
+ "timestamp": "2026-03-22T10:15:00Z",
252
+ "pid": 12345,
253
+ "stage": "post-edit | pre-commit | deploy",
254
+ "trigger": "guard-feedback.ts | pre-commit | deploy.sh",
255
+ "findings": [
256
+ {
257
+ "severity": "P0 | P1 | P2",
258
+ "blocking": true,
259
+ "category": "closure_semantics | contract_drift | bridge_boundary | doc_integrity | version_drift | artifact_linkage | governance_bootstrap",
260
+ "problem_class": "policy | contract | implementation",
261
+ "message": "Issue 022 marked Fixed but prevention_status is open",
262
+ "file": "docs/issues/022-bridge-node-missing-execution-files-2026-03-21.md",
263
+ "line": 5,
264
+ "required_skills": ["lead", "bollharness-ops"],
265
+ "required_reads": [
266
+ "docs/issues/022-bridge-node-missing-execution-files-2026-03-21.md"
267
+ ]
268
+ }
269
+ ],
270
+ "summary": {
271
+ "p0": 0,
272
+ "p1": 1,
273
+ "p2": 0,
274
+ "has_blocking": true,
275
+ "required_skills": ["lead", "bollharness-ops"]
276
+ }
277
+ }
278
+ ```
279
+
280
+ **`severity` 与 `blocking` 是独立维度**:
281
+
282
+ | 概念 | 回答 | 值域 |
283
+ |------|------|------|
284
+ | `severity` | 问题有多严重 | P0 (安全/数据丢失), P1 (功能断裂), P2 (质量/规范) |
285
+ | `blocking` | 是否阻止 commit/deploy | true / false — 由 guard 按治理要求声明 |
286
+
287
+ 一个 P2 的 closure 违规可能不那么"严重",但它违反治理规则,所以 `blocking: true`。分离这两个维度是让 closure 体系真正可执行的关键。
288
+
289
+ **`category` 与 `problem_class` 是正交维度**:
290
+
291
+ | 字段 | 回答 | 用于 | 值域 |
292
+ |------|------|------|------|
293
+ | `category` | 发现了什么类型的问题 | skill 路由(见 3.4) | closure_semantics, contract_drift, bridge_boundary, doc_integrity, version_drift, artifact_linkage, governance_bootstrap |
294
+ | `problem_class` | 问题在哪个架构层 | 修复者决定修复策略 | policy, contract, implementation |
295
+
296
+ `required_skills` 从 `category` 派生,不从 `problem_class` 派生。`problem_class` 是给修复者的元信息——对应 R1 "先分层再动手"。
297
+
298
+ **多 session 读取**:
299
+
300
+ 任何需要了解仓库 guard 状态的代码,通过 union 所有 session 文件获取:
301
+
302
+ ```typescript
303
+ const SEVERITY_RANK: Record<string, number> = { "P0": 0, "P1": 1, "P2": 2 };
304
+
305
+ async function readAllFindings(guardDir: Path, maxAgeSeconds: number = 3600): Promise<Finding[]> {
306
+ const raw: Finding[] = [];
307
+ const now = Date.now() / 1000;
308
+ for (const path of guardDir.glob("session-*.json")) {
309
+ const age = now - path.stat().st_mtime;
310
+ if (age > maxAgeSeconds) {
311
+ path.unlink(missing_ok=True);
312
+ continue;
313
+ }
314
+ const data = JSON.parse(path.read_text());
315
+ raw.push(...data["findings"]);
316
+ }
317
+ return mergeFindings(raw);
318
+ }
319
+
320
+ function mergeFindings(findings: Finding[]): Finding[] {
321
+ const byKey: Map<string, Finding> = new Map();
322
+ for (const f of findings) {
323
+ const key = `${f["file"]}:${f["category"]}`;
324
+ if (!byKey.has(key)) {
325
+ byKey.set(key, { ...f });
326
+ } else {
327
+ const existing = byKey.get(key)!;
328
+ if (SEVERITY_RANK[f.severity] < SEVERITY_RANK[existing.severity]) {
329
+ existing.severity = f.severity;
330
+ existing.message = f.message;
331
+ }
332
+ existing.blocking = existing.blocking || f.blocking;
333
+ existing.required_skills = [...new Set([...existing.required_skills, ...f.required_skills])];
334
+ }
335
+ }
336
+ return Array.from(byKey.values());
337
+ }
338
+ ```
339
+
340
+ **合并规则(保守原则——取最严)**:
341
+
342
+ | 字段 | 合并策略 | 理由 |
343
+ |------|---------|------|
344
+ | `severity` | `max`(P0 > P1 > P2) | 两个 session 对同一问题评估不同,取最严防漏 |
345
+ | `blocking` | `OR` | 任一 session 认为应阻断 → 阻断 |
346
+ | `required_skills` | `union` | 所有相关 skill 都应被加载 |
347
+ | `message` | 取 severity 最高的 | 最严发现的描述最有信息量 |
348
+
349
+ **设计原则**:
350
+
351
+ - **每个 writer 只写自己的 scope,reader union 全部**:消除竞态,不需要锁或 merge-on-write
352
+ - **signal 不是日志**:session 文件只保留该 session 最新一次 guard 结果,超过 1 小时自动过期
353
+ - **required_skills 是建议**:AI 读到后应加载对应 skill,但 guard 本身不依赖 skill 是否被加载
354
+
355
+ ### 3.3 Guard Router
356
+
357
+ 文件路径到 guard 的映射,定义在 `scripts/guard_router.ts`:
358
+
359
+ ```typescript
360
+ const GUARD_MAP: Record<string, string[]> = {
361
+ "bridge_agent/": ["check_bridge_deps"],
362
+ "mcp-server/": ["check_mcp_parity"],
363
+ "mcp-server-node/": ["check_mcp_parity"],
364
+ "backend/": ["check_versions"],
365
+ "website/": ["check_doc_links"],
366
+
367
+ "docs/issues/": ["check_issue_closure", "check_doc_links"],
368
+ "docs/decisions/": ["check_doc_links"],
369
+ "docs/": ["check_doc_links"],
370
+
371
+ "CLAUDE.md": ["check_doc_links"],
372
+ ".boll/skills/": ["check_doc_links"],
373
+ ".boll/settings.json": ["check_hook_installed"],
374
+ ".githooks/": ["check_hook_installed"],
375
+ "scripts/checks/": ["check_versions"],
376
+ "scripts/coherence.ts": ["check_versions"],
377
+ "scripts/guard_router.ts": ["check_versions"],
378
+ "scripts/context-router.ts": ["check_fragment_integrity"],
379
+ "scripts/context-fragments/": ["check_fragment_integrity"],
380
+ };
381
+
382
+ const DEFAULT_GUARDS = ["check_doc_links"];
383
+ ```
384
+
385
+ Guard 命名沿用 PLAN-057 已建立的规范(`check_versions` 而非 `check_version_drift`)。
386
+
387
+ **`check_fragment_integrity.ts`** — guard 保护上下文片段自身不漂移(元层漂移的反漂移机制也需要被保护):
388
+
389
+ ```typescript
390
+ async function run(repoRoot: Path): Promise<Finding[]> {
391
+ const findings: Finding[] = [];
392
+ for (const name of allReferencedFragments(repoRoot)) {
393
+ const path = repoRoot / "scripts" / "context-fragments" / `${name}.md`;
394
+ if (!path.exists()) {
395
+ findings.push(new Finding({
396
+ severity: "P1",
397
+ category: "governance_bootstrap",
398
+ blocking: true,
399
+ message: `CONTEXT_MAP references fragment '${name}' but file missing`
400
+ }));
401
+ }
402
+ }
403
+
404
+ for (const path of (repoRoot / "scripts" / "context-fragments").glob("*.md")) {
405
+ const name = path.stem;
406
+ if (!allReferencedFragments(repoRoot).includes(name)) {
407
+ findings.push(new Finding({
408
+ severity: "P2",
409
+ category: "doc_integrity",
410
+ blocking: false,
411
+ message: `Fragment '${name}' exists but not referenced in CONTEXT_MAP`
412
+ }));
413
+ }
414
+ }
415
+
416
+ return findings;
417
+ }
418
+ ```
419
+
420
+ 新增 guard 只需:写 `scripts/checks/check_xxx.ts`,在 `GUARD_MAP` 注册路由。
421
+
422
+ ### 3.4 Category → Skill 映射
423
+
424
+ ```typescript
425
+ const CATEGORY_TO_SKILLS: Record<string, string[]> = {
426
+ "closure_semantics": ["lead", "bollharness-ops"],
427
+ "contract_drift": ["bollharness-dev", "bollharness-eng-test"],
428
+ "bridge_boundary": ["bollharness-bridge", "bollharness-ops"],
429
+ "policy_freeze": ["lead", "arch", "plan-lock"],
430
+ "doc_integrity": ["bollharness-ops"],
431
+ "version_drift": ["bollharness-ops"],
432
+ "artifact_linkage": ["lead"],
433
+ "governance_bootstrap": ["bollharness-ops"],
434
+ };
435
+ ```
436
+
437
+ 当 guard 发现问题时,`required_skills` 由 `CATEGORY_TO_SKILLS[finding.category]` 生成。AI 收到信号后加载这些 skill 获取完整的思维框架,而不是盲目修。
438
+
439
+ ### 3.4.1 Governance Reload 完整设计(Part B — 上下文工程)
440
+
441
+ > **这是 ADR-030 区别于标准 CI/CD 的核心贡献。**
442
+ >
443
+ > Enforcement plane(Part A)检查"产出对不对"——这是任何大公司都有的标准 CI。
444
+ > Governance Reload(Part B)解决"AI 做决策时窗口里有没有正确的知识"——这是 AI 开发时代的新问题。
445
+
446
+ #### 核心原理:上下文工程,不是 Prompt
447
+
448
+ ```
449
+ Prompt 思路: 写一套静态规则 → 希望 AI 记住 → 检查有没有遵守
450
+ 问题: 规则太多注意力稀释, 新会话可能没加载, AI 可以读完不照做
451
+
452
+ 上下文工程: 检测 AI 正在做什么 → 投影此刻相关的知识到窗口 → LLM 自然用它推理
453
+ 原理: Transformer 的工作方式就是用上下文中的信息来推理
454
+ 保障: 路由是代码(确定性),投影是脚本(自动),AI 不参与"要不要加载"的决策
455
+ ```
456
+
457
+ #### 两个机制
458
+
459
+ Governance Reload 由两个独立的机制组成,通过同一条管道(PostToolUse → stderr → exit 2)送达,但使用不同的输出标记以区分语义:
460
+
461
+ ```
462
+ AI 编辑文件
463
+
464
+ ├─→ 机制 A: 上下文路由(主动,每次编辑都做)
465
+ │ 输入: 被编辑的文件路径
466
+ │ 逻辑: context-router.ts 匹配路由表
467
+ │ 输出: 相关的上下文片段(精炼的思维框架,10-25 行)
468
+ │ 目的: 让 AI 在做决策时,窗口里有此刻需要的知识
469
+ │ 举例: 改 bridge → 注入 Bridge 宪法 5 条规则
470
+
471
+ └─→ 机制 B: Guard 检查 + Signal(被动,有问题才报)
472
+ 输入: 被编辑的文件路径 + diff
473
+ 逻辑: guard-router → 相关 check_*.ts
474
+ 输出: findings + required_skills + required_reads
475
+ 目的: 发现具体违规,指向需要补读的 skill/文档
476
+ 举例: issue 标 Fixed 但 prevention_status 缺失 → 报 P1 + 指向 lead skill
477
+ ```
478
+
479
+ 机制 A 是**主动的**——不管有没有问题都注入。改 bridge 代码时,Bridge 宪法出现在窗口里,AI 自然不会违反它。
480
+ 机制 B 是**被动的**——只在发现问题时才报。这是 Section 3.2 已有的 signal 协议。
481
+
482
+ **两者的关系**:机制 A 减少错误产生(AI 在正确的上下文下做决策),机制 B 兜住漏网的(有些错误即使有上下文也会犯,guard 拦住)。
483
+
484
+ #### 上下文路由表(`scripts/context-router.ts`)
485
+
486
+ ```typescript
487
+ const CONTEXT_MAP: Record<string, string[]> = {
488
+ "bridge_agent/": ["bridge-constitution"],
489
+ "backend/product/bridge/": ["bridge-constitution"],
490
+
491
+ "mcp-server/": ["mcp-parity"],
492
+ "mcp-server-node/": ["mcp-parity"],
493
+
494
+ "backend/product/routes/protocol.ts": ["protocol-consumers", "contract-consumers"],
495
+ "backend/product/protocol/": ["protocol-consumers"],
496
+
497
+ "backend/product/routes/": ["contract-consumers"],
498
+
499
+ "backend/product/db/crud_events.ts": ["run-events-consumers"],
500
+
501
+ "backend/product/auth/": ["auth-consumers"],
502
+
503
+ "backend/product/db/": ["db-shared-structures"],
504
+
505
+ "backend/product/catalyst/": ["catalyst-distributed"],
506
+
507
+ "docs/issues/": ["fixed-three-layers", "closure-checklist"],
508
+
509
+ "scenes/": ["scene-fidelity", "two-language"],
510
+ "website/app/[scene]/": ["scene-fidelity", "two-language"],
511
+ "website/components/scene/": ["scene-fidelity", "two-language"],
512
+
513
+ "CLAUDE.md": ["truth-source-hierarchy"],
514
+ "MEMORY.md": ["truth-source-hierarchy"],
515
+ "docs/INDEX.md": ["truth-source-hierarchy"],
516
+
517
+ "mcp-server/pyproject.toml": ["version-sources"],
518
+ "mcp-server-node/package.json": ["version-sources"],
519
+
520
+ "website/": ["two-language"],
521
+
522
+ "docs/decisions/": ["artifact-linkage"],
523
+ };
524
+
525
+ function match(filePath: string): string[] {
526
+ const matched: string[] = [];
527
+ for (const [pattern, fragments] of Object.entries(CONTEXT_MAP).sort((a, b) => b[0].length - a[0].length)) {
528
+ if (filePath.startsWith(pattern) || filePath.endsWith(pattern)) {
529
+ matched.push(...fragments);
530
+ }
531
+ }
532
+ return [...new Map(matched.map(f => [f, f])).keys()];
533
+ }
534
+
535
+ const FALLBACK_FRAGMENTS = ["general-dev-principles"];
536
+ ```
537
+
538
+ 路由表是确定性代码。新增一个领域 = 写一个片段文件 + 在路由表里加一条规则。
539
+
540
+ #### 上下文片段库(`scripts/context-fragments/`)
541
+
542
+ 每个片段是一个精炼的 Markdown 文件,设计原则:
543
+ - **短**:10-25 行,一屏看完,不稀释 AI 注意力
544
+ - **自足**:不需要跳转到其他文档就能理解
545
+ - **面向当前操作**:不是"这个领域的全部知识",而是"你正在改这个文件,这几件事必须知道"
546
+ - **可维护**:每个片段对应一个领域,独立更新
547
+
548
+ 示例片段 — `scripts/context-fragments/bridge-constitution.md`:
549
+ ```markdown
550
+ ## Bridge 宪法(ADR-026)
551
+
552
+ 你正在编辑 Bridge 相关代码。以下 5 条规则约束所有 bridge 改动:
553
+
554
+ 1. **Worker 不拥有业务解释权,只上报执行事实。** 如果代码需要理解输出内容的含义,它写错了地方。
555
+ 2. **同一个语义只允许有一个定义。** 文件名模式、artifact 类型、event 含义,只能在一个地方定义。
556
+ 3. **跑通了就发结果,没跑通就报 failed。** 不做 partial_success 抢救、不生成 placeholder。
557
+ 4. **生产不能是第一个集成环境。** 本地必须能用 fake CLI + 真实 HTTP backend 跑完整链。
558
+ 5. **新增观测维度或 event 类型,只改 server,不改 worker。**
559
+
560
+ 三层职责:`boll-run` 定义成功产物契约 → `worker` 执行和上报事实 → `server` 解释事实并生成产品语义。
561
+ ```
562
+
563
+ 示例片段 — `scripts/context-fragments/mcp-parity.md`:
564
+ ```markdown
565
+ ## MCP 双端一致性约定
566
+
567
+ 你正在编辑 MCP 相关代码。Python 和 Node 两端必须保持一致:
568
+
569
+ - **工具数量**:两端都是 54 个 @mcp.tool() / registerTool()
570
+ - **工具名称**:必须完全相同(boll_xxx)
571
+ - **行为语义**:相同输入必须产生相同输出结构
572
+ - **版本号**:pyproject.toml 和 package.json 版本必须一致
573
+
574
+ 对应文件映射:
575
+ - Python: `mcp-server/boll_mcp/server.ts` ↔ Node: `mcp-server-node/src/index.ts`
576
+ - Python: `mcp-server/boll_mcp/client.ts` ↔ Node: `mcp-server-node/src/client.ts`
577
+ - Python: `mcp-server/boll_mcp/config.ts` ↔ Node: `mcp-server-node/src/config.ts`
578
+
579
+ 改了一端后,检查另一端是否需要同步。Guard: `check_mcp_parity.ts`
580
+ ```
581
+
582
+ 示例片段 — `scripts/context-fragments/fixed-three-layers.md`:
583
+ ```markdown
584
+ ## Fixed 三层定义
585
+
586
+ 你正在编辑 issue 文档。"Fixed" 不等于"症状消失":
587
+
588
+ | 层级 | 含义 | 标准 | 标记 |
589
+ |------|------|------|------|
590
+ | Level 1 | 症状消失 | 生产不报错了 | Runtime Fixed |
591
+ | Level 2 | 复发路径关闭 | 有机制防止同类问题再次发生 | **Fixed**(最低标准) |
592
+ | Level 3 | 机制消灭 | 有 guard 自动检测 | Fixed + Guarded |
593
+
594
+ issue doc frontmatter 必须包含:
595
+ - `prevention_status: open | closed | not_applicable`
596
+ - `mechanism_layer: runtime | prevention | guard`
597
+
598
+ 如果标 Fixed 但 prevention_status 是 open → 不合格。Guard: `check_issue_closure.ts`
599
+ ```
600
+
601
+ 片段清单(初始集,覆盖 19 个审计 finding 的 5 个病因 + 高频变更区域):
602
+
603
+ | 片段文件 | 覆盖的病因 | 内容概要 |
604
+ |----------|-----------|----------|
605
+ | `bridge-constitution.md` | 边界模糊 | ADR-026 五条规则 + 三层职责 |
606
+ | `mcp-parity.md` | 多实现漂移 | 双端映射 + 同步约定 |
607
+ | `fixed-three-layers.md` | 真相漂移 | Fixed 定义 + frontmatter 要求 |
608
+ | `closure-checklist.md` | 真相漂移 | prevention_status 检查清单 |
609
+ | `protocol-consumers.md` | 多实现漂移 | /protocol/ API 的消费方列表 |
610
+ | `run-events-consumers.md` | 共享结构过载 | run_events 的 6 个消费方 + 角色 |
611
+ | `scene-fidelity.md` | 承诺 vs 现实 | scene 分级(real/demo/shell)|
612
+ | `two-language.md` | 承诺 vs 现实 | 协议语言 vs 用户语言 |
613
+ | `truth-source-hierarchy.md` | 元层漂移 | 真相源优先级 |
614
+ | `version-sources.md` | 真相漂移 | 所有版本号来源清单 |
615
+ | `artifact-linkage.md` | 真相漂移 | 代码变更必须伴随 artifact |
616
+ | `contract-consumers.md` | 多实现漂移 | 契约 vs 实现 + 消费方追踪 |
617
+ | `general-dev-principles.md` | 通用 | Guard > Memory + 一个事实一个定义 |
618
+ | `auth-consumers.md` | 多实现漂移 | SecondMe OAuth 消费方 + session 安全约定 |
619
+ | `db-shared-structures.md` | 共享结构过载 | DB 表的多消费方声明 + 迁移约定 |
620
+ | `catalyst-distributed.md` | 边界模糊 | 分布式协商约定 + 端侧 vs 平台侧职责 |
621
+
622
+ **扩展原则**:这是初始集,不是完整集。当某个代码区域反复出现同类错误时,应为其创建上下文片段并加入路由表。判断标准:如果 AI 在编辑该区域时"应该知道但反复不知道"某条规则,就需要一个片段。
623
+
624
+ #### `guard-feedback.ts` — PostToolUse 枢纽脚本
625
+
626
+ `guard-feedback.ts` 是 Governance Reload 的实际执行入口。它同时承担上下文路由和 guard 检查两个职责:
627
+
628
+ ```typescript
629
+ #!/usr/bin/env node
630
+ import * as fs from 'fs';
631
+ import * as path from 'path';
632
+ import { match, loadFragment, FALLBACK_FRAGMENTS } from './context_router';
633
+ import { GUARD_MAP, runGuards } from './guard_router';
634
+ import { writeSessionSignal } from './signal_writer';
635
+
636
+ async function main() {
637
+ const filePath = process.env.TOOL_FILE_PATH || '';
638
+ if (!filePath) return;
639
+
640
+ const repoRoot = process.env.REPO_ROOT || '.';
641
+ const relPath = path.relative(repoRoot, filePath);
642
+
643
+ const outputParts: string[] = [];
644
+
645
+ const fragments = match(relPath) || FALLBACK_FRAGMENTS;
646
+ const contextParts: string[] = [];
647
+ for (const name of fragments) {
648
+ const content = loadFragment(name);
649
+ if (content) contextParts.push(content);
650
+ }
651
+ if (contextParts.length) {
652
+ outputParts.push("## Context\n\n" + contextParts.join("\n\n"));
653
+ }
654
+
655
+ const findings = await runGuards(relPath);
656
+ if (findings.length) {
657
+ outputParts.push(formatFindings(findings));
658
+ writeSessionSignal(findings);
659
+ }
660
+
661
+ if (outputParts.length) {
662
+ console.error("---\n" + outputParts.join("\n---\n"));
663
+ process.exit(2);
664
+ }
665
+ }
666
+
667
+ function formatFindings(findings: Finding[]): string {
668
+ const lines = ["## Guard Findings\n"];
669
+ for (const f of findings) {
670
+ lines.push(`- **${f.severity}** [${f.category}]: ${f.message}`);
671
+ if (f.required_skills?.length) {
672
+ lines.push(` → 建议加载: ${f.required_skills.join(', ')}`);
673
+ }
674
+ if (f.required_reads?.length) {
675
+ lines.push(` → 建议参考: ${f.required_reads.join(', ')}`);
676
+ }
677
+ }
678
+ return lines.join('\n');
679
+ }
680
+
681
+ main().catch(console.error);
682
+ ```
683
+
684
+ #### Claude Code Hook 配置
685
+
686
+ ```json
687
+ // .boll/settings.json
688
+ {
689
+ "hooks": {
690
+ "PostToolUse": [
691
+ {
692
+ "matcher": "Edit|Write",
693
+ "command": "npx ts-node scripts/guard-feedback.ts"
694
+ }
695
+ ]
696
+ }
697
+ }
698
+ ```
699
+
700
+ Claude Code 在 AI 每次调用 Edit 或 Write 工具后自动执行 `guard-feedback.ts`。脚本输出到 stderr + exit 2,内容被 Claude Code 注入 AI 的对话上下文。AI 的下一步推理,窗口里已经有了相关的思维框架。
701
+
702
+ #### Codex Adapter
703
+
704
+ Codex 没有原生 PostToolUse hook。实现同等效果的路径(按优先级):
705
+
706
+ 1. **Codex task wrapper**:在 Codex task 启动脚本中注入 `guard-feedback.ts` 调用
707
+ 2. **Filesystem watcher**:监听工作目录文件变更,变更后调用 `guard-feedback.ts`,输出写入 `.boll/guard/session-*.json`,Codex 读取
708
+ 3. **Pre-task 注入**:在 Codex task description 中包含"先运行 `npx ts-node scripts/guard-feedback.ts --file {file}`"的指令
709
+
710
+ 无论哪条路径,核心脚本相同(`scripts/guard-feedback.ts`),差异只在触发方式。
711
+
712
+ **诚实声明**:以上三条路径均为候选,尚未验证 Codex 实际支持哪一条。Phase 2 开始时必须先做 Codex 能力调研(支持哪些 hook/plugin/watcher 机制),确定可行路径后再实现。如果 Codex 当前不支持任何主动推送机制,则在 Phase 2 完成标准中标注"待 Codex 支持后交付",并持续跟踪 Codex 新功能。**不接受**静默降级为"Codex 被动可读"。
713
+
714
+ #### 与 Enforcement Plane 的关系
715
+
716
+ ```
717
+ Governance Reload(Layer 5) Enforcement(Layer 6)
718
+ ──────────────────────────── ──────────────────────
719
+ 时机: 编辑时(即时,1-2 秒) 时机: 提交/合并/部署时
720
+ 目的: 让 AI 在正确的上下文下做决策 目的: 阻止错误产出进入代码库
721
+ 方式: 投影相关知识到 AI 窗口 方式: 检查产物格式 + exit ≠ 0
722
+ 效果: 从源头减少错误产生 效果: 兜底拦住漏网的
723
+ 依赖: Claude Code hooks / Codex adapter 依赖: git hooks / GitHub Actions(通用)
724
+ ```
725
+
726
+ 两层独立运作,互补而非替代:
727
+ - Governance Reload 只要有效运作,到达 Enforcement 时的问题数量大幅减少
728
+ - 即使 Governance Reload 完全失效(hook 没装、Codex 没 adapter),Enforcement 仍然拦住所有 blocking 问题
729
+
730
+ #### 可维护性
731
+
732
+ 新增一个领域的治理:
733
+ 1. 写一个上下文片段文件 `scripts/context-fragments/xxx.md`(10-25 行)
734
+ 2. 在 `CONTEXT_MAP` 里加一条路由规则
735
+ 3. (可选)写一个 `scripts/checks/check_xxx.ts` guard
736
+ 4. (可选)在 `CATEGORY_TO_SKILLS` 里加一条映射
737
+
738
+ 删除一个过时的治理:
739
+ 1. 删除片段文件
740
+ 2. 从 `CONTEXT_MAP` 移除路由
741
+ 3. 下次 guard 跑不到就自然失效
742
+
743
+ 这满足用户要求 #1(显式强调——机制入口在每次 Edit 后自动触发)和"其本身也是可维护的"。
744
+
745
+ ### 3.5 触发点
746
+
747
+ | 触发点 | 机制 | Guard 范围 | 平面 | 阻断判定 | 覆盖 |
748
+ |--------|------|-----------|------|---------|------|
749
+ | **Session-start** | Claude Code `PreToolUse` hook (first `Read` only) | 不跑新 guard,只读现有 session 文件 | Feedback | Advisory(stderr 输出) | Claude Code |
750
+ | **Post-edit** | Claude Code `PostToolUse` hook | 增量(改动文件相关 guard) | Feedback | Advisory(stderr + exit 2) | Claude Code |
751
+ | **Pre-commit** | `.githooks/pre-commit` | `--staged_only` + `check_artifact_link` (presence) | Enforcement | **Hard — 拦 `blocking: true`** | 通用 |
752
+ | **Commit-msg** | `.githooks/commit-msg` | `check_bugfix_binding`(message + staged files) | Enforcement | **Hard — 拦 bugfix 无 issue doc** | 通用 |
753
+ | **Deploy** | `deploy.sh` | 全量 | Enforcement | **Hard — 拦 P0** | 通用 |
754
+ | **Remote CI** | GitHub Actions `coherence.yml` (required check) | 全量 + bugfix binding | Enforcement | **Hard — PR 不过不能 merge** | 通用(不可绕过) |
755
+
756
+ **阻断逻辑**:
757
+
758
+ ```typescript
759
+ function shouldBlock(findings: Finding[], stage: string): boolean {
760
+ if (stage === "deploy") {
761
+ return findings.some(f => f.severity === "P0");
762
+ }
763
+ if (["pre-commit", "commit-msg", "remote-ci"].includes(stage)) {
764
+ return findings.some(f => f.blocking);
765
+ }
766
+ return false;
767
+ }
768
+ ```
769
+
770
+ **Post-edit 信号闭环**:
771
+
772
+ ```
773
+ AI 编辑文件
774
+ → PostToolUse hook 触发 guard-feedback.ts
775
+ → guard-feedback.ts 通过 guard router 跑相关 guard
776
+ → 写 .boll/guard/session-{pid}.json
777
+ → 如果有 finding:stderr 输出摘要 + exit 2
778
+ → AI 收到 stderr 反馈
779
+ → 反馈中包含 required_skills
780
+ → AI 加载对应 skill,获取完整思维上下文
781
+ → 带着正确思维框架去修问题
782
+ ```
783
+
784
+ **Session-start 早期感知**:
785
+
786
+ ```
787
+ 新 session 打开
788
+ → AI 首次使用 Read 工具
789
+ → PreToolUse hook 触发 guard-feedback.ts --check-only --once
790
+ → 读 .boll/guard/ 下所有 session 文件(不跑新 guard)
791
+ → 如果有 blocking finding:stderr 输出摘要
792
+ → 写 .boll/guard/.session-notified-{pid} 标记,同一 session 不重复通知
793
+ → AI 知道 repo 当前有 blocking 问题,优先处理
794
+ ```
795
+
796
+ Session-start 触发是 advisory,不是硬阻断。其价值是减少浪费(避免在已有 blocker 时做无效规划),不是防止错误(那是 pre-commit/deploy 的事)。
797
+
798
+ ### 3.6 Closure Semantics
799
+
800
+ #### Issue 文档格式(Convention)
801
+
802
+ `docs/issues/*.md` 必须使用 YAML frontmatter:
803
+
804
+ ```markdown
805
+ ---
806
+ title: Bridge node missing execution files
807
+ date: 2026-03-21
808
+ status: Fixed
809
+ prevention_status: closed
810
+ guard_status: exists
811
+ problem_class: contract
812
+ guard_ref: check_bridge_deps
813
+ ---
814
+
815
+ ## 问题描述
816
+ ...
817
+ ```
818
+
819
+ 字段定义:
820
+
821
+ | 字段 | 必填 | 值域 | 含义 |
822
+ |------|------|------|------|
823
+ | `title` | 是 | 自由文本 | 问题标题 |
824
+ | `date` | 是 | YYYY-MM-DD | 发现日期 |
825
+ | `status` | 是 | Open, Runtime-Fixed, Fixed, Fixed+Guarded | 当前状态 |
826
+ | `prevention_status` | 是 | open, closed, not_applicable | 预防机制是否存在 |
827
+ | `guard_status` | 是 | missing, exists, not_applicable | 自动化检测是否存在 |
828
+ | `problem_class` | 是 | policy, contract, implementation | 问题所在的架构层 |
829
+ | `guard_ref` | 条件 | guard 脚本名 | `guard_status=exists` 时必填 |
830
+ | `scope` | 推荐 | 代码目录列表 | 受影响的代码路径(用于 artifact linkage scope binding,见 3.9) |
831
+
832
+ #### Status 语义(新增到 CLAUDE.md)
833
+
834
+ ```
835
+ - Runtime-Fixed: 现网症状已消除,生产验证通过。
836
+ 复发路径尚未关闭。
837
+ - Fixed: 预防机制已存在于 repo 中
838
+ (runbook step / guard / automation)。
839
+ 同一失败模式不能通过同一路径再次发生。
840
+ - Fixed+Guarded: 自动化检测已存在于
841
+ scripts/checks/。未来回归会被 coherence runner 捕获。
842
+ ```
843
+
844
+ #### Guard 解析
845
+
846
+ `check_issue_closure.ts` 使用 YAML frontmatter 解析,不做 prose scraping:
847
+
848
+ ```typescript
849
+ import * as yaml from 'js-yaml';
850
+ import * as fs from 'fs';
851
+
852
+ function parseIssueFrontmatter(filePath: string): Record<string, unknown> | null {
853
+ const text = fs.readFileSync(filePath, 'utf-8');
854
+ if (!text.startsWith("---")) return null;
855
+ const parts = text.split("---", 2);
856
+ if (parts.length < 3) return null;
857
+ return yaml.load(parts[1]) as Record<string, unknown>;
858
+ }
859
+ ```
860
+
861
+ ### 3.7 Multi-session Coordination
862
+
863
+ 4-5 个并行上下文窗口的协调通过 per-session 文件实现:
864
+
865
+ ```
866
+ .boll/guard/
867
+ ┌──────────────────────────────────┐
868
+ │ session-1234.json (Session A) │
869
+ │ session-5678.json (Session B) │
870
+ │ session-9012.json (Session C) │
871
+ └──────────────────────────────────┘
872
+
873
+ ┌─────────┼─────────┐
874
+ │ reads │ reads │ reads
875
+ │ all │ all │ all
876
+ ▼ ▼ ▼
877
+ Session A Session B Session C
878
+ ```
879
+
880
+ **为什么不用单个 `latest.json`**:
881
+
882
+ Session A 发现 P1 → 写入 latest.json → Session B 运行 guard 无发现 → 覆写 latest.json → Session A 的 P1 消失 → 假绿。
883
+
884
+ Per-session 文件消除竞态:每个进程只写自己的文件,不碰别人的。读的时候 union 所有文件。文件系统是天然的无锁共享层。
885
+
886
+ 过期清理(> 1 小时)防止死 session 残留累积。
887
+
888
+ ### 3.8 Bootstrap Protocol
889
+
890
+ Git 不会自动执行 repo 中的 hook 文件。`.githooks/pre-commit` 和 `.githooks/commit-msg` checked into repo 不等于它们会被执行。
891
+
892
+ **`check_hook_installed.ts`** — 用 guard 保障 guard 基础设施本身:
893
+
894
+ ```typescript
895
+ import { execSync } from 'child_process';
896
+
897
+ async function run(repoRoot: Path): Promise<Finding[]> {
898
+ try {
899
+ const result = execSync('git config core.hooksPath', { cwd: repoRoot, encoding: 'utf-8' });
900
+ const hooksPath = result.stdout.trim();
901
+ if (hooksPath === ".githooks") return [];
902
+ } catch {}
903
+
904
+ const legacyHook = repoRoot / ".git" / "hooks" / "pre-commit";
905
+ if (legacyHook.is_symlink() && ".githooks" in legacyHook.resolve().toString()) {
906
+ return [];
907
+ }
908
+
909
+ return [new Finding({
910
+ severity: "P0",
911
+ category: "governance_bootstrap",
912
+ blocking: true,
913
+ message: "Pre-commit hook not active. Run: git config core.hooksPath .githooks",
914
+ required_skills: ["bollharness-ops"],
915
+ })];
916
+ }
917
+ ```
918
+
919
+ **自举链**:
920
+
921
+ ```
922
+ Claude Code 启动
923
+ → 加载 .boll/settings.json(Claude Code 自动行为,不需手动)
924
+ → PostToolUse hook 配置指向 guard-feedback.ts
925
+ → AI 首次编辑文件 → guard-feedback.ts 跑
926
+ → check_hook_installed 发现 git hook 未安装 → P0 blocking
927
+ → AI 收到 stderr 反馈 → 执行 git config core.hooksPath .githooks
928
+ → 此后所有 commit 经过 pre-commit hook
929
+ ```
930
+
931
+ **非 Claude Code 环境**:手动 git commit 时如果 hook 未安装,deploy.sh 全量 coherence 会拦住。hook 未安装的代码可以 commit,但无法部署。
932
+
933
+ ### 3.9 Artifact Linkage
934
+
935
+ **问题**:`check_issue_closure.ts` 只在 issue 文件被 staged 时检查合规性。如果开发者只改代码不碰 issue doc,guard 根本不触发。
936
+
937
+ Artifact linkage 分两个阶段实现,当前阶段和增强阶段解决不同层次的问题:
938
+
939
+ #### Phase 3: Presence Gate(当前)
940
+
941
+ 强制代码变更伴随**某个** issue/plan artifact。打破"纯代码提交零文档"的模式。
942
+
943
+ **`check_artifact_link.ts`**:
944
+
945
+ ```typescript
946
+ const CODE_DIRS = ["backend/", "bridge_agent/", "mcp-server/", "mcp-server-node/", "website/"];
947
+ const ARTIFACT_PREFIXES = ["docs/issues/", "docs/decisions/PLAN-", "docs/decisions/ADR-"];
948
+
949
+ async function run(stagedFiles: string[]): Promise<Finding[]> {
950
+ const codeFiles = stagedFiles.filter(f => CODE_DIRS.some(d => f.startsWith(d)));
951
+ if (!codeFiles.length) return [];
952
+
953
+ if (codeFiles.every(f => f.toLowerCase().includes("test"))) {
954
+ return [];
955
+ }
956
+
957
+ const hasArtifact = stagedFiles.some(f => ARTIFACT_PREFIXES.some(p => f.startsWith(p)));
958
+ if (!hasArtifact) {
959
+ return [new Finding({
960
+ severity: "P1",
961
+ category: "artifact_linkage",
962
+ blocking: true,
963
+ message: "Code changes staged without an associated issue/plan document.",
964
+ required_skills: ["lead"],
965
+ })];
966
+ }
967
+ return [];
968
+ }
969
+ ```
970
+
971
+ **诚实的局限**:presence gate 只检查"有没有 artifact 陪跑",不检查"是不是正确的 artifact"。开发者可以 stage 一个不相关的旧 issue doc 来满足门禁。这是 Phase 3 的已知 tradeoff:它消除了最常见的失败模式(纯代码提交),但不能防止刻意绕过。
972
+
973
+ #### Phase 4+: Scope Binding(增强)
974
+
975
+ Issue/plan frontmatter 的 `scope` 字段声明受影响的代码路径。Guard 验证 staged 代码路径与 artifact 声明的 scope 匹配。
976
+
977
+ Issue frontmatter 示例:
978
+
979
+ ```yaml
980
+ ---
981
+ title: Bridge node missing execution files
982
+ date: 2026-03-21
983
+ status: Fixed
984
+ prevention_status: closed
985
+ guard_status: exists
986
+ problem_class: contract
987
+ guard_ref: check_bridge_deps
988
+ scope:
989
+ - bridge_agent/
990
+ - backend/product/bridge/
991
+ ---
992
+ ```
993
+
994
+ 增强后的 `check_artifact_link.ts`:
995
+
996
+ ```typescript
997
+ async function runWithScope(stagedFiles: string[]): Promise<Finding[]> {
998
+ // ... presence check (same as Phase 3) ...
999
+
1000
+ const artifactFiles = stagedFiles.filter(f => ARTIFACT_PREFIXES.some(p => f.startsWith(p)));
1001
+ const declaredScopes = new Set<string>();
1002
+ for (const af of artifactFiles) {
1003
+ const fm = parseFrontmatter(Path(af));
1004
+ if (fm && "scope" in fm) {
1005
+ (fm.scope as string[]).forEach(s => declaredScopes.add(s));
1006
+ }
1007
+ }
1008
+
1009
+ const unlinked = codeFiles.filter(f => !declaredScopes.has(s => f.startsWith(s)));
1010
+ if (unlinked.length) {
1011
+ return [new Finding({
1012
+ severity: "P1",
1013
+ category: "artifact_linkage",
1014
+ blocking: true,
1015
+ message: `Code files ${unlinked.slice(0, 3)} not covered by any staged artifact's scope.`,
1016
+ required_skills: ["lead"],
1017
+ })];
1018
+ }
1019
+ return [];
1020
+ }
1021
+ ```
1022
+
1023
+ **Phase 4+ 不在本 ADR 的初始实现范围内**,但 `scope` 字段现在就定义到 frontmatter 规范中(见 3.6),为增强预留接口。Phase 3 的 presence gate 是可接受的起步。
1024
+
1025
+ #### Closure 链路(Phase 3 → Phase 4 渐进)
1026
+
1027
+ 两种 artifact 走不同的 closure 路径——不能假装 PLAN/ADR 会触发 closure 检查:
1028
+
1029
+ ```
1030
+ Phase 3 — presence gate:
1031
+ 代码变更 → check_artifact_link 要求伴随某个 artifact(pre-commit)
1032
+
1033
+ 路径 A(issue doc staged):
1034
+ → check_issue_closure 检查 YAML frontmatter
1035
+ → 必须包含 prevention_status + guard_status
1036
+ → 违反 → blocking: true → pre-commit 拦住
1037
+ → ✅ 完整 closure 链路
1038
+
1039
+ 路径 B(PLAN/ADR staged):
1040
+ → presence gate 通过
1041
+ → ⚠️ 无 closure 检查 — PLAN/ADR 没有 prevention_status 字段
1042
+ → 对功能开发足够,对 bugfix 不够
1043
+
1044
+ Phase 4 — bugfix binding + scope binding:
1045
+ commit-msg hook:
1046
+ → commit message 含 fix/bugfix/hotfix/incident
1047
+ → 必须走路径 A(强制 issue doc)
1048
+ → ✅ bugfix closure 链路关闭
1049
+
1050
+ scope binding:
1051
+ → artifact frontmatter 的 scope 必须覆盖 staged 代码路径
1052
+ → 不相关的 artifact 不再被接受
1053
+ ```
1054
+
1055
+ Phase 3 路径 B 的缺口是已知的过渡状态。Phase 4 通过 `commit-msg` hook 和 scope binding 关闭。
1056
+
1057
+ 这是 lead 流程 Gate 1(规划 → 产物: PLAN 文档)的机械化。
1058
+
1059
+ ### 3.10 Tool Scope and Non-Claude Fallback
1060
+
1061
+ 本 ADR 的覆盖范围对不同层有不同承诺:
1062
+
1063
+ | 层 | 覆盖范围 | 非 Claude 环境行为 |
1064
+ |----|---------|-------------------|
1065
+ | Convention (L1) | 通用 | CLAUDE.md、issue frontmatter 格式对任何开发者/工具可见 |
1066
+ | Guard (L2) | 通用 | 纯 TypeScript 脚本,`npx ts-node scripts/coherence.ts` 任何环境可跑 |
1067
+ | Signal (L3) | 通用 | JSON 文件,人或任何工具可读可解析 |
1068
+ | Trigger - hard (L4) | 通用 | `pre-commit` + `deploy.sh` 只依赖 git + shell |
1069
+ | Trigger - advisory (L4) | Claude Code native, Codex adapter-based | Claude Code: PostToolUse/PreToolUse; Codex: adapter/watcher 主动推送 |
1070
+ | Governance Reload (L5) | Claude Code native, Codex adapter-based; both active | 两者都必须有即时本地反馈,触发方式不同但效果相同 |
1071
+ | Blocking Gates (L6) | 通用 | git hooks + shell |
1072
+
1073
+ **各环境覆盖矩阵**:
1074
+
1075
+ | 环境 | Feedback Plane | Enforcement Local | Enforcement Remote |
1076
+ |------|---------------|-------------------|-------------------|