@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.10 → 0.1.26

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 (413) hide show
  1. package/bin/adl +2 -2
  2. package/bin/git +17 -18
  3. package/bin/git-ado +27 -26
  4. package/bin/git-defaults +173 -0
  5. package/bin/health-check +8 -1
  6. package/bin/kimi-hooks +1 -1
  7. package/bin/lib/adl-package.sh +257 -0
  8. package/bin/lib/bun-compile-build.sh +1 -1
  9. package/bin/lib/fleet-host.sh +62 -0
  10. package/bin/lib/lean-ctx-observe-hooks.sh +9 -9
  11. package/bin/reconcile +693 -470
  12. package/bin/reconcile-host +121 -0
  13. package/bin/setup +219 -0
  14. package/bin/shell-path-policy +15 -5
  15. package/bin/sync-and-reconcile +79 -68
  16. package/bin/validate-manifest +46 -51
  17. package/package.json +2 -12
  18. package/packages/agent-hooks/README.md +14 -9
  19. package/packages/agent-hooks/assets/hooks.json +0 -20
  20. package/packages/agent-hooks/package.json +1 -2
  21. package/packages/agent-hooks/src/cli/args.ts +1 -1
  22. package/packages/agent-hooks/src/cli/doctor.ts +6 -58
  23. package/packages/agent-hooks/src/deploy/deploy.ts +12 -41
  24. package/packages/agent-hooks/src/deploy/doctor.ts +8 -11
  25. package/packages/agent-hooks/src/deploy/index.ts +14 -14
  26. package/packages/agent-hooks/src/deploy/json-merge.ts +7 -8
  27. package/packages/agent-hooks/src/deploy/legacy-lock.ts +2 -2
  28. package/packages/agent-hooks/src/deploy/list.ts +1 -1
  29. package/packages/agent-hooks/src/deploy/lock.ts +31 -12
  30. package/packages/agent-hooks/src/deploy/profile.ts +3 -4
  31. package/packages/agent-hooks/src/deploy/source.ts +1 -1
  32. package/packages/agent-hooks/src/gating/config.ts +10 -24
  33. package/packages/agent-hooks/src/gating/root.ts +3 -3
  34. package/packages/agent-hooks/src/hooks/briefing/handler.ts +2 -2
  35. package/packages/agent-hooks/src/hooks/briefing/index.ts +27 -287
  36. package/packages/agent-hooks/src/hooks/contract.ts +17 -17
  37. package/packages/agent-hooks/src/hooks/crg/background.ts +27 -0
  38. package/packages/agent-hooks/src/hooks/crg/index.ts +7 -6
  39. package/packages/agent-hooks/src/hooks/log.ts +8 -10
  40. package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +1 -1
  41. package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +1 -1
  42. package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +6 -5
  43. package/packages/agent-hooks/src/hosts/registry.ts +1 -1
  44. package/packages/agent-hooks/src/log/adl-dir.ts +44 -0
  45. package/packages/agent-hooks/src/log/writer.ts +16 -2
  46. package/packages/agent-hooks/src/main.ts +7 -41
  47. package/packages/agent-hooks/src/pre-tool-use/handler.ts +71 -82
  48. package/packages/agent-hooks/src/rules/engine.ts +13 -17
  49. package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +3 -3
  50. package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +12 -14
  51. package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +28 -28
  52. package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +8 -9
  53. package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +56 -59
  54. package/packages/agent-hooks/src/rules/impl/adl-identity.ts +16 -23
  55. package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +19 -16
  56. package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +2 -2
  57. package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +9 -12
  58. package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +5 -7
  59. package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +411 -0
  60. package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +4 -5
  61. package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +6 -7
  62. package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +77 -70
  63. package/packages/agent-hooks/src/rules/impl/deny-allowlist.ts +159 -0
  64. package/packages/agent-hooks/src/rules/impl/fs-trash.ts +2 -2
  65. package/packages/agent-hooks/src/rules/impl/git-helpers.ts +21 -23
  66. package/packages/agent-hooks/src/rules/impl/git-worktree.ts +14 -28
  67. package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -3
  68. package/packages/agent-hooks/src/rules/impl/messages.ts +1 -1
  69. package/packages/agent-hooks/src/rules/impl/pr-completion.ts +1 -1
  70. package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +35 -46
  71. package/packages/agent-hooks/src/rules/impl/tool-find.ts +34 -7
  72. package/packages/agent-hooks/src/rules/impl/tool-grep.ts +34 -12
  73. package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +52 -9
  74. package/packages/agent-hooks/src/rules/ports.ts +5 -7
  75. package/packages/agent-hooks/src/rules/registry.ts +4 -6
  76. package/packages/agent-hooks/src/rules/shell/git-identity.ts +86 -101
  77. package/packages/agent-hooks/src/rules/shell/git-internals.ts +1 -1
  78. package/packages/agent-hooks/src/rules/shell/invocation.ts +24 -118
  79. package/packages/agent-hooks/src/rules/shell/piped-script.ts +1 -1
  80. package/packages/agent-hooks/src/rules/shell/prefixes.ts +1 -1
  81. package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +11 -10
  82. package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +26 -26
  83. package/packages/agent-hooks/src/rules/shell/substitution.ts +1 -1
  84. package/packages/agent-hooks/src/rules/shell/xargs.ts +2 -2
  85. package/packages/agent-hooks/src/rules/spec.ts +2 -2
  86. package/packages/agent-settings/README.md +287 -0
  87. package/packages/agent-settings/assets/GLOBAL-AGENTS.md +18 -18
  88. package/packages/agent-settings/assets/agents/architect.toml +2 -0
  89. package/packages/agent-settings/assets/agents/code-reviewer.toml +2 -0
  90. package/packages/agent-settings/assets/agents/executor.toml +2 -0
  91. package/packages/agent-settings/assets/agents/explore.toml +2 -0
  92. package/packages/agent-settings/assets/agents/planner.toml +2 -0
  93. package/packages/agent-settings/assets/mcp.json +0 -4
  94. package/packages/agent-settings/deploy-profile.json +139 -0
  95. package/packages/agent-settings/deploy-profile.schema.json +147 -0
  96. package/packages/agent-settings/managed/README.md +29 -30
  97. package/packages/agent-settings/managed/codex-requirements.toml +9 -9
  98. package/packages/agent-settings/package.json +20 -0
  99. package/packages/agent-settings/src/deploy/agent-render.ts +2 -2
  100. package/packages/agent-settings/src/deploy/agent-toml.ts +1 -1
  101. package/packages/agent-settings/src/deploy/agents-deploy.ts +17 -3
  102. package/packages/agent-settings/src/deploy/doctor.ts +3 -83
  103. package/packages/agent-settings/src/deploy/index.ts +6 -33
  104. package/packages/agent-settings/src/deploy/legacy-lock.ts +6 -6
  105. package/packages/agent-settings/src/deploy/list.ts +5 -19
  106. package/packages/agent-settings/src/deploy/lock.ts +8 -18
  107. package/packages/agent-settings/src/deploy/mcp-deploy.ts +10 -5
  108. package/packages/agent-settings/src/deploy/mcp-merge.ts +22 -3
  109. package/packages/agent-settings/src/deploy/mcp-source.ts +1 -1
  110. package/packages/agent-settings/src/deploy/profile.ts +11 -35
  111. package/packages/agent-settings/src/deploy/retire-lean-ctx.ts +184 -0
  112. package/packages/agent-settings/src/deploy/settings.ts +17 -22
  113. package/packages/agent-settings/src/global-surface-sweep.ts +5 -17
  114. package/packages/agent-settings/src/kimi-hooks.ts +339 -192
  115. package/packages/agent-settings/src/opencode-hooks.ts +1 -1
  116. package/packages/agent-settings/tsconfig.json +23 -0
  117. package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +120 -0
  118. package/packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh +276 -0
  119. package/packages/agent-skills/assets/debug-issue/SKILL.md +8 -7
  120. package/packages/agent-skills/assets/explore-codebase/SKILL.md +13 -13
  121. package/packages/agent-skills/assets/refactor-safely/SKILL.md +12 -11
  122. package/packages/agent-skills/assets/review-changes/SKILL.md +7 -7
  123. package/packages/agent-skills/assets/testing/references/e2e.md +37 -0
  124. package/packages/agent-skills/assets/testing/references/integration.md +37 -0
  125. package/packages/agent-skills/assets/testing/references/unit.md +32 -0
  126. package/packages/agent-skills/dist/deploy.d.ts +2 -0
  127. package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
  128. package/packages/agent-skills/dist/deploy.js +27 -1
  129. package/packages/agent-skills/dist/deploy.js.map +1 -1
  130. package/packages/agent-skills/dist/doctor.d.ts +0 -2
  131. package/packages/agent-skills/dist/doctor.d.ts.map +1 -1
  132. package/packages/agent-skills/dist/doctor.js +1 -1
  133. package/packages/agent-skills/dist/doctor.js.map +1 -1
  134. package/packages/agent-skills/dist/fs-utils.d.ts +0 -1
  135. package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -1
  136. package/packages/agent-skills/dist/fs-utils.js +1 -1
  137. package/packages/agent-skills/dist/fs-utils.js.map +1 -1
  138. package/packages/agent-skills/package.json +1 -1
  139. package/packages/agent-skills/src/deploy.ts +29 -1
  140. package/packages/agent-skills/src/doctor.ts +1 -1
  141. package/packages/agent-skills/src/fs-utils.ts +1 -1
  142. package/packages/azdo/README.md +10 -9
  143. package/packages/azdo/package.json +2 -5
  144. package/packages/azdo/src/azdo-pl.ts +2 -54
  145. package/packages/azdo/src/azdo-pr-review.ts +4 -4
  146. package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
  147. package/packages/azdo/src/azdo-wit.ts +41 -2
  148. package/packages/azdo/src/lib/agent-identity.ts +12 -14
  149. package/packages/azdo/src/lib/agent-token.ts +2 -2
  150. package/packages/azdo/src/lib/client.ts +0 -5
  151. package/packages/azdo/src/lib/graph-identity.ts +4 -4
  152. package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
  153. package/packages/azdo/src/workflow-rules.ts +128 -0
  154. package/packages/fleet/manifest.json +38 -33
  155. package/packages/fleet/manifest.schema.json +67 -65
  156. package/packages/fleet/src/default-agent-file.ts +3 -3
  157. package/packages/fleet/src/install-adl-package.ts +73 -15
  158. package/packages/fleet/src/install-embedding-model.ts +14 -14
  159. package/packages/fleet/src/managed-settings.ts +7 -7
  160. package/packages/fleet/src/repo-maintain.ts +439 -0
  161. package/packages/fleet/src/scratch-reap.ts +6 -6
  162. package/packages/fleet/src/vscode-settings.ts +5 -5
  163. package/packages/repo-controls/README.md +141 -43
  164. package/packages/repo-controls/assets/promote.ts +4 -4
  165. package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
  166. package/packages/repo-controls/assets/version-bump.sh +31 -84
  167. package/packages/repo-controls/bunfig.toml +6 -7
  168. package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
  169. package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
  171. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
  172. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
  173. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
  174. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
  175. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
  176. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/c.md +1 -0
  177. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/d.md +1 -0
  178. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
  179. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
  180. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
  181. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
  182. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
  183. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
  184. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/sub/nested.md +1 -0
  185. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
  186. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
  187. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
  188. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
  189. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
  190. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
  191. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
  192. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
  193. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
  194. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
  195. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
  196. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
  197. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-001-tenancy.md +1 -0
  198. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-002-carrier.md +1 -0
  199. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-003-cli.md +1 -0
  200. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-old.md +1 -0
  201. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-older.md +1 -0
  202. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
  203. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
  204. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
  205. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
  206. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-01.md +1 -0
  207. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-02.md +1 -0
  208. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-03.md +1 -0
  209. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-04.md +1 -0
  210. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-05.md +1 -0
  211. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-06.md +1 -0
  212. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-07.md +1 -0
  213. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-08.md +1 -0
  214. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-09.md +1 -0
  215. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-10.md +1 -0
  216. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-11.md +1 -0
  217. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-12.md +1 -0
  218. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-13.md +1 -0
  219. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-14.md +1 -0
  220. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-15.md +1 -0
  221. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-16.md +1 -0
  222. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
  223. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
  224. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
  225. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
  226. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
  227. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
  228. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
  229. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
  230. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
  231. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/a.md +1 -0
  232. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/b.md +1 -0
  233. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/c.md +1 -0
  234. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/d.md +1 -0
  235. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/e.md +1 -0
  236. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
  237. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/a.md +1 -0
  238. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/b.md +1 -0
  239. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/c.md +1 -0
  240. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/short/only.md +1 -0
  241. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
  242. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
  243. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
  244. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
  245. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
  246. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
  247. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
  248. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
  249. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
  250. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
  251. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
  252. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
  253. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
  254. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
  255. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
  256. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
  257. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
  258. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
  259. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
  260. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
  261. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
  262. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
  263. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
  264. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
  265. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
  266. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
  267. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
  268. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
  269. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
  270. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
  271. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
  272. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
  273. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
  274. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
  275. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
  276. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
  277. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
  278. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
  279. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-legacy/docs/compliance/index.md +10 -0
  280. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-type/docs/compliance/index.md +10 -0
  281. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
  282. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
  283. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
  284. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
  285. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
  286. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
  287. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
  288. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
  289. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/no-type.md +9 -0
  290. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-experiment.md +10 -0
  291. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-research.md +10 -0
  292. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
  293. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs/architecture/bad-status.md +0 -1
  294. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
  295. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
  296. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
  297. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
  298. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
  299. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
  300. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-last-update.md +11 -0
  301. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
  302. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
  303. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
  304. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
  305. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
  306. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/created-date.md +21 -0
  307. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/research-shaped.md +19 -0
  308. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
  309. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
  310. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
  311. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
  312. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
  313. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
  314. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
  315. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/a.ts +1 -0
  316. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/b.ts +1 -0
  317. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
  318. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
  319. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  320. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
  321. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/a.ts +1 -0
  322. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/b.ts +1 -0
  323. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/c.ts +1 -0
  324. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
  325. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  326. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
  327. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
  328. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  329. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
  330. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
  331. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
  332. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
  333. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
  334. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
  335. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +256 -0
  336. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
  337. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
  338. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +1 -1
  339. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
  340. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
  341. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
  342. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
  343. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
  344. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
  345. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
  346. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
  347. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
  348. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
  349. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
  350. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
  351. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
  352. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
  353. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
  354. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
  355. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
  356. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
  357. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
  358. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
  359. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
  360. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
  361. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
  362. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
  363. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
  364. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
  365. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
  366. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
  367. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
  368. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
  369. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
  370. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
  371. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
  372. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
  373. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
  374. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
  375. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
  376. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
  377. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
  378. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
  379. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
  380. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
  381. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
  382. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
  383. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
  384. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
  385. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
  386. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
  387. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
  388. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
  389. package/packages/repo-controls/package.json +2 -10
  390. package/packages/repo-controls/scripts/hooks/post-merge +13 -0
  391. package/packages/repo-controls/scripts/hooks/pre-push +3 -3
  392. package/packages/repo-controls/src/azdo-push.ts +64 -36
  393. package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
  394. package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
  395. package/packages/repo-controls/src/cli.ts +29 -8
  396. package/packages/repo-controls/src/compliance-config.ts +410 -2
  397. package/packages/repo-controls/src/config.ts +133 -60
  398. package/packages/repo-controls/src/constants.ts +13 -27
  399. package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
  400. package/packages/repo-controls/src/doctor.ts +46 -19
  401. package/packages/repo-controls/src/gitignore-block.ts +5 -29
  402. package/packages/repo-controls/src/hook-log.ts +1 -2
  403. package/packages/repo-controls/src/hook.ts +201 -45
  404. package/packages/repo-controls/src/install.ts +14 -8
  405. package/packages/repo-controls/src/integrity.ts +3 -3
  406. package/packages/repo-controls/src/lfs.ts +111 -0
  407. package/packages/repo-controls/src/promote.ts +8 -8
  408. package/packages/repo-controls/src/runtime.ts +9 -1
  409. package/packages/repo-controls/src/workflows-drift.ts +4 -5
  410. package/packages/repo-controls/src/worktree-guard.ts +3 -3
  411. package/packages/fleet/jobs/git-maintain/src/main.ts +0 -848
  412. package/packages/fleet/systemd/adl-azure-agent-update.service +0 -13
  413. package/packages/fleet/systemd/adl-azure-agent-update.timer +0 -10
