@attalabs/vinaya 0.4.3 → 0.4.5

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 (262) hide show
  1. package/aeg-root/enforcement.md +1 -1
  2. package/aeg-root/state-machine.md +1 -1
  3. package/dist/checks/bin/check-branch-topology.js +55 -33
  4. package/dist/checks/bin/check-brief-shape.js +61 -34
  5. package/dist/checks/bin/check-closes-n.js +55 -33
  6. package/dist/checks/bin/check-coherence.js +55 -33
  7. package/dist/checks/bin/check-dead-branch-push.js +55 -33
  8. package/dist/checks/bin/check-dispatch-readiness.js +55 -33
  9. package/dist/checks/bin/check-doc-coverage-push.js +232 -36
  10. package/dist/checks/bin/check-doc-coverage.js +232 -36
  11. package/dist/checks/bin/check-first-push-dispatch.js +55 -33
  12. package/dist/checks/bin/check-issue-assignment.js +55 -33
  13. package/dist/checks/bin/check-no-disk-state.js +55 -33
  14. package/dist/checks/bin/check-reader-resolvable-prose.js +55 -33
  15. package/dist/checks/bin/check-registry-gates.js +55 -33
  16. package/dist/checks/bin/check-review-gate.js +233 -38
  17. package/dist/checks/bin/check-single-plan-pr.js +55 -33
  18. package/dist/checks/bin/check-test-plan.js +55 -33
  19. package/dist/index.js +138 -42
  20. package/package.json +1 -1
  21. package/studio-standalone/.worktrees/fix/bump-0.4.4/.vinaya/projects.md +63 -0
  22. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/aeg-manual-flow.md +216 -0
  23. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
  24. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/brief-developer.md +140 -0
  25. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/developer-reviewer.md +106 -0
  26. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/planner-brief.md +130 -0
  27. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/reviewer-archivist.md +96 -0
  28. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/tranche-archivist-planner.md +116 -0
  29. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/coordination.md +293 -0
  30. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/documentation-coherence.md +65 -0
  31. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/enforcement.md +161 -0
  32. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/glossary.md +36 -0
  33. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/process.md +371 -0
  34. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/reviewer-prompt.md +68 -0
  35. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/archivist.md +167 -0
  36. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/brief-author.md +108 -0
  37. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/developer.md +429 -0
  38. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/planner.md +285 -0
  39. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/principal.md +107 -0
  40. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/reviewer.md +130 -0
  41. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/security.md +121 -0
  42. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/tranche-archivist.md +257 -0
  43. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/aeg/SKILL.md +90 -0
  44. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/aeg-roles/SKILL.md +58 -0
  45. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/brief-authoring/SKILL.md +497 -0
  46. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/state-machine.md +656 -0
  47. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/brief-template.md +103 -0
  48. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/issue-rationale-template.md +35 -0
  49. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/pr-report-template.md +68 -0
  50. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranche-model.md +306 -0
  51. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
  52. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
  53. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
  54. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
  55. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
  56. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
  57. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
  58. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
  59. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
  60. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
  61. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
  62. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
  63. package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
  64. package/studio-standalone/.worktrees/fix/bump-0.4.4/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
  65. package/studio-standalone/.worktrees/fix/bump-0.4.4/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
  66. package/studio-standalone/.worktrees/fix/bump-0.4.4/vinaya.config.json +36 -0
  67. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/.vinaya/projects.md +63 -0
  68. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/aeg-manual-flow.md +216 -0
  69. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
  70. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/brief-developer.md +140 -0
  71. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/developer-reviewer.md +106 -0
  72. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/planner-brief.md +130 -0
  73. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/reviewer-archivist.md +96 -0
  74. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/tranche-archivist-planner.md +116 -0
  75. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/coordination.md +293 -0
  76. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/documentation-coherence.md +65 -0
  77. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/enforcement.md +161 -0
  78. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/glossary.md +36 -0
  79. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/process.md +371 -0
  80. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/reviewer-prompt.md +68 -0
  81. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/archivist.md +167 -0
  82. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/brief-author.md +108 -0
  83. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/developer.md +429 -0
  84. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/planner.md +285 -0
  85. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/principal.md +107 -0
  86. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/reviewer.md +130 -0
  87. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/security.md +121 -0
  88. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/tranche-archivist.md +257 -0
  89. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/aeg/SKILL.md +90 -0
  90. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/aeg-roles/SKILL.md +58 -0
  91. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/brief-authoring/SKILL.md +497 -0
  92. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/state-machine.md +656 -0
  93. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/brief-template.md +103 -0
  94. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/issue-rationale-template.md +35 -0
  95. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/pr-report-template.md +68 -0
  96. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranche-model.md +306 -0
  97. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
  98. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
  99. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
  100. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
  101. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
  102. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
  103. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
  104. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
  105. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
  106. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
  107. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
  108. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
  109. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
  110. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
  111. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
  112. package/studio-standalone/.worktrees/fix/check-lifecycle-phase/vinaya.config.json +36 -0
  113. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/.vinaya/projects.md +63 -0
  114. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/aeg-manual-flow.md +216 -0
  115. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
  116. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/brief-developer.md +140 -0
  117. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/developer-reviewer.md +106 -0
  118. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/planner-brief.md +130 -0
  119. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/reviewer-archivist.md +96 -0
  120. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/tranche-archivist-planner.md +116 -0
  121. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/coordination.md +293 -0
  122. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/documentation-coherence.md +65 -0
  123. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/enforcement.md +161 -0
  124. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/glossary.md +36 -0
  125. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/process.md +371 -0
  126. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/reviewer-prompt.md +68 -0
  127. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/archivist.md +167 -0
  128. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/brief-author.md +108 -0
  129. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/developer.md +429 -0
  130. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/planner.md +285 -0
  131. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/principal.md +107 -0
  132. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/reviewer.md +130 -0
  133. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/security.md +121 -0
  134. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/tranche-archivist.md +257 -0
  135. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg/SKILL.md +90 -0
  136. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg-roles/SKILL.md +58 -0
  137. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/brief-authoring/SKILL.md +497 -0
  138. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/state-machine.md +656 -0
  139. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/brief-template.md +103 -0
  140. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/issue-rationale-template.md +35 -0
  141. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/pr-report-template.md +68 -0
  142. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranche-model.md +306 -0
  143. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
  144. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
  145. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
  146. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
  147. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
  148. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
  149. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
  150. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
  151. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
  152. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
  153. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
  154. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
  155. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
  156. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
  157. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
  158. package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/vinaya.config.json +36 -0
  159. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/.vinaya/projects.md +63 -0
  160. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/aeg-manual-flow.md +216 -0
  161. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
  162. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/brief-developer.md +140 -0
  163. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/developer-reviewer.md +106 -0
  164. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/planner-brief.md +130 -0
  165. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/reviewer-archivist.md +96 -0
  166. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/tranche-archivist-planner.md +116 -0
  167. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/coordination.md +293 -0
  168. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/documentation-coherence.md +65 -0
  169. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/enforcement.md +161 -0
  170. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/glossary.md +36 -0
  171. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/process.md +371 -0
  172. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/reviewer-prompt.md +68 -0
  173. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/archivist.md +167 -0
  174. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/brief-author.md +108 -0
  175. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/developer.md +429 -0
  176. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/planner.md +285 -0
  177. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/principal.md +107 -0
  178. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/reviewer.md +130 -0
  179. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/security.md +121 -0
  180. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/tranche-archivist.md +257 -0
  181. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg/SKILL.md +90 -0
  182. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg-roles/SKILL.md +58 -0
  183. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/brief-authoring/SKILL.md +497 -0
  184. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/state-machine.md +656 -0
  185. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/brief-template.md +103 -0
  186. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/issue-rationale-template.md +35 -0
  187. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/pr-report-template.md +68 -0
  188. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranche-model.md +306 -0
  189. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
  190. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
  191. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
  192. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
  193. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
  194. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
  195. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
  196. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
  197. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
  198. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
  199. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
  200. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
  201. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
  202. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
  203. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
  204. package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/vinaya.config.json +36 -0
  205. package/studio-standalone/_node_modules/@atta/vinaya-cli/aeg-root/enforcement.md +1 -1
  206. package/studio-standalone/_node_modules/@atta/vinaya-cli/aeg-root/state-machine.md +1 -1
  207. package/studio-standalone/_node_modules/@attalabs/vinaya/aeg-root/enforcement.md +1 -1
  208. package/studio-standalone/_node_modules/@attalabs/vinaya/aeg-root/state-machine.md +1 -1
  209. package/studio-standalone/apps/vinaya/cli/aeg-root/enforcement.md +1 -1
  210. package/studio-standalone/apps/vinaya/cli/aeg-root/state-machine.md +1 -1
  211. package/studio-standalone/apps/vinaya/web/.next/BUILD_ID +1 -1
  212. package/studio-standalone/apps/vinaya/web/.next/build-manifest.json +3 -3
  213. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/cli/page.js.nft.json +1 -1
  214. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/config/page.js.nft.json +1 -1
  215. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/cli/page.js.nft.json +1 -1
  216. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/harness/page.js.nft.json +1 -1
  217. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/state-machine/page.js.nft.json +1 -1
  218. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/[...slug]/page.js.nft.json +1 -1
  219. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/reference/page.js.nft.json +1 -1
  220. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/page.js.nft.json +1 -1
  221. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/install/page.js.nft.json +1 -1
  222. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/page.js.nft.json +1 -1
  223. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/roadmap/page.js.nft.json +1 -1
  224. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/archive/page.js.nft.json +1 -1
  225. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/brief/page.js.nft.json +1 -1
  226. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/develop/page.js.nft.json +1 -1
  227. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/overview/page.js.nft.json +1 -1
  228. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/page.js.nft.json +1 -1
  229. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/plan/page.js.nft.json +1 -1
  230. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/quick/page.js.nft.json +1 -1
  231. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/review/page.js.nft.json +1 -1
  232. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/security/page.js.nft.json +1 -1
  233. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/wrap-up/page.js.nft.json +1 -1
  234. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/state-machine/page.js.nft.json +1 -1
  235. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-harness/page.js.nft.json +1 -1
  236. package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-studio/page.js.nft.json +1 -1
  237. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  238. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.html +1 -1
  239. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.rsc +1 -1
  240. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  241. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  242. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  243. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  244. package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  245. package/studio-standalone/apps/vinaya/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  246. package/studio-standalone/apps/vinaya/web/.next/server/app/api/coherence/route.js.nft.json +1 -1
  247. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/backlog/page.js.nft.json +1 -1
  248. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/[...slug]/page.js.nft.json +1 -1
  249. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/page.js.nft.json +1 -1
  250. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/page.js.nft.json +1 -1
  251. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/page.js.nft.json +1 -1
  252. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js.nft.json +1 -1
  253. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js.nft.json +1 -1
  254. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/page.js.nft.json +1 -1
  255. package/studio-standalone/apps/vinaya/web/.next/server/app/studio/tranches/page.js.nft.json +1 -1
  256. package/studio-standalone/apps/vinaya/web/.next/server/chunks/ssr/[root-of-the-server]__0kqmrho._.js +1 -1
  257. package/studio-standalone/apps/vinaya/web/.next/server/chunks/ssr/[root-of-the-server]__1dxaovd._.js +2 -2
  258. package/studio-standalone/apps/vinaya/web/.next/server/middleware-build-manifest.js +3 -3
  259. package/studio-standalone/apps/vinaya/web/.next/server/pages/500.html +1 -1
  260. /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_buildManifest.js +0 -0
  261. /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_clientMiddlewareManifest.js +0 -0
  262. /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_ssgManifest.js +0 -0