@@ -16,7 +16,8 @@ target repo (committed) adl (fleet-installed; see below)
16
16
  .workflows/hooks/commit-msg ├─ sh stub ──▶ ├─ validates adl-config.toml [controls]
17
17
  .workflows/hooks/pre-push │ exec ├─ checks bash >= 4
18
18
  .workflows/hooks/post-commit │ └─ runs scripts/hooks/<name>
19
- .workflows/hooks/post-checkout ─┘
19
+ .workflows/hooks/post-checkout │
20
+ .workflows/hooks/post-merge ─┘
20
21
  adl-config.toml [controls] (config, shared file — see below) (package-owned script, config via env)
21
22
  .workflows/repo-controls.lock.json (hashes)
22
23
  local .git/config: core.hooksPath = .workflows/hooks
@@ -25,9 +26,9 @@ local .git/config: core.hooksPath = .workflows/hooks
25
26
  - **Stubs** are POSIX `sh`, contain no paths, and fail loudly (with the install
26
27
  command) when `adl` is not on `PATH` — never a silent skip. This package is
27
28
  folded into the `adl` binary's `repo controls` namespace
28
- (docs/architecture/cli-design.md §6, STATUS.md item 10); it is never itself a
29
+ (docs/architecture/cli-design.md §6); it is never itself a
29
30
  standalone global command — hard cut, no `adl-repo-controls` compat shim
30
- (adl-m3-finish item 1, 2026-09-27).
31
+ (2026-09-27).
31
32
  - **Bundled scripts** in `scripts/hooks/` are package-owned implementations.
32
33
  They originated in enact-m5; commit `20ec790` removed the former byte-copy
33
34
  tree and manifest when mechanism moved into this package. Their current
@@ -77,6 +78,53 @@ a release-configured pre-commit commits successfully with no network-capable
77
78
  binary on `PATH` at all, and pre-push blocks by name when the token mint
78
79
  fails and permits the push once it succeeds.
79
80
 
81
+ ## Git LFS chaining (`pre-push`, `post-checkout`, `post-commit`, `post-merge`)
82
+
83
+ Installed repositories set `core.hooksPath=.workflows/hooks`, so git never runs
84
+ the `.git/hooks/{pre-push,post-checkout,post-commit,post-merge}` that
85
+ `git lfs install` writes. Before 2026-10-01 nothing in adl called git-lfs, so a
86
+ push of a commit carrying an LFS pointer succeeded **without uploading the
87
+ object** and left a broken pointer on the remote (live, enact-combined: a
88
+ broken WebM pointer had to be deleted by hand). `runHook` (`src/hook.ts`) now
89
+ chains each of those four hooks to `git lfs <hook> "$@"` (`src/lfs.ts`):
90
+
91
+ - **Only when the repository uses LFS:** a `filter=lfs` attribute in any
92
+ `.gitattributes` (tracked or untracked, nested included) or in
93
+ `.git/info/attributes`, a `.lfsconfig`, or `lfs.*` in the repository's own git
94
+ config. A repository without LFS never calls `git lfs`.
95
+ - **Fail loud, never skip:** LFS in use and no `git-lfs` on `PATH` is a hard
96
+ failure with the install command in the message; a failing `git lfs <hook>`
97
+ fails the hook (for `pre-push`, the push). A FAIL row is also written to the
98
+ hook log, because the bundled script has already logged its PASS by then.
99
+ - **`pre-push` order and stdin:** git writes the pushed ref lines once. `runHook`
100
+ reads them once and feeds the same bytes to the bundled script (branch rules)
101
+ and to `git lfs pre-push`. The LFS upload is the LAST step, after every adl
102
+ check passed, so a refused push uploads nothing. `post-merge` is a new hook
103
+ (`HOOK_NAMES`) whose only job is this chain; `doctor` therefore reports
104
+ `hook:post-merge`, and an already-installed repository needs `adl repo
105
+ controls install --repo .` once to project the stub.
106
+ - **Credentials — one boundary, no second path.** `bin/git-ado` authenticates an
107
+ agent's `git push` by exporting `GIT_CONFIG_COUNT` and a
108
+ `GIT_CONFIG_KEY_n=http.https://<host>/.extraHeader` /
109
+ `GIT_CONFIG_VALUE_n=Authorization: Bearer <token>` pair (`bin/git-ado`, the
110
+ two `exec env ... GIT_CONFIG_COUNT=` blocks); git passes its environment to
111
+ the hook. `runBundled` strips every `GIT_CONFIG_*` (`childEnv`) so adl's own
112
+ checks never hold the token, which is why the chain is TypeScript and not
113
+ bash: `runHook` still has the unstripped environment, and the one
114
+ `git lfs` spawn (`spawnGitLfs`) is the only child given it. git-lfs therefore
115
+ authenticates with exactly the pairs the parent `git push` had: same
116
+ mechanism, no second token mint, never the human's credential helper.
117
+ `tests/lfs-credential-boundary.test.ts` is the proof (real git-lfs, a local
118
+ LFS endpoint that requires the Bearer token and answers 401 otherwise, a
119
+ credential helper that records every call): every request carried the header,
120
+ the helper was never called, and with the header absent the helper IS called
121
+ (the control that makes the first claim falsifiable).
122
+ - **Explicit `git lfs push|pull|fetch` for agents** was refused in `bin/git-ado`
123
+ until that proof existed; it now takes the ordinary agent path. The refusal
124
+ must come back if `lfs-credential-boundary.test.ts` ever goes red. No agent-hooks
125
+ rule mentions LFS, so `git push` -> hook -> `git lfs pre-push` is not a
126
+ command an agent types and is not intercepted by any rule.
127
+
80
128
  ## Worktree-count backstop (`post-checkout`)