@@ -1448,12 +1448,16 @@ function isCodeFile(p) {
1448
1448
  var WAIVER_LABEL = label("waiver-docs");
1449
1449
  var WAIVER_LABEL_REVIEW = label("waiver-review");
1450
1450
  var PRINCIPAL_ALLOWLIST = ["daniboomerang"];
1451
+ function isPrincipal(login, principalAllowlist) {
1452
+ if (login === null)
1453
+ return false;
1454
+ const normalized = login.toLowerCase();
1455
+ return principalAllowlist.some((p) => p.toLowerCase() === normalized);
1456
+ }
1451
1457
  function isWaiverLabelActorVerified(opts) {
1452
1458
  if (!opts.labels.includes(opts.label))
1453
1459
  return false;
1454
- if (opts.labelActor === null)
1455
- return false;
1456
- return opts.principalAllowlist.includes(opts.labelActor);
1460
+ return isPrincipal(opts.labelActor, opts.principalAllowlist);
1457
1461
  }
1458
1462
 
1459
1463
  // ../../../packages/aeg-core/src/doc-owners.ts
@@ -1641,6 +1645,27 @@ function overrideActive(opts) {
1641
1645
  // ../../../packages/aeg-core/src/premise-check.ts
1642
1646
  var ASSERTION_KINDS = new Set(["contains", "absent", "sha256"]);
1643
1647
 
1648
+ // ../../../packages/aeg-core/src/test-plan-section.ts
1649
+ var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
1650
+ var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
1651
+ var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
1652
+ function locateTestPlanSection(body) {
1653
+ const region = anchoredRegion(body, "TEST-PLAN");
1654
+ if (region !== null)
1655
+ return { found: true, section: region };
1656
+ const headingMatch = HEADING_FORM_RE.exec(body);
1657
+ const match = headingMatch ?? INLINE_FORM_RE.exec(body);
1658
+ if (!match || match.index === undefined)
1659
+ return { found: false };
1660
+ const sectionBody = body.slice(match.index);
1661
+ const firstLineEnd = sectionBody.indexOf(`
1662
+ `);
1663
+ const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
1664
+ const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
1665
+ const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
1666
+ return { found: true, section: sectionBody.slice(0, sectionEnd) };
1667
+ }
1668
+
1644
1669
  // ../../../packages/aeg-core/src/brief-validation.ts
1645
1670
  function headerRegion(prBody) {
1646
1671
  const m = prBody.match(/^##\s/m);
@@ -1679,10 +1704,15 @@ function checkTierField(prBody, readTier) {
1679
1704
  };
1680
1705
  }
1681
1706
  var TEST_PLAN_UNIT_TESTS_ONLY_RE = /(?:\*\*)?Test Plan(?:\*\*)?\s*:\s*(?:\*\*)?\s*unit-tests-only/i;
1707
+ function testPlanRegion(prBody) {
1708
+ const located = locateTestPlanSection(prBody);
1709
+ return located.found ? located.section : prBody;
1710
+ }
1682
1711
  function checkTestPlan(prBody) {
1683
- if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(prBody))
1712
+ const region = testPlanRegion(prBody);
1713
+ if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
1684
1714
  return { status: "pass", errors: [] };
1685
- if (/\*\*\[(?:agent|principal)\]\*\*/.test(prBody))
1715
+ if (/\*\*\[(?:agent|principal)\]\*\*/.test(region))
1686
1716
  return { status: "pass", errors: [] };
1687
1717
  return {
1688
1718
  status: "fail",
@@ -1692,9 +1722,10 @@ function checkTestPlan(prBody) {
1692
1722
  };
1693
1723
  }
1694
1724
  function checkTestPlanExclusivity(prBody) {
1695
- if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(prBody))
1725
+ const region = testPlanRegion(prBody);
1726
+ if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
1696
1727
  return { status: "pass", errors: [] };
1697
- if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(prBody)) {
1728
+ if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(region)) {
1698
1729
  return {
1699
1730
  status: "fail",
1700
1731
  errors: [
@@ -1705,8 +1736,9 @@ function checkTestPlanExclusivity(prBody) {
1705
1736
  return { status: "pass", errors: [] };
1706
1737
  }
1707
1738
  function checkPrincipalPlaceholder(prBody) {
1739
+ const region = testPlanRegion(prBody);
1708
1740
  const lineRe = /^-\s*\[[ xX]\]\s*\*{2}\[principal\]\*{2}(.*)$/gim;
1709
- for (const m of prBody.matchAll(lineRe)) {
1741
+ for (const m of region.matchAll(lineRe)) {
1710
1742
  const content = m[1] ?? "";
1711
1743
  if (/^\s*None\b/i.test(content)) {
1712
1744
  return {
@@ -1785,6 +1817,15 @@ function checkClosesN(prBody) {
1785
1817
  errors: ["brief-validation Closes #N: no `Closes #<N>` (or Fixes/Resolves) reference found in the PR body."]
1786
1818
  };
1787
1819
  }
1820
+ var BRIEF_SHAPE_MARKERS = [checkSurfaceMap, checkDocUpdateList, checkStopConditions, checkAutonomyClause];
1821
+ var TASK_BRANCH_PATTERN = /^task\/[^/]+\/[^/]+$/;
1822
+ function isTaskBranch(branch) {
1823
+ return TASK_BRANCH_PATTERN.test(branch);
1824
+ }
1825
+ function isBriefShaped(prBody) {
1826
+ const stripped = stripCode(prBody);
1827
+ return BRIEF_SHAPE_MARKERS.filter((check) => check(stripped).status === "pass").length >= 2;
1828
+ }
1788
1829
  function checkBriefSections(prBody, readTier, options = {}) {
1789
1830
  const { requireClosesN = true } = options;
1790
1831
  const results = [
@@ -2154,11 +2195,12 @@ function isReviewGateExemptBranch(branch) {
2154
2195
  return branch.startsWith("plan/");
2155
2196
  }
2156
2197
  function checkReviewGate(input) {
2198
+ const principalAllowlist = input.principalAllowlist ?? PRINCIPAL_ALLOWLIST;
2157
2199
  const waived = isWaiverLabelActorVerified({
2158
2200
  label: WAIVER_LABEL_REVIEW,
2159
2201
  labels: input.labels,
2160
2202
  labelActor: input.waiverLabelActor,
2161
- principalAllowlist: PRINCIPAL_ALLOWLIST
2203
+ principalAllowlist
2162
2204
  });
2163
2205
  if (waived) {
2164
2206
  return {
@@ -2167,8 +2209,8 @@ function checkReviewGate(input) {
2167
2209
  waived: true
2168
2210
  };
2169
2211
  }
2170
- const verified = input.comments.filter((c) => c.author !== null && PRINCIPAL_ALLOWLIST.includes(c.author));
2171
- const ignoredCount = input.comments.filter((c) => (c.author === null || !PRINCIPAL_ALLOWLIST.includes(c.author)) && c.body.includes("VERDICT")).length;
2212
+ const verified = input.comments.filter((c) => isPrincipal(c.author, principalAllowlist));
2213
+ const ignoredCount = input.comments.filter((c) => !isPrincipal(c.author, principalAllowlist) && c.body.includes("VERDICT")).length;
2172
2214
  const verifiedBodies = verified.map((c) => c.body);
2173
2215
  const codeReview = extractCodeReviewVerdict(verifiedBodies);
2174
2216
  const security = extractSecurityReviewVerdict(verifiedBodies);
@@ -2721,28 +2763,8 @@ function decideIssueAssignment(input) {
2721
2763
  reason: `First push of \`${branch}\` — assigning Issue #${issue} to @${login} (the authenticated pusher).`
2722
2764
  };
2723
2765
  }
2724
- // ../../../packages/aeg-core/src/test-plan-section.ts
2725
- var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
2726
- var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
2727
- var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
2728
- function locateTestPlanSection(body) {
2729
- const region = anchoredRegion(body, "TEST-PLAN");
2730
- if (region !== null)
2731
- return { found: true, section: region };
2732
- const headingMatch = HEADING_FORM_RE.exec(body);
2733
- const match = headingMatch ?? INLINE_FORM_RE.exec(body);
2734
- if (!match || match.index === undefined)
2735
- return { found: false };
2736
- const sectionBody = body.slice(match.index);
2737
- const firstLineEnd = sectionBody.indexOf(`
2738
- `);
2739
- const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
2740
- const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
2741
- const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
2742
- return { found: true, section: sectionBody.slice(0, sectionEnd) };
2743
- }
2744
2766
  // ../../../packages/aeg-core/src/test-plan-gate.ts
2745
- var TASK_BRANCH_PATTERN = /^task\/[^/]+\/[^/]+$/;
2767
+ var TASK_BRANCH_PATTERN2 = /^task\/[^/]+\/[^/]+$/;
2746
2768
  function evaluateTestPlanGate(body, branch) {
2747
2769
  if (!body) {
2748
2770
  return {
@@ -2755,7 +2777,7 @@ function evaluateTestPlanGate(body, branch) {
2755
2777
  }
2756
2778
  const located = locateTestPlanSection(body);
2757
2779
  if (!located.found) {
2758
- if (TASK_BRANCH_PATTERN.test(branch)) {
2780
+ if (TASK_BRANCH_PATTERN2.test(branch)) {
2759
2781
  return {
2760
2782
  verdict: "fail",
2761
2783
  messages: [
package/dist/index.js CHANGED
@@ -532,6 +532,27 @@ function parsePremiseBlock(prBody) {
532
532
  return assertions;
533
533
  }
534
534
 
535
+ // ../../../packages/aeg-core/src/test-plan-section.ts
536
+ var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
537
+ var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
538
+ var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
539
+ function locateTestPlanSection(body) {
540
+ const region = anchoredRegion(body, "TEST-PLAN");
541
+ if (region !== null)
542
+ return { found: true, section: region };
543
+ const headingMatch = HEADING_FORM_RE.exec(body);
544
+ const match = headingMatch ?? INLINE_FORM_RE.exec(body);
545
+ if (!match || match.index === undefined)
546
+ return { found: false };
547
+ const sectionBody = body.slice(match.index);
548
+ const firstLineEnd = sectionBody.indexOf(`
549
+ `);
550
+ const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
551
+ const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
552
+ const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
553
+ return { found: true, section: sectionBody.slice(0, sectionEnd) };
554
+ }
555
+
535
556
  // ../../../packages/aeg-core/src/brief-validation.ts
536
557
  function headerRegion(prBody) {
537
558
  const m = prBody.match(/^##\s/m);
@@ -570,10 +591,15 @@ function checkTierField(prBody, readTier) {
570
591
  };
571
592
  }
572
593
  var TEST_PLAN_UNIT_TESTS_ONLY_RE = /(?:\*\*)?Test Plan(?:\*\*)?\s*:\s*(?:\*\*)?\s*unit-tests-only/i;
594
+ function testPlanRegion(prBody) {
595
+ const located = locateTestPlanSection(prBody);
596
+ return located.found ? located.section : prBody;
597
+ }
573
598
  function checkTestPlan(prBody) {
574
- if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(prBody))
599
+ const region = testPlanRegion(prBody);
600
+ if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
575
601
  return { status: "pass", errors: [] };
576
- if (/\*\*\[(?:agent|principal)\]\*\*/.test(prBody))
602
+ if (/\*\*\[(?:agent|principal)\]\*\*/.test(region))
577
603
  return { status: "pass", errors: [] };
578
604
  return {
579
605
  status: "fail",
@@ -583,9 +609,10 @@ function checkTestPlan(prBody) {
583
609
  };
584
610
  }
585
611
  function checkTestPlanExclusivity(prBody) {
586
- if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(prBody))
612
+ const region = testPlanRegion(prBody);
613
+ if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
587
614
  return { status: "pass", errors: [] };
588
- if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(prBody)) {
615
+ if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(region)) {
589
616
  return {
590
617
  status: "fail",
591
618
  errors: [
@@ -596,8 +623,9 @@ function checkTestPlanExclusivity(prBody) {
596
623
  return { status: "pass", errors: [] };
597
624
  }
598
625
  function checkPrincipalPlaceholder(prBody) {
626
+ const region = testPlanRegion(prBody);
599
627
  const lineRe = /^-\s*\[[ xX]\]\s*\*{2}\[principal\]\*{2}(.*)$/gim;
600
- for (const m of prBody.matchAll(lineRe)) {
628
+ for (const m of region.matchAll(lineRe)) {
601
629
  const content = m[1] ?? "";
602
630
  if (/^\s*None\b/i.test(content)) {
603
631
  return {
@@ -1219,6 +1247,9 @@ function printJson(data) {
1219
1247
  function realDeps2() {
1220
1248
  return { detectRepo: detectGitRepo };
1221
1249
  }
1250
+ function defaultSleep(ms) {
1251
+ return new Promise((resolve) => setTimeout(resolve, ms));
1252
+ }
1222
1253
  var COMMAND_TIMEOUT_MS = 20000;
1223
1254
  var DEAD_BRANCH_LABEL = label("dead-branch-push");
1224
1255
  var DEAD_BRANCH_MARKER = `<!-- ${DEAD_BRANCH_LABEL} -->`;
@@ -1364,6 +1395,18 @@ function fetchAssociatedMergedPrs(sha, repoFlag) {
1364
1395
  const prs = JSON.parse(out);
1365
1396
  return prs.filter((pr) => pr.merged_at !== null).map((pr) => pr.number);
1366
1397
  }
1398
+ var DIRECT_PUSH_POLL_ATTEMPTS = 6;
1399
+ var DIRECT_PUSH_POLL_DELAY_MS = 20000;
1400
+ async function pollAssociatedMergedPrs(sha, repoFlag, fetch, attempts, delayMs, sleep) {
1401
+ for (let attempt = 1;attempt <= attempts; attempt++) {
1402
+ const prs = fetch(sha, repoFlag);
1403
+ if (prs.length > 0)
1404
+ return prs;
1405
+ if (attempt < attempts)
1406
+ await sleep(delayMs);
1407
+ }
1408
+ return [];
1409
+ }
1367
1410
  function incidentAlreadyOpen(sha, repoFlag) {
1368
1411
  const out = sh2([
1369
1412
  "gh",
@@ -1412,11 +1455,11 @@ function openDirectPushIncident(sha, repoFlag) {
1412
1455
  DIRECT_PUSH_LABEL
1413
1456
  ]);
1414
1457
  }
1415
- function runDirectMainPushCheck(sha, repoFlag) {
1416
- const associatedMergedPrNumbers = fetchAssociatedMergedPrs(sha, repoFlag);
1458
+ async function runDirectMainPushCheck(sha, repoFlag, deps) {
1459
+ const associatedMergedPrNumbers = await pollAssociatedMergedPrs(sha, repoFlag, deps.fetchAssociatedMergedPrs ?? fetchAssociatedMergedPrs, deps.pollAttempts ?? DIRECT_PUSH_POLL_ATTEMPTS, deps.pollDelayMs ?? DIRECT_PUSH_POLL_DELAY_MS, deps.sleep ?? defaultSleep);
1417
1460
  const result = checkDirectMainPush({ sha, associatedMergedPrNumbers });
1418
1461
  if (result.verdict === "direct-push") {
1419
- openDirectPushIncident(sha, repoFlag);
1462
+ (deps.openDirectPushIncident ?? openDirectPushIncident)(sha, repoFlag);
1420
1463
  return { verdict: "direct-push" };
1421
1464
  }
1422
1465
  return { verdict: "legitimate", mergedPrNumber: result.mergedPrNumber };
@@ -1452,7 +1495,7 @@ async function runAudit(args, deps) {
1452
1495
  const repoFlag = `${repo.owner}/${repo.repo}`;
1453
1496
  const sha = parseSha(args) ?? sh2(["git", "rev-parse", "HEAD"]);
1454
1497
  const deadBranch = only === "direct-push" ? { scanned: 0, findings: [] } : runDeadBranchAudit(repoFlag);
1455
- const directPush = only === "dead-branches" ? null : runDirectMainPushCheck(sha, repoFlag);
1498
+ const directPush = only === "dead-branches" ? null : await runDirectMainPushCheck(sha, repoFlag, deps);
1456
1499
  const failed = directPush?.verdict === "direct-push";
1457
1500
  if (jsonOutput) {
1458
1501
  printJson({
@@ -1531,7 +1574,10 @@ function coreCheckRegistry() {
1531
1574
  run: bin("check-brief-shape"),
1532
1575
  scope: "diff",
1533
1576
  timeoutMs: 15000,
1534
- env: { PR_BODY: { optional: true } }
1577
+ env: {
1578
+ PR_BODY: { optional: true },
1579
+ BRANCH: { optional: true }
1580
+ }
1535
1581
  },
1536
1582
  {
1537
1583
  name: "doc-coverage",
@@ -1543,7 +1589,10 @@ function coreCheckRegistry() {
1543
1589
  PR_BODY: { optional: true },
1544
1590
  PR_BODY_FILE: { optional: true },
1545
1591
  PR_LABELS: { optional: true },
1546
- WAIVER_LABEL_ACTOR: { optional: true }
1592
+ WAIVER_LABEL_ACTOR: { optional: true },
1593
+ GITHUB_REPOSITORY: { optional: true },
1594
+ GITHUB_TOKEN: { optional: true },
1595
+ GH_TOKEN: { optional: true }
1547
1596
  }
1548
1597
  },
1549
1598
  {
@@ -1575,6 +1624,7 @@ function coreCheckRegistry() {
1575
1624
  run: bin("check-closes-n"),
1576
1625
  scope: "diff",
1577
1626
  timeoutMs: 15000,
1627
+ requiresOpenPr: true,
1578
1628
  env: {
1579
1629
  BRANCH: { optional: true },
1580
1630
  PR_BODY: { optional: true },
@@ -1600,6 +1650,7 @@ function coreCheckRegistry() {
1600
1650
  run: bin("check-test-plan"),
1601
1651
  scope: "diff",
1602
1652
  timeoutMs: 15000,
1653
+ requiresOpenPr: true,
1603
1654
  env: {
1604
1655
  PR_BODY: { optional: true },
1605
1656
  BRANCH: { optional: true }
@@ -1631,6 +1682,7 @@ function coreCheckRegistry() {
1631
1682
  env: {
1632
1683
  BRANCH: { optional: true },
1633
1684
  PR_NUMBER: { optional: true },
1685
+ GITHUB_REPOSITORY: { optional: true },
1634
1686
  GITHUB_TOKEN: { optional: true },
1635
1687
  GH_TOKEN: { optional: true }
1636
1688
  }
@@ -1681,7 +1733,10 @@ function coreCheckRegistry() {
1681
1733
  PR_BODY: { optional: true },
1682
1734
  PR_BODY_FILE: { optional: true },
1683
1735
  PR_LABELS: { optional: true },
1684
- WAIVER_LABEL_ACTOR: { optional: true }
1736
+ WAIVER_LABEL_ACTOR: { optional: true },
1737
+ GITHUB_REPOSITORY: { optional: true },
1738
+ GITHUB_TOKEN: { optional: true },
1739
+ GH_TOKEN: { optional: true }
1685
1740
  }
1686
1741
  },
1687
1742
  {
@@ -1760,6 +1815,8 @@ function isCheckError(value) {
1760
1815
  return v.schema === CHECK_SCHEMA_VERSION && typeof v.check === "string" && (v.severity === "error" || v.severity === "warning") && typeof v.message === "string" && typeof v.agent_recovery_prompt === "string";
1761
1816
  }
1762
1817
  function shouldSkip(spec, opts) {
1818
+ if (opts.localOnly && spec.requiresOpenPr)
1819
+ return true;
1763
1820
  if (spec.scope !== "diff")
1764
1821
  return false;
1765
1822
  if (!opts.diffOnly)
@@ -2020,7 +2077,8 @@ var CheckEntrySchema = z.object({
2020
2077
  include: z.array(z.string()).optional(),
2021
2078
  args: z.array(z.string()).optional(),
2022
2079
  timeoutMs: z.number().optional(),
2023
- env: z.record(z.string(), EnvEntrySchema).optional()
2080
+ env: z.record(z.string(), EnvEntrySchema).optional(),
2081
+ requiresOpenPr: z.boolean().optional()
2024
2082
  }).superRefine((entry2, ctx) => {
2025
2083
  if (!entry2.env)
2026
2084
  return;
@@ -2127,7 +2185,8 @@ var VinayaConfigSchema = z.object({
2127
2185
  }).optional(),
2128
2186
  checks: z.record(z.string(), CheckEntrySchema).optional(),
2129
2187
  briefSchema: BriefSchemaSchema.optional(),
2130
- managed: ManagedManifestSchema.optional()
2188
+ managed: ManagedManifestSchema.optional(),
2189
+ principals: z.array(z.string()).min(1).optional()
2131
2190
  });
2132
2191
  var GLOBAL_VINAYA_HOME = join4(homedir(), ".vinaya");
2133
2192
  var GLOBAL_CONFIG_PATH = join4(GLOBAL_VINAYA_HOME, "config.json");
@@ -2155,11 +2214,22 @@ function configPath() {
2155
2214
  function globalChecksIgnoredWarning(path) {
2156
2215
  return `${path}: "checks" registration in the global config is ignored — checks may only be registered from a repo-local vinaya.config.json.`;
2157
2216
  }
2158
- function stripGlobalChecks(config, path) {
2159
- if (path !== GLOBAL_CONFIG_PATH || !config.checks || Object.keys(config.checks).length === 0)
2217
+ function globalPrincipalsIgnoredWarning(path) {
2218
+ return `${path}: "principals" in the global config is ignored — principals may only be declared from a repo-local vinaya.config.json.`;
2219
+ }
2220
+ function stripGlobalOnlyKeys(config, path) {
2221
+ if (path !== GLOBAL_CONFIG_PATH)
2160
2222
  return config;
2161
- console.error(`⚠ ${globalChecksIgnoredWarning(path)}`);
2162
- return { ...config, checks: undefined };
2223
+ let result = config;
2224
+ if (result.checks && Object.keys(result.checks).length > 0) {
2225
+ console.error(`⚠ ${globalChecksIgnoredWarning(path)}`);
2226
+ result = { ...result, checks: undefined };
2227
+ }
2228
+ if (result.principals && result.principals.length > 0) {
2229
+ console.error(`⚠ ${globalPrincipalsIgnoredWarning(path)}`);
2230
+ result = { ...result, principals: undefined };
2231
+ }
2232
+ return result;
2163
2233
  }
2164
2234
  function loadConfigChecked() {
2165
2235
  const path = configPath();
@@ -2176,7 +2246,7 @@ function loadConfigChecked() {
2176
2246
  const detail = parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ");
2177
2247
  return { ok: false, path, error: detail };
2178
2248
  }
2179
- return { ok: true, config: stripGlobalChecks(parsed.data, path) };
2249
+ return { ok: true, config: stripGlobalOnlyKeys(parsed.data, path) };
2180
2250
  }
2181
2251
 
2182
2252
  // src/commands/check.ts
@@ -2301,6 +2371,7 @@ function printClassificationWarnings(configChecks) {
2301
2371
  async function checkCommand(args) {
2302
2372
  const jsonOutput = args.includes("--json");
2303
2373
  const diffOnly = args.includes("--diff-only");
2374
+ const localOnly = args.includes("--local");
2304
2375
  const requestedParallel = parseParallel(args);
2305
2376
  const allRequested = args.includes("--all");
2306
2377
  const planRequested = args.includes("--plan");
@@ -2318,7 +2389,7 @@ async function checkCommand(args) {
2318
2389
  process.exit(result.failures.length > 0 ? 1 : 0);
2319
2390
  }
2320
2391
  if (!allRequested && !requestedName) {
2321
- console.error("Usage: vinaya check <name> | --all | --plan [--json] [--diff-only] [--parallel[=n]]");
2392
+ console.error("Usage: vinaya check <name> | --all | --plan [--json] [--diff-only] [--local] [--parallel[=n]]");
2322
2393
  process.exit(2);
2323
2394
  }
2324
2395
  const { specs: customSpecs, errorOutcome, checks: configChecks } = customSpecsFromConfig();
@@ -2333,7 +2404,8 @@ async function checkCommand(args) {
2333
2404
  parallel: requestedParallel ?? defaultParallelism(),
2334
2405
  diffOnly,
2335
2406
  changedFiles: changed,
2336
- defaultTimeoutMs: 30000
2407
+ defaultTimeoutMs: 30000,
2408
+ localOnly
2337
2409
  }) : [];
2338
2410
  const allOutcomes = errorOutcome ? [...outcomes, errorOutcome] : outcomes;
2339
2411
  for (const o of allOutcomes) {
@@ -2566,8 +2638,9 @@ async function demoBreakCommand(args) {
2566
2638
  }
2567
2639
 
2568
2640
  // src/commands/doctor.ts
2641
+ import { execFileSync as execFileSync6 } from "node:child_process";
2569
2642
  import { existsSync as existsSync8, readFileSync as readFileSync6, statSync } from "node:fs";
2570
- import { join as join8 } from "node:path";
2643
+ import { isAbsolute as isAbsolute2, join as join8 } from "node:path";
2571
2644
 
2572
2645
  // src/lib/artifacts.ts
2573
2646
  import { readFileSync as readFileSync3 } from "node:fs";
@@ -2608,7 +2681,7 @@ name: Vinaya Checks
2608
2681
 
2609
2682
  on:
2610
2683
  pull_request:
2611
- types: [opened, synchronize, reopened]
2684
+ types: [opened, synchronize, reopened, edited]
2612
2685
 
2613
2686
  jobs:
2614
2687
  vinaya-checks:
@@ -2629,6 +2702,11 @@ jobs:
2629
2702
  env:
2630
2703
  GH_TOKEN: \${{ secrets.GITHUB_TOKEN }}
2631
2704
  PR_NUMBER: \${{ github.event.pull_request.number }}
2705
+ # PR_BODY is what makes test-plan/closes-n EVALUATE: neither check
2706
+ # fetches the body itself (both read \`process.env.PR_BODY\` only) —
2707
+ # without it they read "no body — nothing to check" and pass
2708
+ # vacuously regardless of the PR's real content, on every run.
2709
+ PR_BODY: \${{ github.event.pull_request.body }}
2632
2710
  BRANCH: \${{ github.head_ref }}
2633
2711
  run: npx --yes @attalabs/vinaya check --all --diff-only
2634
2712
  `;
@@ -2676,7 +2754,7 @@ jobs:
2676
2754
  # the gate is green regardless of review state.
2677
2755
  PR_NUMBER: \${{ github.event.pull_request.number }}
2678
2756
  BRANCH: \${{ github.head_ref }}
2679
- run: npx --yes @attalabs/vinaya check --all
2757
+ run: npx --yes @attalabs/vinaya check review-gate
2680
2758
  `;
2681
2759
  }
2682
2760
  function reviewVerdictWorkflow() {
@@ -2861,11 +2939,11 @@ function ownVersion() {
2861
2939
  function preCommitBody() {
2862
2940
  return `# Vinaya commit-time gate. Runs the deterministic checks over your staged
2863
2941
  # diff before the commit lands.
2864
- npx --yes @attalabs/vinaya@${ownVersion()} check --all --diff-only || exit 1`;
2942
+ npx --yes @attalabs/vinaya@${ownVersion()} check --all --diff-only --local || exit 1`;
2865
2943
  }
2866
2944
  function prePushBody() {
2867
2945
  return `# Vinaya pre-push gate. Runs branch/dispatch checks before the push leaves.
2868
- npx --yes @attalabs/vinaya@${ownVersion()} check --all || exit 1`;
2946
+ npx --yes @attalabs/vinaya@${ownVersion()} check --all --local || exit 1`;
2869
2947
  }
2870
2948
  function doctrinePointer() {
2871
2949
  const doctrineRoot = join6(packageRoot(import.meta.url), "aeg-root");
@@ -3446,6 +3524,19 @@ function labelForPath(path) {
3446
3524
  return "doctrine-pointer";
3447
3525
  return "workflows";
3448
3526
  }
3527
+ function resolveManagedBlockPath(repoRoot, opPath) {
3528
+ if (!opPath.startsWith(".git/"))
3529
+ return join8(repoRoot, opPath);
3530
+ try {
3531
+ const commonDir = execFileSync6("git", ["-C", repoRoot, "rev-parse", "--git-common-dir"], {
3532
+ encoding: "utf8"
3533
+ }).trim();
3534
+ const gitDir = isAbsolute2(commonDir) ? commonDir : join8(repoRoot, commonDir);
3535
+ return join8(gitDir, opPath.slice(".git/".length));
3536
+ } catch {
3537
+ return join8(repoRoot, opPath);
3538
+ }
3539
+ }
3449
3540
  function diagnoseInstall(repoRoot, ctx, manifest) {
3450
3541
  const findings = [];
3451
3542
  let hasDrift = false;
@@ -3479,7 +3570,7 @@ function diagnoseInstall(repoRoot, ctx, manifest) {
3479
3570
  }
3480
3571
  } else if (op.kind === "managed-block") {
3481
3572
  const check = "hooks";
3482
- const abs2 = join8(repoRoot, op.path);
3573
+ const abs2 = resolveManagedBlockPath(repoRoot, op.path);
3483
3574
  const owned = ownedBlocks.has(blockKey(op.path, op.marker));
3484
3575
  if (!existsSync8(abs2)) {
3485
3576
  findings.push(owned ? error(check, `${op.path} is missing — likely a fresh clone (raw git hooks aren't tracked by git). Run \`vinaya upgrade\` to restore it.`) : info(check, `${op.path} is not installed.`));
@@ -4030,7 +4121,7 @@ async function initProductCommand(args) {
4030
4121
  }
4031
4122
 
4032
4123
  // src/commands/issue.ts
4033
- import { execFileSync as execFileSync6 } from "node:child_process";
4124
+ import { execFileSync as execFileSync7 } from "node:child_process";
4034
4125
 
4035
4126
  // src/lib/forge-write.ts
4036
4127
  import { mkdtempSync, rmSync as rmSync3, writeFileSync as writeFileSync6 } from "node:fs";
@@ -4243,7 +4334,7 @@ function locateBodyOrRefuse(ghArgs, retryCommand) {
4243
4334
  function fetchForgeLabels(issueRef) {
4244
4335
  let out;
4245
4336
  try {
4246
- out = execFileSync6("gh", ["issue", "view", issueRef, "--json", "labels"], {
4337
+ out = execFileSync7("gh", ["issue", "view", issueRef, "--json", "labels"], {
4247
4338
  encoding: "utf8",
4248
4339
  stdio: ["ignore", "pipe", "pipe"]
4249
4340
  });
@@ -4271,7 +4362,7 @@ function reportPass(json, command) {
4271
4362
  function runGhWrite(ghCmd, ghArgs, bodyResult, json) {
4272
4363
  const { finalArgs, cleanup: cleanup2 } = resolveShippableArgs(ghArgs, bodyResult);
4273
4364
  try {
4274
- const out = execFileSync6("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
4365
+ const out = execFileSync7("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
4275
4366
  const url = out.trim();
4276
4367
  if (json)
4277
4368
  printJson({ validated: true, written: true, url });
@@ -4375,12 +4466,12 @@ ${registration}
4375
4466
  }
4376
4467
 
4377
4468
  // src/commands/pr.ts
4378
- import { execFileSync as execFileSync7 } from "node:child_process";
4469
+ import { execFileSync as execFileSync8 } from "node:child_process";
4379
4470
  var RETRY_CREATE2 = "vinaya pr create --validate-only …";
4380
4471
  var RETRY_EDIT2 = "vinaya pr edit <n> --validate-only …";
4381
4472
  function git2(args) {
4382
4473
  try {
4383
- return execFileSync7("git", args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
4474
+ return execFileSync8("git", args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
4384
4475
  } catch {
4385
4476
  return "";
4386
4477
  }
@@ -4414,7 +4505,7 @@ function reportPass2(json, command) {
4414
4505
  function runGhWrite2(ghCmd, ghArgs, bodyResult, json) {
4415
4506
  const { finalArgs, cleanup: cleanup2 } = resolveShippableArgs(ghArgs, bodyResult);
4416
4507
  try {
4417
- const out = execFileSync7("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
4508
+ const out = execFileSync8("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
4418
4509
  const url = out.trim();
4419
4510
  if (json)
4420
4511
  printJson({ validated: true, written: true, url });
@@ -4428,7 +4519,7 @@ function runGhWrite2(ghCmd, ghArgs, bodyResult, json) {
4428
4519
  function fetchPrForgeContext(prRef) {
4429
4520
  let viewOut;
4430
4521
  try {
4431
- viewOut = execFileSync7("gh", ["pr", "view", prRef, "--json", "headRefName,files"], {
4522
+ viewOut = execFileSync8("gh", ["pr", "view", prRef, "--json", "headRefName,files"], {
4432
4523
  encoding: "utf8",
4433
4524
  stdio: ["ignore", "pipe", "pipe"]
4434
4525
  });
@@ -4524,7 +4615,7 @@ function prEditCommand(args) {
4524
4615
  }
4525
4616
 
4526
4617
  // src/commands/quickstart.ts
4527
- import { execFileSync as execFileSync8 } from "node:child_process";
4618
+ import { execFileSync as execFileSync9 } from "node:child_process";
4528
4619
  import { existsSync as existsSync14, readFileSync as readFileSync13 } from "node:fs";
4529
4620
  import { join as join15 } from "node:path";
4530
4621
 
@@ -4718,7 +4809,7 @@ function realDeps6() {
4718
4809
  };
4719
4810
  }
4720
4811
  function execGit(repoRoot, args) {
4721
- return execFileSync8("git", args, { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
4812
+ return execFileSync9("git", args, { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
4722
4813
  }
4723
4814
  function errorDetail(err) {
4724
4815
  const stderr = err.stderr;
@@ -5174,12 +5265,12 @@ async function upgradeCommand(args) {
5174
5265
  }
5175
5266
 
5176
5267
  // src/commands/waiver.ts
5177
- import { execFileSync as execFileSync9 } from "node:child_process";
5268
+ import { execFileSync as execFileSync10 } from "node:child_process";
5178
5269
  function labelFor(kind) {
5179
5270
  return kind === "docs" ? WAIVER_LABEL : WAIVER_LABEL_REVIEW;
5180
5271
  }
5181
5272
  function gh(args) {
5182
- return execFileSync9("gh", args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env: process.env }).trim();
5273
+ return execFileSync10("gh", args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env: process.env }).trim();
5183
5274
  }
5184
5275
  function detectPrNumber() {
5185
5276
  try {
@@ -5279,8 +5370,8 @@ Reason: ${reason}`];
5279
5370
  }
5280
5371
  process.stdout.write(`Applying \`${label2}\` to PR #${prNumber} under your authenticated \`gh\` identity — vinaya never fabricates an actor.
5281
5372
  `);
5282
- execFileSync9("gh", editArgs, { stdio: "inherit", env: process.env });
5283
- execFileSync9("gh", commentArgs, { stdio: "inherit", env: process.env });
5373
+ execFileSync10("gh", editArgs, { stdio: "inherit", env: process.env });
5374
+ execFileSync10("gh", commentArgs, { stdio: "inherit", env: process.env });
5284
5375
  process.stdout.write(`
5285
5376
  ✓ Label applied and reason posted as a PR comment.
5286
5377
  `);
@@ -5337,6 +5428,10 @@ var COMMANDS = [
5337
5428
  { flag: "--all", description: "Run every registered check instead of one named check" },
5338
5429
  { flag: "--json", description: "Enveloped JSON output (schema: 1)" },
5339
5430
  { flag: "--diff-only", description: "Scope diff-declared checks to changed files" },
5431
+ {
5432
+ flag: "--local",
5433
+ description: "Skip every requiresOpenPr check (closes-n, test-plan) — set by the generated hooks, never by CI"
5434
+ },
5340
5435
  { flag: "--parallel[=n]", description: "Concurrency cap (default: cpu-derived)" },
5341
5436
  {
5342
5437
  flag: "--plan",
@@ -5345,7 +5440,8 @@ var COMMANDS = [
5345
5440
  ],
5346
5441
  details: [
5347
5442
  "Each spawned check's child process sees only a fixed baseline (`PATH`, `LANG`, `HOME`, `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`, `TMPDIR`) plus whatever its `CheckSpec['env']` declaration explicitly forwards — never the full parent environment. A required (`true`) or unsatisfied `anyOf` declaration missing from the caller's environment synthesizes a `CheckError` before the check ever spawns. Declare `env` (a core check's own registration, or `vinaya.config.json`'s `checks.<name>.env` for a custom one) for any check that reads `process.env`/`Bun.env`/`Deno.env` directly — `vinaya doctor` carries the permanent diagnostic for one that doesn't.",
5348
- "`--plan` composes with `--json`. It requires zero env vars and never prints an env value — only how each one resolves (passthrough, optional, literal, or anyOf). A `FAIL_CLOSED` entry (a bare key with no namespace matching no core check) always renders inline rather than being dropped, and exits non-zero. `--plan` previews what the next minor's execution will enforce — `vinaya check` itself still runs the flat, unvalidated registry this release."
5443
+ "`--plan` composes with `--json`. It requires zero env vars and never prints an env value — only how each one resolves (passthrough, optional, literal, or anyOf). A `FAIL_CLOSED` entry (a bare key with no namespace matching no core check) always renders inline rather than being dropped, and exits non-zero. `--plan` previews what the next minor's execution will enforce — `vinaya check` itself still runs the flat, unvalidated registry this release.",
5444
+ "`--local` exists because a `requiresOpenPr` check (the core `closes-n`/`test-plan`, or a custom check declaring the same field) can only evaluate for real once a pull request exists — the generated `pre-commit`/`pre-push` hooks pass it so the first commit on a fresh task branch is never asked to satisfy a PR-body field before a PR can possibly exist. CI's `vinaya-checks.yml` omits it, so these checks always run for real once a PR is open."
5349
5445
  ],
5350
5446
  status: "shipped"
5351
5447
  },
@@ -5459,7 +5555,7 @@ var COMMANDS = [
5459
5555
  { flag: "--json", description: "Enveloped JSON output" }
5460
5556
  ],
5461
5557
  details: [
5462
- "Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it opens an incident Issue and exits 1 if a commit on `main` has no associated merged PR.",
5558
+ "Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it polls the merge-association API for up to ~100s before deciding, then opens an incident Issue and exits 1 if a commit on `main` genuinely has no associated merged PR.",
5463
5559
  "The same logic the generated `vinaya-archivist.yml` workflow's `daily-drift` and `direct-main-push-detection` jobs run on schedule / on every push to `main` — callable directly for a one-off run or local verification."
5464
5560
  ],
5465
5561
  status: "shipped"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@attalabs/vinaya",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "Vinaya — Agentic Engineering Harness. Deterministic checks every AI coding agent must satisfy before merge.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",