81
129
 
82
130
  `MAX_WORKTREES` (`src/constants.ts`) is `3` — a repository may have at most 3
@@ -144,7 +192,7 @@ or a `Task`/`Agent` launch with `isolation: "worktree"`) — see
144
192
 
145
193
  ### Why bun (and not node)
146
194
 
147
- This package is never distributed standalone (adl-m3-finish item 1/2, 2026-09-27):
195
+ This package is never distributed standalone (since 2026-09-27):
148
196
  `adl repo controls <command>` folds it into the one `adl` binary
149
197
  (docs/architecture/cli-design.md §6), which the fleet installs via `bin/reconcile`'s
150
198
  `bun-compile` manager; `apps/cli/src/commands/repo-controls.ts` resolves this
@@ -186,7 +234,7 @@ centralization are documented in
186
234
  adl-repo-controls install --repo <path> [--dry-run]
187
235
  adl-repo-controls uninstall --repo <path> [--dry-run]
188
236
  adl-repo-controls doctor --repo <path> [--json]
189
- adl-repo-controls hook <pre-commit|commit-msg|pre-push|post-commit> [git hook args]
237
+ adl-repo-controls hook <pre-commit|commit-msg|pre-push|post-commit|post-checkout|post-merge> [git hook args]
190
238
  adl-repo-controls log <hook-name> <reason> [context] [message] (internal — called by the bundled hooks)
191
239
  adl-repo-controls promote --repo <path>
192
240
  adl-repo-controls run <azdo-push|coverage|repo-hygiene|validate-pr-metadata> --repo <path> [-- args]
@@ -229,21 +277,56 @@ merge into `integration`) runs.
229
277
  **doctor** is read-only and exits 1 on any failure: bash >= 4, bun, binary on
230
278
  PATH, the bundled compliance package present at its packaged path, repository
231
279
  root, `[controls]` config validity, (warning) `coverage/coverage-summary.json`
232
- exists whenever `pre_push.coverage_ratchet` is enabled, `[controls.compliance]` config
233
- validity, `uv` on PATH (only checked once `[controls.compliance].enabled` is non-empty;
234
- otherwise reported ok unconditionally, same off-by-default posture as the
235
- coverage-summary check), (warning only, same conditioning) `ast-grep` on PATH,
236
- lock, each stub (present, unedited, executable), `core.hooksPath`, `.gitignore`
237
- lines, and (warning) lock version skew. When `[controls.release]` is declared,
238
- it also derives the configured `origin` remote, loads the validated canonical
239
- Agent Vault file before reading Azure DevOps, and records separate fail-closed receipts for the HTTPS handle,
240
- required owner reviewer, minimum-review reset, and (only when one is present) build policy.
280
+ exists whenever `pre_push.coverage_ratchet` is enabled (`coverage_ratchet`
281
+ defaults ON; the gate is a no-op until the file lands, so this is informational
282
+ rather than blocking), (warning) `pre_push.coverage_produce` enabled with no
283
+ `[controls.coverage].produce_push` declared (the push gate fails loud there, so
284
+ doctor names it first), `[controls.compliance]` config validity, `uv` on PATH
285
+ (only checked once `[controls.compliance].enabled` is non-empty; otherwise
286
+ reported ok unconditionally, same on-by-default posture as the coverage-summary
287
+ check), (warning only, same conditioning) `ast-grep` on PATH, lock, each stub
288
+ (present, unedited, executable), `core.hooksPath`, `.gitignore` lines, and
289
+ (warning) lock version skew. When `[controls.release]` is declared, it also
290
+ derives the configured `origin` remote, loads the validated canonical Agent
291
+ Vault file before reading Azure DevOps, and records separate fail-closed
292
+ receipts for the HTTPS handle, required owner reviewer, minimum-review reset,
293
+ and (only when one is present) build policy.
241
294
 
242
295
  **run** executes a bundled enact-m5 tool against the repository with the config
243
296
  exported: `azdo-push` (Azure DevOps push with push lock + behind-origin refusal),
244
297
  `coverage <check-push|prewarm-push|status|unlock|...>`, `repo-hygiene` (CI
245
298
  entrypoint), `validate-pr-metadata` (Azure PR title/description policy).
246
299
 
300
+ #### azdo-push: one credential boundary
301
+
302
+ `azdo-push` mints and injects **no credential** (Tarun, 2026-10-01). Its git
303
+ children run through the managed front controller (`/usr/local/bin/git` ->
304
+ `bin/git-ado`), the only place a token is minted and a header added. What
305
+ `azdo-push` does contribute is `ADL_AGENT_ID_AGENT=<resolved agent>` on every
306
+ git spawn (so the controller mints for the right agent) and the removal of any
307
+ inherited `ADL_HUMAN_AZDO`. It refuses, before any network call, when no agent
308
+ identity resolves, and when the `git` on `PATH` does not carry the
309
+ `# Managed by adl global-tools.` marker (a plain git would fall to the human
310
+ credential helper).
311
+
312
+ **Verify on the wire** that a request carries exactly one `Authorization`
313
+ header. Git redacts the value by default (`GIT_TRACE_REDACT`, on unless set to
314
+ `0` -- never set it), so the trace is safe to read and to paste:
315
+
316
+ ```
317
+ GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 git ls-remote origin HEAD 2>&1 \
318
+ | rg '=> Send header: (GET|POST|Authorization)'
319
+ ```
320
+
321
+ Expect each `GET`/`POST` line to be followed by exactly one
322
+ `=> Send header: Authorization: Bearer <redacted>` line. Count them with
323
+ `... | rg -c '=> Send header: Authorization'` -- 1 for the single request of
324
+ `ls-remote`. Two per request means a second credential path is back (the old
325
+ behaviour was a global `http.extraheader` from `azdo-push` plus git-ado's own
326
+ URL-scoped header). `ls-remote` is read-only; to trace the push path itself, run
327
+ `GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 adl repo controls azdo-push` on a
328
+ branch you mean to push.
329
+
247
330
  **run compliance** runs the bundled `adl-compliance` Python engine (via `uv`)
248
331
  against the repository. `--root <repo>` is always injected first from `--repo`;
249
332
  once `[controls.compliance].enabled` is non-empty, `--only <the enabled list, comma-joined>`
@@ -285,41 +368,47 @@ an inline table is one attribute, because editing inside one means rewriting byt
285
368
  you own. Nothing is parsed and re-serialized; text is spliced into the table's span.
286
369
 
287
370
  `[controls]` is strictly validated: unknown keys and wrong types are errors. An
288
- **absent** optional key is its documented default, never an error.
371
+ **absent** key takes its documented default, never an error. Most gates default
372
+ ON; the matching `[controls.<gate>]` keys are what configure them. A gate whose
373
+ wrapper is ON but whose configuration is missing is a no-op at hook time and a
374
+ *warning* at `doctor` time — informational, never blocking.
289
375
 
290
376
  | Key | Seeded by install | Default when absent | enact-m5 | Effect |
291
377
  |---|---|---|---|---|
292
378
  | `branches.protected` | yes | *required* | `["main", "integration"]` | pre-push refuses while on these branches |
293
379
  | `branches.prefixes` | yes | *required* | `["feat", "fix", "docs", "chore"]` | pre-push / azdo-push branch pattern `<prefix>/<kebab>` |
294
380
  | `pre_push.remote` | yes | *required* | `"origin"` | remote azdo-push pushes to and reads status from |
295
- | `pre_commit.biome` | no | `false` | `true` | Biome format+lint on the staged index snapshot |
296
- | `pre_commit.staged_coverage` | no | `false` | `true` | enact-m5-only staged coverage measurement |
297
- | `pre_commit.doc_freshness` | no | `false` | opt in | a staged `docs/` or `plans/` `.md` carries a `last_update` stamped within 5h |
298
- | `pre_push.coverage_ratchet` | no | `false` | `true` | per outgoing commit, `coverage/coverage-summary.json` must exist and not regress |
299
- | `pre_push.findings_ratchet` | no | `false` | opt in | per outgoing commit, every declared static-analysis counter's findings must not exceed the committed floor |
381
+ | `pre_commit.staged_coverage` | no | `true` | `true` | enact-m5-only staged coverage measurement (no-op until `[controls.coverage].produce` is declared) |
382
+ | `pre_commit.doc_freshness` | no | `true` | opt in | a staged `docs/` or `plans/` `.md` carries a `last_update` stamped within 5h (no-op when no docs are staged) |
383
+ | `pre_commit.compliance` | no | `true` | `true` | staged adl-compliance gates (no-op until `[controls.compliance].enabled` is non-empty) |
384
+ | `pre_push.coverage_ratchet` | no | `true` | `true` | per outgoing commit, `coverage/coverage-summary.json` must exist and not regress (no-op until the file lands) |
385
+ | `pre_push.coverage_produce` | no | `false` | opt in | run the coverage MEASUREMENT at push via `[controls.coverage].produce_push` (fails the push when armed with no command declared) |
386
+ | `pre_push.findings_ratchet` | no | `true` | opt in | per outgoing commit, every declared static-analysis counter's findings must not exceed the committed floor (no-op until `[controls.findings].counters` is declared and the floor file lands) |
300
387
  | `pre_push.static_checks` | no | `[]` | tsc, knip, svelte-check | `{ label, run }` commands run on an export of HEAD, pass cached per tree OID |
301
388
  | `release.source` | no | `""` | `"integration"` | source branch for the managed promotion PR; no branch pair is guessed |
302
389
  | `release.target` | no | `""` | `"main"` | target branch for the managed promotion PR |
303
390
  | `release.merge_strategy` | no | `"squash"` | `"no-fast-forward"` | one of `squash`, `rebase`, `rebase-merge`, or `no-fast-forward` — sent to Azure DevOps as the matching wire value (`squash`, `rebase`, `rebaseMerge`, `noFastForward`) |
304
- | `release.pre_bump` | no | `[]` | — | ordered, repository-relative script paths `version-bump.sh` runs from the repo root before the bump commit (the CI pipeline's Bump stage, on the PR's source branch) |
305
-
306
- ### Release scripts — Bump and Guard (Tarun, 2026-09-30)
307
-
308
- One clean hard cutover to three pipelines (CI on PRs into `integration`,
309
- Promote on `integration`, CD on `main`; `docs/architecture/cli-design.md` §6a).
310
- Two managed scripts run in the CI pipeline, and neither ever pushes to
311
- `integration`:
312
-
313
- - **`.workflows/version-bump.sh --file package.json --pr-source <source> --base
314
- integration --push`** (Bump stage) sets the PR's SOURCE branch to
315
- `integration`'s version + 1 patch, running `release.pre_bump` scripts in the
316
- same commit, and pushes it (a plain push as the build service, never an
317
- agent identity, never force). It refuses a source that does not contain
318
- `integration`'s tip. The old `--integration` mode is gone: it is an unknown
319
- argument.
320
- - **`.workflows/reconcile-guard.sh`** (Guard stage) fails, printing the
321
- reconcile command (`git pull origin integration && git push`), unless the
322
- source contains `integration`'s tip and is at `integration` + 1.
391
+ | `release.pre_bump` | no | `[]` | — | ordered, repository-relative script paths `version-bump.sh` runs from the repo root before the bump commit (the Promote pipeline's Bump stage, on the checkout of the `integration` commit that triggered it) |
392
+
393
+ ### Release scripts — Guard and Bump (Tarun, 2026-09-30; bump moved 2026-10-01)
394
+
395
+ Three pipelines (CI on PRs into `integration`, Promote on `integration`, CD on
396
+ `main`; `docs/architecture/cli-design.md` §6a). Two managed scripts:
397
+
398
+ - **`.workflows/reconcile-guard.sh --pr-source <source> --base integration`**
399
+ (CI pipeline, Guard stage) is read-only and fails, printing the reconcile
400
+ command (`git pull origin integration, then push`), unless the source
401
+ contains `integration`'s tip. It checks no version: PR CI bumps nothing,
402
+ because a PR's build-validation policy ignores `[skip ci]`.
403
+ - **`.workflows/version-bump.sh --file package.json --integration --push`**
404
+ (Promote pipeline, Bump stage) sets the manifest to the checked-out
405
+ `integration` commit's version + 1 patch, runs `release.pre_bump` scripts in
406
+ the same commit, commits `chore: bump version A to B [skip ci]` and pushes
407
+ `HEAD:refs/heads/integration` (a plain fast-forward as the build service,
408
+ which needs Contribute and "Bypass policies when pushing" there; never an
409
+ agent identity, never force). If `integration` moved since the checkout the
410
+ push is rejected and the script fails loud; the next merge's run bumps. The
411
+ old `--pr-source` mode is gone: it is an unknown argument.
323
412
 
324
413
  ### `release.pre_bump` — multi-language version bumps
325
414
 
@@ -395,10 +484,9 @@ sed -i.bak -E "s/^const Version = \".*\"/const Version = \"${ADL_NEXT_VERSION}\"
395
484
  rm -f "${file}.bak"
396
485
  ```
397
486
 
398
- `install` copies four package-owned standalone CI assets byte-for-byte:
487
+ `install` copies three package-owned standalone CI assets byte-for-byte:
399
488
 
400
489
  - `.workflows/promote.ts`
401
- - `.workflows/scripts/enable-integration-auto-complete.mjs`
402
490
  - `.workflows/version-bump.sh`
403
491
  - `.workflows/reconcile-guard.sh`
404
492
 
@@ -469,6 +557,13 @@ Note: with `coverage_ratchet = true` every pushed commit and its parent must
469
557
  contain `coverage/coverage-summary.json` (Istanbul json-summary); commit a
470
558
  baseline first or set it to `false`.
471
559
 
560
+ Note: with `coverage_produce = true` the coverage MEASUREMENT runs at push too,
561
+ through `[controls.coverage].produce_push` — measurement at push, grading at
562
+ push, so commits stay fast. `produce_push` is the push-appropriate command: it
563
+ runs against immutable HEAD before the push, so a check-mode run that never
564
+ mutates the index is the shape. Armed with no command declared, the gate fails
565
+ the push by name — a step that measures nothing is not a pass.
566
+
472
567
  Note: with `findings_ratchet = true`, `[controls.findings]` says where the
473
568
  floor lives (`floor`, default `compliance/ratchets/static-analysis-findings.yaml`)
474
569
  and `[controls.findings.counters]` names the repository's own static-analysis
@@ -512,6 +607,9 @@ non-empty string.
512
607
  | `enabled` | `[]` | gate ids (`RST-001`) or `domain.name` addresses (`rust.acp-boundary`) to grade; empty = installed, nothing runs |
513
608
  | `registry` | `"default"` | forward-compatible; today both values point at the same packaged registry YAML |
514
609
  | `[controls.compliance.trees]` | `{}` (no entries) | per-key path overrides; a key absent here keeps the packaged (source-shaped) default for that key |
610
+ | `[controls.compliance.limits]` | absent (engine defaults) | per-repository engine limits, strictly validated. `scripts_direct_files` (positive integer) replaces LAY-014's default of 15 direct files per scripts directory and reaches the engine as `--declare scripts-direct-files=N`; a value the engine cannot read as a positive integer is could-not-run, never a fall back to 15. The depth limit is not configurable. `open_gaps` and `open_plans` (each a positive integer) replace LAY-016's default cap of 10 open gaps and 10 open plans, independently, and reach the engine as `--declare open-gaps=N` / `--declare open-plans=N`; the same could-not-run rule applies to each, and a finding names the effective cap as `N open gaps, cap is M`. The engine default stays 10: a repository declares today's measured count and ratchets it down |
611
+ | `[controls.compliance.markdown]` | absent (no extra Markdown roots) | extra Markdown roots for LAY-006 (`layout.markdown-trees`), strictly validated. `roots` is an array of repository-relative directories whose Markdown is site or application content rather than documentation (an Astro site's `src/content/**/*.md`); LAY-006 admits `.md` and `.mdx` beneath each, in addition to the docs trees, so a declared root only ever widens the allowlist and absent is the stricter grade. Reaches the engine as one `--declare markdown-roots=a,b`. An entry that is empty, absolute, contains `,` or `=`, or has a `.`, `..` or empty path segment is rejected when the config loads (a trailing `/` is dropped); the engine refuses the same values as could-not-run (exit 2) |
612
+ | `[controls.compliance.lockfiles]` | absent (REP-002 keeps its tree-derived scope) | exactly which manifest and lockfile paths REP-002 (`repository.lockfile-integrity`) scans and grades, strictly validated. Four arrays: `bun_manifests` / `bun_lockfiles` and `cargo_manifests` / `cargo_lockfiles`. A manifest entry is a repository-relative path or glob ending in `package.json` (`Cargo.toml`), such as `package.json` or `apps/*/package.json`; a lockfile entry is a literal path (a missing one is reported by name). An ecosystem is declared as a pair, and a declared pair replaces that ecosystem's default (`<typescript>/package.json` + `<typescript>/bun.lock`, the `<rust>` pair) in both what selects the gate and what it grades; an undeclared ecosystem is unchanged. Reaches the engine as `--declare bun-manifests=a,b`, `bun-lockfiles=`, `cargo-manifests=`, `cargo-lockfiles=` (a list is omitted when empty); a declared manifest that matches no file is could-not-run naming it. An entry that is empty, absolute, duplicated, contains `,` `=` `\` `<` `>` `{` `}`, starts with `!`, has a `.`, `..` or empty path segment, ends in the wrong file name, or (for a lockfile) is a glob, an ecosystem with only one of its two lists, and a `REP-002:bun_lock` / `cargo_lock` / `cargo_manifest` / `workspace` input beside the pair it supersedes are all rejected when the config loads; the engine refuses the same values as could-not-run (exit 2) |
515
613
 
516
614
  ### Registry curation
517
615
 
@@ -534,5 +632,5 @@ bun test --coverage # 100% lines + functions gate (bunfig.toml)
534
632
  ```
535
633
 
536
634
  Tests run real git in temporary repositories under `.scratchpad/test-tmp/`
537
- (gitignored), exercising the installed stubs end to end. CI:
538
- `azure-pipelines.yml` (publishing present but disabled).
635
+ (gitignored), exercising the installed stubs end to end. CI runs them through
636
+ the repository's root pipelines under `workflows/pipelines/`.
@@ -90,7 +90,7 @@ interface PullRequestList {
90
90
  value?: PullRequest[]
91
91
  }
92
92
 
93
- export interface PolicyScope {
93
+ interface PolicyScope {
94
94
  repositoryId?: string
95
95
  refName?: string
96
96
  matchKind?: string
@@ -111,12 +111,12 @@ export interface PolicyConfiguration {
111
111
  }
112
112
  }
113
113
 
114
- export interface PolicyConfigurationList {
114
+ interface PolicyConfigurationList {
115
115
  value?: PolicyConfiguration[]
116
116
  }
117
117
 
118
- export const MINIMUM_REVIEWER_POLICY_TYPE = 'fa4e907d-c16b-4a4c-9dfa-4906e5d171dd'
119
- export const BUILD_POLICY_TYPE = '0609b952-1397-4640-95ec-e00a01b2c241'
118
+ const MINIMUM_REVIEWER_POLICY_TYPE = 'fa4e907d-c16b-4a4c-9dfa-4906e5d171dd'
119
+ const BUILD_POLICY_TYPE = '0609b952-1397-4640-95ec-e00a01b2c241'
120
120
 
121
121
  /** `release: promote <source> to <target>` — derived, never declared. */
122
122
  export function promotionTitle(source: string, target: string): string {
@@ -1,18 +1,17 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- # Stage 2 of the CI pipeline for pull requests into `integration` (stage 1
5
- # bumps the PR branch, stage 3 runs the tests). It forces the PR author,
6
- # usually an agent, to reconcile with integration before anything merges:
4
+ # Stage 1 of the CI pipeline for pull requests into `integration` (stage 2
5
+ # runs the tests). It forces the PR author, usually an agent, to reconcile with
6
+ # integration before anything merges:
7
7
  #
8
- # Check A the PR branch contains integration's tip
9
- # Check B the PR branch's manifest version is integration's + 1 patch
8
+ # the PR source branch contains integration's tip
9
+ #
10
+ # That is the only check. The version bump is not a PR concern any more: the
11
+ # integration-merge pipeline bumps after the merge (Tarun, 2026-10-01).
10
12
  #
11
13
  # Read-only: this script only fetches and reads. It never pushes, and the only
12
14
  # refs it writes are the two remote-tracking refs it fetches.
13
- #
14
- # Run from the package directory (like version-bump.sh); the manifest is
15
- # resolved repo-relative through `git rev-parse --show-prefix`.
16
15
 
17
16
  # CI never carries an agent identity. Never set one here, and never inherit
18
17
  # one from the caller.
@@ -23,17 +22,11 @@ die() {
23
22
  exit 1
24
23
  }
25
24
 
26
- version_file=''
27
25
  pr_source=''
28
26
  base=''
29
27
 
30
28
  while [[ $# -gt 0 ]]; do
31
29
  case "$1" in
32
- --file)
33
- [[ $# -ge 2 ]] || die '--file requires a path'
34
- version_file="$2"
35
- shift 2
36
- ;;
37
30
  --pr-source)
38
31
  [[ $# -ge 2 ]] || die '--pr-source requires a branch'
39
32
  pr_source="$2"
@@ -50,8 +43,6 @@ while [[ $# -gt 0 ]]; do
50
43
  esac
51
44
  done
52
45
 
53
- [[ -n "$version_file" ]] || die '--file is required'
54
- [[ "$version_file" == 'package.json' ]] || die 'only --file package.json is supported'
55
46
  [[ -n "$pr_source" ]] || die '--pr-source is required'
56
47
  [[ -n "$base" ]] || die '--base is required'
57
48
 
@@ -66,8 +57,7 @@ case "$branch" in
66
57
  ;;
67
58
  esac
68
59
 
69
- prefix="$(git rev-parse --show-prefix)" || die 'not inside a git work tree'
70
- manifest_path="${prefix}${version_file}"
60
+ git rev-parse --show-prefix > /dev/null || die 'not inside a git work tree'
71
61
 
72
62
  base_ref="refs/remotes/origin/$base"
73
63
  branch_ref="refs/remotes/origin/$branch"
@@ -79,35 +69,9 @@ base_short="$(git rev-parse --short "$base_ref")" || die "cannot resolve $base_r
79
69
 
80
70
  if ! git merge-base --is-ancestor "$base_ref" "$branch_ref"; then
81
71
  missing="$(git rev-list --count "$branch_ref..$base_ref")"
82
- echo "reconcile-guard: FAIL — $branch does not contain integration's tip ($base_short). Reconcile: git pull origin integration && git push" >&2
72
+ echo "reconcile-guard: FAIL — $branch does not contain integration's tip ($base_short) — reconcile: git pull origin integration, then push" >&2
83
73
  echo "reconcile-guard: $missing integration commit(s) missing from $branch" >&2
84
74
  exit 1
85
75
  fi
86
76
 
87
- read_version() {
88
- local ref="$1" text
89
- text="$(git show "$ref:$manifest_path")" || die "cannot read $manifest_path at $ref"
90
- printf '%s' "$text" | node -e '
91
- const version = JSON.parse(require("node:fs").readFileSync(0, "utf8")).version
92
- if (typeof version !== "string") process.exit(1)
93
- process.stdout.write(version)
94
- ' || die "cannot read a string version from $manifest_path at $ref"
95
- }
96
-
97
- parse_version() {
98
- [[ "$1" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]] || die "cannot parse '$1' as a release version x.y.z"
99
- }
100
-
101
- base_version="$(read_version "$base_ref")"
102
- branch_version="$(read_version "$branch_ref")"
103
-
104
- parse_version "$base_version"
105
- target="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.$((BASH_REMATCH[3] + 1))"
106
- parse_version "$branch_version"
107
-
108
- if [[ "$branch_version" != "$target" ]]; then
109
- echo "reconcile-guard: FAIL — $branch version $branch_version is not integration $base_version + 1 patch ($target). Stage 1 bumps it; re-run the PR build after reconciling." >&2
110
- exit 1
111
- fi
112
-
113
- echo "reconcile-guard: PASS — $branch contains integration $base_short and is at $target"
77
+ echo "reconcile-guard: PASS — $branch contains integration $base_short"
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- # STAGE 1 of the PR pipeline (PR -> integration): the PR build owns package
5
- # version allocation. Every PR into `integration` must carry exactly
6
- # `<integration version> + patch 1`; this script makes it so, on the PR's
7
- # SOURCE branch, before anything else validates it:
4
+ # STAGE 1 of the promote pipeline (push to `integration`): the integration-merge
5
+ # build owns package version allocation (Tarun, 2026-10-01 -- a PR's
6
+ # build-validation policy ignores `[skip ci]`, so a bump pushed from PR CI
7
+ # re-queued itself; a push to a branch honours it). After a merge lands on
8
+ # `integration` this sets the manifest to that commit's version + patch 1:
8
9
  #
9
- # version-bump.sh --file package.json --pr-source <feature branch> \
10
- # --base integration --push
10
+ # version-bump.sh --file package.json --integration --push
11
11
  #
12
- # The Azure Pipelines PR build checks out the detached refs/pull/N/merge
13
- # commit with persisted credentials, so `git push` authenticates as the
14
- # project build service. The bump commit is created on the source branch's own
15
- # tip (never on the merge commit), carries no ***NO_CI*** (feature branches
16
- # have no CI trigger, so the push re-queues the PR build, which then
17
- # validates the bumped commit), and is pushed with a plain push — never
18
- # forced. When the source is already at the target version nothing is
19
- # committed and the run continues. No npm query, no second PR.
12
+ # The Azure Pipelines build checks out the detached commit that triggered the
13
+ # run with persisted credentials, so `git push` authenticates as the project
14
+ # build service (which needs Contribute + "Bypass policies when pushing" on
15
+ # `integration`). The bump commit is created on that checkout, carries
16
+ # `[skip ci]` so the push does not trigger this pipeline again, and is pushed
17
+ # with a plain fast-forward -- never forced. If integration moved since the
18
+ # checkout the push is rejected and the script fails loud; the newer merge's
19
+ # own run bumps. No npm query, no PR.
20
20
 
21
21
  # CI never carries an agent identity: the push below authenticates as the
22
22
  # project build service through the checkout's persisted System.AccessToken.
@@ -29,8 +29,7 @@ die() {
29
29
  }
30
30
 
31
31
  version_file=''
32
- pr_source=''
33
- base_branch=''
32
+ integration_mode=false
34
33
  push_bump=false
35
34
 
36
35
  while [[ $# -gt 0 ]]; do
@@ -40,15 +39,9 @@ while [[ $# -gt 0 ]]; do
40
39
  version_file="$2"
41
40
  shift 2
42
41
  ;;
43
- --pr-source)
44
- [[ $# -ge 2 ]] || die '--pr-source requires a branch ref'
45
- pr_source="$2"
46
- shift 2
47
- ;;
48
- --base)
49
- [[ $# -ge 2 ]] || die '--base requires a branch name'
50
- base_branch="$2"
51
- shift 2
42
+ --integration)
43
+ integration_mode=true
44
+ shift
52
45
  ;;
53
46
  --push)
54
47
  push_bump=true
@@ -60,52 +53,14 @@ while [[ $# -gt 0 ]]; do
60
53
  esac
61
54
  done
62
55
 
56
+ [[ -n "$version_file" ]] || die '--file is required'
63
57
  [[ "$version_file" == 'package.json' ]] || die 'only --file package.json is supported'
64
- [[ -n "$pr_source" ]] || die '--pr-source is required'
65
- [[ -n "$base_branch" ]] || die '--base is required'
58
+ [[ "$integration_mode" == true ]] || die '--integration is required'
66
59
  [[ "$push_bump" == true ]] || die '--push is required'
67
60
 
68
- # Accept `refs/heads/x` (Build.SourceBranch / System.PullRequest.SourceBranch)
69
- # or a bare `x`; anything else under refs/ is not a branch.
70
- source_branch="${pr_source#refs/heads/}"
71
- case "$source_branch" in
72
- '') die '--pr-source names an empty branch' ;;
73
- refs/*) die "--pr-source '$pr_source' is not a branch ref (expected 'refs/heads/<name>' or '<name>')" ;;
74
- esac
75
- base_branch="${base_branch#refs/heads/}"
76
- if [[ "$source_branch" == "$base_branch" || "$source_branch" == 'main' || "$source_branch" == 'integration' ]]; then
77
- die "refusing to bump '$source_branch': the PR source must be a feature branch, not the base ('$base_branch'), main or integration"
78
- fi
79
-
80
61
  git diff --quiet || die 'working tree is not clean before version bump'
81
62
  git diff --cached --quiet || die 'index is not clean before version bump'
82
63
  repo_root="$(git rev-parse --show-toplevel)" || die 'cannot resolve the repository root'
83
- # The script runs from the package directory (e.g. apps/cli); the manifest's
84
- # repository-relative path is how it is read from the base branch.
85
- repo_prefix="$(git rev-parse --show-prefix)" || die 'cannot resolve the working directory inside the repository'
86
- repo_relative_file="${repo_prefix}${version_file}"
87
-
88
- # Read both tips fresh from origin. The PR build's checkout is the detached
89
- # merge commit; bumping that would push a commit that is not the branch's own
90
- # history, so the working tree is moved onto a REAL branch at the source tip.
91
- git fetch origin \
92
- "refs/heads/$base_branch:refs/remotes/origin/$base_branch" \
93
- "refs/heads/$source_branch:refs/remotes/origin/$source_branch" || \
94
- die "cannot fetch '$base_branch' and '$source_branch' from origin"
95
-
96
- # The source must already contain the base's tip: the version it is bumped to
97
- # is derived from that tip, so a source behind it would be validated against a
98
- # merge the bump never saw.
99
- if ! git merge-base --is-ancestor "refs/remotes/origin/$base_branch" "refs/remotes/origin/$source_branch"; then
100
- missing_count="$(git rev-list --count "refs/remotes/origin/$source_branch..refs/remotes/origin/$base_branch")"
101
- base_short="$(git rev-parse --short "refs/remotes/origin/$base_branch")"
102
- echo "version-bump: FAIL — $source_branch does not contain $base_branch's tip ($base_short); reconcile first: git pull origin $base_branch && git push" >&2
103
- echo "version-bump: $missing_count commit(s) on $base_branch are missing from $source_branch" >&2
104
- exit 1
105
- fi
106
-
107
- git checkout -q -B "$source_branch" "refs/remotes/origin/$source_branch" || \
108
- die "cannot check out '$source_branch' at its origin tip"
109
64
 
110
65
  [[ -f "$version_file" ]] || die "manifest not found: $version_file"
111
66
 
@@ -113,20 +68,11 @@ read_version() {
113
68
  node -e 'const version = JSON.parse(require("node:fs").readFileSync(0, "utf8")).version; if (typeof version !== "string") process.exit(1); process.stdout.write(version)'
114
69
  }
115
70
 
116
- base_version="$(git show "refs/remotes/origin/$base_branch:$repo_relative_file" | read_version)" || \
117
- die "cannot read a string version from $repo_relative_file on origin/$base_branch"
118
- if [[ ! "$base_version" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
119
- die "cannot parse '$base_version' (origin/$base_branch) as a release version x.y.z"
120
- fi
121
- next_version="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.$((BASH_REMATCH[3] + 1))"
122
-
123
71
  current_version="$(read_version < "$version_file")" || die "cannot read a string version from $version_file"
124
-
125
- if [[ "$current_version" == "$next_version" ]]; then
126
- echo "version-bump: $source_branch already at $next_version (integration $base_version); nothing to bump"
127
- echo '##vso[task.setvariable variable=bumped;isOutput=true]false'
128
- exit 0
72
+ if [[ ! "$current_version" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
73
+ die "cannot parse '$current_version' ($version_file) as a release version x.y.z"
129
74
  fi
75
+ next_version="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.$((BASH_REMATCH[3] + 1))"
130
76
 
131
77
  node -e '
132
78
  const fs = require("node:fs")
@@ -142,7 +88,7 @@ node -e '
142
88
  # package.json can reach. No file, or no `pre_bump` key: no scripts, and
143
89
  # everything below this comment is a no-op, so the resulting commit is
144
90
  # byte-identical to the behaviour before this feature existed (see
145
- # packages/repo-controls/tests/version-bump-pr-source-pre-bump.test.ts).
91
+ # packages/repo-controls/tests/version-bump-integration-pre-bump.test.ts).
146
92
  config_path="$repo_root/adl-config.toml"
147
93
  pre_bump_list=''
148
94
  if [[ -f "$config_path" ]]; then
@@ -226,9 +172,10 @@ fi
226
172
 
227
173
  git -C "$repo_root" add -A
228
174
  git diff --cached --quiet && die "version bump produced no staged change (expected at least $version_file)"
229
- # No ***NO_CI***: a feature branch has no CI trigger, so this push is what
230
- # re-queues the PR build against the bumped commit.
231
- git commit -m "chore: bump version $current_version to $next_version"
232
- git push origin "HEAD:refs/heads/$source_branch"
233
- echo "version-bump: bumped $source_branch from $current_version to $next_version (integration $base_version); pushed — this run ends, the re-queued PR build validates the bumped commit"
234
- echo '##vso[task.setvariable variable=bumped;isOutput=true]true'
175
+ # `[skip ci]` (Azure DevOps: a push whose commits contain it does not trigger CI
176
+ # pipelines) keeps this push from re-running the promote pipeline that made it.
177
+ git commit -m "chore: bump version $current_version to $next_version [skip ci]"
178
+ if ! git push origin "HEAD:refs/heads/integration"; then
179
+ die "push to integration rejected: integration moved since checkout, so this bump is stale; the next merge's run bumps"
180
+ fi
181
+ echo "version-bump: bumped integration from $current_version to $next_version; pushed"
@@ -12,13 +12,12 @@
12
12
  # never-unit-tested Azure push code into the report at once, and 100% became
13
13
  # unreachable in a single commit.
14
14
  #
15
- # The package's OWN ratchet replaces it -- `coverageRegressions`, the same one
16
- # consumers are graded by. This repository is now one of its consumers:
17
- # `[controls.coverage].produce` builds coverage/coverage-summary.json from the
18
- # lcov below, `pre_push.coverage_ratchet` grades it against the committed copy,
19
- # and today's untested LINES may shrink but never grow. Counts rather than
20
- # percentages, for the reason settled for consumer coverage the same day -- a
21
- # percentage is derived, so it moves whenever a file's size moves.
15
+ # `coverageRegressions` is the shared ratchet primitive used by every controlled
16
+ # repository. This repository's root producer measures all workspace packages,
17
+ # writes coverage/coverage-summary.json, and pre-push grades it against the
18
+ # committed copy. Today's untested lines may shrink but never grow. Counts rather
19
+ # than percentages: a percentage is derived, so it moves whenever a file changes
20
+ # size.
22
21
  #
23
22
  # Nothing bespoke lives here. An earlier pass wrote a second ratchet and a second
24
23
  # record file for this repo alone; that was the package failing to eat its own
@@ -150,13 +150,12 @@ it. `tests/core/` is the one exception, for the spine (`Check`, `scope`,
150
150
 
151
151
  ## Status
152
152
 
153
- 93 of the registry's 104 rows are ported — counted by importing
153
+ Every row of the registry is implemented — 28 of 28, counted by importing
154
154
  `adl_compliance.checks` and measuring `len(CHECKS)` (`checks/__init__.py`'s
155
- explicit registry tuple), not by re-reading this paragraph.
156
-
157
- The remaining 11 are still shell in `compliance_new/`, which is frozen. A row
158
- with no Python implementation exits 2 with `no check implements <id>` — never
159
- a silent pass.
155
+ explicit registry tuple), not by re-reading this paragraph. The shell
156
+ `compliance_new/` tree this package ported from is gone, not frozen: a row
157
+ with no Python implementation exits 2 with `no check implements <id>` —
158
+ never a silent pass, and today no row reaches that.
160
159
 
161
160
  [`docs/operations/adl-compliance-invariants.md`](../../../../docs/operations/adl-compliance-invariants.md)
162
161
  records what is not true yet, including two rows that do not