@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.12 → 0.1.28

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 (410) hide show
  1. package/bin/adl +2 -2
  2. package/bin/git +16 -17
  3. package/bin/git-ado +25 -24
  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/fleet-host.sh +8 -5
  9. package/bin/reconcile +482 -232
  10. package/bin/reconcile-host +30 -20
  11. package/bin/setup +20 -17
  12. package/bin/shell-path-policy +15 -5
  13. package/bin/sync-and-reconcile +62 -64
  14. package/bin/validate-manifest +33 -9
  15. package/package.json +2 -10
  16. package/packages/agent-hooks/README.md +14 -9
  17. package/packages/agent-hooks/assets/hooks.json +0 -20
  18. package/packages/agent-hooks/src/cli/args.ts +1 -1
  19. package/packages/agent-hooks/src/cli/doctor.ts +6 -58
  20. package/packages/agent-hooks/src/deploy/deploy.ts +12 -41
  21. package/packages/agent-hooks/src/deploy/doctor.ts +8 -11
  22. package/packages/agent-hooks/src/deploy/index.ts +14 -14
  23. package/packages/agent-hooks/src/deploy/json-merge.ts +7 -8
  24. package/packages/agent-hooks/src/deploy/legacy-lock.ts +2 -2
  25. package/packages/agent-hooks/src/deploy/list.ts +1 -1
  26. package/packages/agent-hooks/src/deploy/lock.ts +31 -12
  27. package/packages/agent-hooks/src/deploy/profile.ts +3 -4
  28. package/packages/agent-hooks/src/deploy/source.ts +1 -1
  29. package/packages/agent-hooks/src/gating/config.ts +12 -24
  30. package/packages/agent-hooks/src/gating/root.ts +3 -3
  31. package/packages/agent-hooks/src/hooks/briefing/handler.ts +2 -2
  32. package/packages/agent-hooks/src/hooks/briefing/index.ts +27 -287
  33. package/packages/agent-hooks/src/hooks/contract.ts +17 -17
  34. package/packages/agent-hooks/src/hooks/crg/background.ts +27 -0
  35. package/packages/agent-hooks/src/hooks/crg/index.ts +7 -6
  36. package/packages/agent-hooks/src/hooks/log.ts +8 -10
  37. package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +1 -1
  38. package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +1 -1
  39. package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +6 -5
  40. package/packages/agent-hooks/src/hosts/registry.ts +1 -1
  41. package/packages/agent-hooks/src/log/adl-dir.ts +44 -0
  42. package/packages/agent-hooks/src/log/writer.ts +16 -2
  43. package/packages/agent-hooks/src/main.ts +7 -41
  44. package/packages/agent-hooks/src/pre-tool-use/handler.ts +71 -82
  45. package/packages/agent-hooks/src/rules/engine.ts +13 -17
  46. package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +3 -3
  47. package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +12 -14
  48. package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +28 -28
  49. package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +8 -9
  50. package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +56 -59
  51. package/packages/agent-hooks/src/rules/impl/adl-identity.ts +16 -23
  52. package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +19 -16
  53. package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +2 -2
  54. package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +9 -12
  55. package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +5 -7
  56. package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +411 -0
  57. package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +4 -5
  58. package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +6 -7
  59. package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +77 -70
  60. package/packages/agent-hooks/src/rules/impl/deny-allowlist.ts +131 -0
  61. package/packages/agent-hooks/src/rules/impl/git-helpers.ts +21 -23
  62. package/packages/agent-hooks/src/rules/impl/git-worktree.ts +14 -28
  63. package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -3
  64. package/packages/agent-hooks/src/rules/impl/messages.ts +1 -1
  65. package/packages/agent-hooks/src/rules/impl/pr-completion.ts +1 -1
  66. package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +35 -46
  67. package/packages/agent-hooks/src/rules/impl/tool-find.ts +34 -7
  68. package/packages/agent-hooks/src/rules/impl/tool-grep.ts +33 -12
  69. package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +52 -9
  70. package/packages/agent-hooks/src/rules/ports.ts +5 -7
  71. package/packages/agent-hooks/src/rules/registry.ts +4 -6
  72. package/packages/agent-hooks/src/rules/shell/git-identity.ts +86 -101
  73. package/packages/agent-hooks/src/rules/shell/git-internals.ts +1 -1
  74. package/packages/agent-hooks/src/rules/shell/invocation.ts +24 -118
  75. package/packages/agent-hooks/src/rules/shell/piped-script.ts +1 -1
  76. package/packages/agent-hooks/src/rules/shell/prefixes.ts +1 -1
  77. package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +11 -10
  78. package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +26 -26
  79. package/packages/agent-hooks/src/rules/shell/substitution.ts +1 -1
  80. package/packages/agent-hooks/src/rules/shell/xargs.ts +2 -2
  81. package/packages/agent-hooks/src/rules/spec.ts +2 -2
  82. package/packages/agent-settings/README.md +287 -0
  83. package/packages/agent-settings/assets/GLOBAL-AGENTS.md +14 -16
  84. package/packages/agent-settings/assets/agents/architect.toml +2 -0
  85. package/packages/agent-settings/assets/agents/code-reviewer.toml +2 -0
  86. package/packages/agent-settings/assets/agents/executor.toml +2 -0
  87. package/packages/agent-settings/assets/agents/explore.toml +2 -0
  88. package/packages/agent-settings/assets/agents/planner.toml +2 -0
  89. package/packages/agent-settings/assets/mcp.json +0 -4
  90. package/packages/agent-settings/deploy-profile.json +139 -0
  91. package/packages/agent-settings/deploy-profile.schema.json +147 -0
  92. package/packages/agent-settings/managed/README.md +29 -30
  93. package/packages/agent-settings/managed/codex-requirements.toml +9 -9
  94. package/packages/agent-settings/package.json +20 -0
  95. package/packages/agent-settings/src/deploy/agent-render.ts +2 -2
  96. package/packages/agent-settings/src/deploy/agent-toml.ts +1 -1
  97. package/packages/agent-settings/src/deploy/agents-deploy.ts +17 -3
  98. package/packages/agent-settings/src/deploy/doctor.ts +3 -83
  99. package/packages/agent-settings/src/deploy/index.ts +6 -33
  100. package/packages/agent-settings/src/deploy/legacy-lock.ts +6 -6
  101. package/packages/agent-settings/src/deploy/list.ts +5 -19
  102. package/packages/agent-settings/src/deploy/lock.ts +8 -18
  103. package/packages/agent-settings/src/deploy/mcp-deploy.ts +10 -5
  104. package/packages/agent-settings/src/deploy/mcp-merge.ts +22 -3
  105. package/packages/agent-settings/src/deploy/mcp-source.ts +1 -1
  106. package/packages/agent-settings/src/deploy/profile.ts +11 -35
  107. package/packages/agent-settings/src/deploy/retire-lean-ctx.ts +184 -0
  108. package/packages/agent-settings/src/deploy/settings.ts +17 -22
  109. package/packages/agent-settings/src/global-surface-sweep.ts +0 -2
  110. package/packages/agent-settings/src/kimi-hooks.ts +339 -192
  111. package/packages/agent-settings/src/opencode-hooks.ts +1 -1
  112. package/packages/agent-settings/tsconfig.json +23 -0
  113. package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +120 -0
  114. package/packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh +276 -0
  115. package/packages/agent-skills/assets/debug-issue/SKILL.md +8 -7
  116. package/packages/agent-skills/assets/explore-codebase/SKILL.md +13 -13
  117. package/packages/agent-skills/assets/refactor-safely/SKILL.md +12 -11
  118. package/packages/agent-skills/assets/review-changes/SKILL.md +7 -7
  119. package/packages/agent-skills/assets/testing/references/e2e.md +37 -0
  120. package/packages/agent-skills/assets/testing/references/integration.md +37 -0
  121. package/packages/agent-skills/assets/testing/references/unit.md +32 -0
  122. package/packages/agent-skills/dist/deploy.d.ts +2 -0
  123. package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
  124. package/packages/agent-skills/dist/deploy.js +27 -1
  125. package/packages/agent-skills/dist/deploy.js.map +1 -1
  126. package/packages/agent-skills/dist/doctor.d.ts +0 -2
  127. package/packages/agent-skills/dist/doctor.d.ts.map +1 -1
  128. package/packages/agent-skills/dist/doctor.js +1 -1
  129. package/packages/agent-skills/dist/doctor.js.map +1 -1
  130. package/packages/agent-skills/dist/fs-utils.d.ts +0 -1
  131. package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -1
  132. package/packages/agent-skills/dist/fs-utils.js +1 -1
  133. package/packages/agent-skills/dist/fs-utils.js.map +1 -1
  134. package/packages/agent-skills/src/deploy.ts +29 -1
  135. package/packages/agent-skills/src/doctor.ts +1 -1
  136. package/packages/agent-skills/src/fs-utils.ts +1 -1
  137. package/packages/azdo/README.md +10 -9
  138. package/packages/azdo/package.json +1 -3
  139. package/packages/azdo/scripts/probe-ado-rules.ts +311 -0
  140. package/packages/azdo/src/azdo-pl.ts +2 -54
  141. package/packages/azdo/src/azdo-pr-review.ts +4 -4
  142. package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
  143. package/packages/azdo/src/azdo-wit.ts +44 -2
  144. package/packages/azdo/src/lib/agent-identity.ts +12 -14
  145. package/packages/azdo/src/lib/agent-token.ts +2 -2
  146. package/packages/azdo/src/lib/client.ts +0 -5
  147. package/packages/azdo/src/lib/graph-identity.ts +4 -4
  148. package/packages/azdo/src/workflow-ladder.csv +241 -0
  149. package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
  150. package/packages/azdo/src/workflow-rules.ts +194 -0
  151. package/packages/fleet/manifest.json +35 -11
  152. package/packages/fleet/manifest.schema.json +62 -10
  153. package/packages/fleet/src/default-agent-file.ts +3 -3
  154. package/packages/fleet/src/install-adl-package.ts +73 -15
  155. package/packages/fleet/src/install-embedding-model.ts +13 -13
  156. package/packages/fleet/src/managed-settings.ts +7 -7
  157. package/packages/fleet/src/repo-maintain.ts +91 -55
  158. package/packages/fleet/src/scratch-reap.ts +5 -5
  159. package/packages/fleet/src/vscode-settings.ts +5 -5
  160. package/packages/repo-controls/README.md +141 -43
  161. package/packages/repo-controls/assets/promote.ts +4 -4
  162. package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
  163. package/packages/repo-controls/assets/version-bump.sh +31 -84
  164. package/packages/repo-controls/bunfig.toml +6 -7
  165. package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
  166. package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
  167. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
  168. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
  169. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
  171. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
  172. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
  173. 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
  174. 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
  175. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
  176. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
  177. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
  178. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
  179. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
  180. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
  181. 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
  182. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
  183. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
  184. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
  185. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
  186. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
  187. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
  188. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
  189. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
  190. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
  191. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
  192. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
  193. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
  194. 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
  195. 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
  196. 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
  197. 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
  198. 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
  199. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
  200. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
  201. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
  202. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
  203. 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
  204. 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
  205. 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
  206. 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
  207. 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
  208. 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
  209. 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
  210. 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
  211. 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
  212. 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
  213. 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
  214. 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
  215. 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
  216. 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
  217. 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
  218. 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
  219. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
  220. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
  221. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
  222. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
  223. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
  224. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
  225. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
  226. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
  227. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
  228. 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
  229. 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
  230. 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
  231. 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
  232. 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
  233. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
  234. 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
  235. 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
  236. 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
  237. 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
  238. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
  239. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
  240. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
  241. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
  242. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
  243. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
  244. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
  245. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
  246. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
  247. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
  248. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
  249. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
  250. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
  251. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
  252. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
  253. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
  254. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
  255. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
  256. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
  257. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
  258. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
  259. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
  260. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
  261. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
  262. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
  263. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
  264. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
  265. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
  266. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
  267. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
  268. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
  269. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
  270. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
  271. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
  272. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
  273. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
  274. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
  275. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
  276. 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
  277. 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
  278. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
  279. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
  280. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
  281. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
  282. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
  283. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
  284. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
  285. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
  286. 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
  287. 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
  288. 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
  289. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
  290. 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
  291. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
  292. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
  293. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
  294. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
  295. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
  296. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
  297. 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
  298. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
  299. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
  300. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
  301. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
  302. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
  303. 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
  304. 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
  305. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
  306. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
  307. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
  308. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
  309. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
  310. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
  311. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
  312. 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
  313. 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
  314. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
  315. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
  316. 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
  317. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
  318. 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
  319. 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
  320. 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
  321. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
  322. 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
  323. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
  324. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
  325. 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
  326. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
  327. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
  328. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
  329. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
  330. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
  331. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
  332. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +258 -2
  333. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
  334. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
  335. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +9 -4
  336. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +1 -1
  337. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +1 -1
  338. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +3 -3
  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 -9
  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
@@ -32,69 +32,6 @@
32
32
  schema: adl.gate-profile/v1
33
33
  rows:
34
34
 
35
- # ---- coverage ----
36
- - id: COV-001
37
- name: backend-crate
38
- domain: coverage
39
- title: Run retained backend crate coverage gate
40
- severity: M
41
- controls:
42
- - EC-A.8.29
43
- engine:
44
- scope:
45
- - <rust>/**
46
- grants: 0
47
- timeout_ms: 60000
48
- - id: COV-002
49
- name: backend-ratchet
50
- domain: coverage
51
- title: Reject backend coverage decline below its ratchet
52
- severity: H
53
- controls:
54
- - EC-A.8.28
55
- engine:
56
- scope:
57
- - <rust>/**
58
- grants: 0
59
- timeout_ms: 60000
60
- - id: COV-003
61
- name: baseline
62
- domain: coverage
63
- title: Run retained coverage baseline gate
64
- severity: M
65
- controls:
66
- - EC-A.8.29
67
- engine:
68
- scope:
69
- - <rust>/**
70
- grants: 0
71
- timeout_ms: 60000
72
- - id: COV-004
73
- name: config-committed
74
- domain: coverage
75
- title: Require coverage ratchet data to be committed
76
- severity: M
77
- controls:
78
- - EC-A.8.29
79
- engine:
80
- scope:
81
- - <compliance>/policy/inputs/coverage-baseline.json
82
- grants: 0
83
- timeout_ms: 60000
84
- - id: COV-005
85
- name: full
86
- domain: coverage
87
- title: Run retained coverage gate
88
- severity: M
89
- controls:
90
- - EC-A.8.29
91
- engine:
92
- scope:
93
- - <rust>/**
94
- - <compliance>/checks/coverage/full/coverage-modules.list
95
- grants: 0
96
- timeout_ms: 60000
97
-
98
35
  # ---- docs ----
99
36
  - id: DOC-001
100
37
  name: adr-lifecycle
@@ -238,7 +175,7 @@ rows:
238
175
  grants: 0
239
176
  timeout_ms: 60000
240
177
 
241
- # ---- frontend ----
178
+ # ---- docs (continued: indexes, ledger, closed-set) ----
242
179
  - id: DOC-008
243
180
  name: indexes
244
181
  domain: docs
@@ -301,6 +238,104 @@ rows:
301
238
  - '<docs>/**'
302
239
  grants: 0
303
240
  timeout_ms: 60000
241
+ - id: DOC-011
242
+ name: filename
243
+ domain: docs
244
+ title: Require docs/ Markdown stems to be lower-kebab
245
+ severity: M
246
+ controls:
247
+ - EC-A.5.37
248
+ engine:
249
+ # docs/ only. The plans tree is deliberately NOT here: its pages answer
250
+ # to the board (LAY-009 owns plans/ frontmatter) and a filename rule is
251
+ # no more able to grade them than a profile is.
252
+ #
253
+ # The scope below mirrors DOC-006 (docs.okf-profile) EXACTLY -- one
254
+ # tree, both docs/ content gates walking it -- with the rationale
255
+ # comments carried over, adjusted only where they were
256
+ # profile-specific:
257
+ scope:
258
+ - <docs>/**
259
+ # A holding area for work that is not yet a Feature on the board.
260
+ # DOC-006 excludes it from profiling by design; mirrored here so a
261
+ # page DOC-006 does not grade is not graded for its filename either.
262
+ - '!<docs>/proposals/**'
263
+ # DOC-006 has excluded compliance/ since 2026-09-15, pending a real
264
+ # compliance audit (its pages answer to audit metadata, not to a
265
+ # gate a writer can satisfy from the document). The exclusion is
266
+ # mirrored here unchanged.
267
+ - '!<docs>/compliance/**'
268
+ # Tree guides are not pages: AGENTS.md and CLAUDE.md say what
269
+ # belongs in a directory and are governed by layout.agents-layout.
270
+ # The check also exempts the two names by rule -- a name may not be
271
+ # lower-kebab and still be correct -- so these excludes are
272
+ # belt-and-braces over that exemption, mirroring DOC-006.
273
+ - '!<docs>/**/AGENTS.md'
274
+ - '!<docs>/AGENTS.md'
275
+ - '!<docs>/**/CLAUDE.md'
276
+ - '!<docs>/CLAUDE.md'
277
+ # A knowledge index is a catalog of a tree, not a page about the
278
+ # system (DOC-006's reasoning); its stem ("index") is
279
+ # kebab-conforming anyway, and the exclusion is mirrored so both
280
+ # gates walk the same tree.
281
+ - '!<docs>/**/index.md'
282
+ grants: 0
283
+ timeout_ms: 60000
284
+ - id: DOC-012
285
+ name: directory-size
286
+ domain: docs
287
+ title: Cap each docs/ directory's page count via the directory ratchet
288
+ severity: M
289
+ controls:
290
+ - EC-A.5.38
291
+ engine:
292
+ # docs/ only. The plans tree is deliberately NOT here: its pages answer
293
+ # to the board (LAY-009 owns plans/ frontmatter) and a page-count cap
294
+ # is no more able to grade them than a filename rule is.
295
+ #
296
+ # The cap is CONFIG, not register content (owner ruling 2026-10-02):
297
+ # it is the repository's declared
298
+ # [controls.compliance.limits].docs_pages_per_directory, arriving as
299
+ # the docs-pages-per-directory declaration; absent, the engine default
300
+ # of 15 stands. The LAY-004 directory-ratchet register holds ONLY
301
+ # per-directory exemption baselines (docs_pages.baseline): an entry
302
+ # exempts its directory up to the recorded count; an absent register or
303
+ # section means NO exemptions, so the cap is enforced bare. At zero
304
+ # exemptions the register file is deleted. docs/decisions/ is exempt by
305
+ # rule at any depth below it — the flat ADR log is flat-by-design, not
306
+ # an over-cap directory.
307
+ #
308
+ # The scope below mirrors DOC-006 (docs.okf-profile) EXACTLY -- one
309
+ # tree, all three docs/ content gates walking it -- with the rationale
310
+ # comments carried over, adjusted only where they were
311
+ # filename-specific:
312
+ scope:
313
+ - <docs>/**
314
+ # A holding area for work that is not yet a Feature on the board.
315
+ # DOC-006 excludes it from profiling by design; mirrored here so a
316
+ # page DOC-006 does not grade is not counted against the cap either.
317
+ - '!<docs>/proposals/**'
318
+ # DOC-006 has excluded compliance/ since 2026-09-15, pending a real
319
+ # compliance audit (its pages answer to audit metadata, not to a
320
+ # gate a writer can satisfy from the document). The exclusion is
321
+ # mirrored here unchanged.
322
+ - '!<docs>/compliance/**'
323
+ # Tree guides are not pages: AGENTS.md and CLAUDE.md say what
324
+ # belongs in a directory and are governed by layout.agents-layout.
325
+ # The check's rule-level exemption is decisions/ (the flat ADR log,
326
+ # flat-by-design) rather than these names, so these excludes are
327
+ # the whole of the guide story here, mirroring DOC-006.
328
+ - '!<docs>/**/AGENTS.md'
329
+ - '!<docs>/AGENTS.md'
330
+ - '!<docs>/**/CLAUDE.md'
331
+ - '!<docs>/CLAUDE.md'
332
+ # A knowledge index is a catalog of a tree, not a page about the
333
+ # system (DOC-006's reasoning); it does not count against the page
334
+ # cap either, and the exclusion is mirrored so the docs gates walk
335
+ # the same tree.
336
+ - '!<docs>/**/index.md'
337
+ grants: 0
338
+ timeout_ms: 60000
304
339
 
305
340
  # ---- layout ----
306
341
  - id: LAY-001
@@ -366,6 +401,14 @@ rows:
366
401
  controls:
367
402
  - EC-A.5.36
368
403
  engine:
404
+ # The ceilings are CONFIG, not register content (generic ratchet
405
+ # principle, owner ruling 2026-10-02): they live in
406
+ # [controls.compliance.directory-ratchet].max_children and reach the
407
+ # engine as the directory-ceilings declaration. The LAY-004 register
408
+ # records exemption baselines only; an absent register means no
409
+ # exemptions allowed, so the ceilings are enforced bare. At zero
410
+ # recorded state the register file is deleted. No ceilings declared
411
+ # means nothing to enforce — the gate is inert.
369
412
  scope:
370
413
  - <typescript>/**
371
414
  - <rust>/**
@@ -390,11 +433,16 @@ rows:
390
433
  - '!**/Cargo.toml'
391
434
  - '!**/build.rs'
392
435
  - '!**/main.tf'
393
- # No named-input entry for the ratchet register: it is package data now
394
- # (src/adl_compliance/checks/layout/directory_ratchet/grants.yaml,
395
- # read via `resources`, not a consumer path), so editing it does not
396
- # select this gate -- the same known gap DOC-006's packaged profile
397
- # register has (see INVARIANTS.md, "What is not true yet").
436
+ # The ratchet register is a named INPUT of this gate, not a scope entry:
437
+ # it is the CONSUMER's own file (<compliance>/ratchets/
438
+ # LAY-004-over-limit-directory.yaml -- the estate's settled location for
439
+ # a consumer-owned ratchet number, see packages/repo-controls/src/
440
+ # config.ts), and <compliance> is not one of this row's scope trees, so
441
+ # editing the register does not select this gate -- the same known gap
442
+ # DOC-006's packaged profile register has. It shipped as package data
443
+ # once and graded one donor repository's shape against every other
444
+ # repository (K-42); the `inputs` entry and
445
+ # test_the_register_is_not_packaged_data guard that return.
398
446
  # Tree-scoped only. Every verdict is a directory's DIRECT FILE COUNT, which
399
447
  # is only knowable by listing all of that directory's children: on a diff
400
448
  # scope DIR-002 can never fire and DIR-001's single-file rule misfires on
@@ -404,7 +452,8 @@ rows:
404
452
  # removes. `full` (`selects: all-rows`) picks this row up regardless.
405
453
  # Not an exception catalogue: `structural_grant = True` on the check
406
454
  # already forces the allowance to 0 regardless of this field. The ratchet
407
- # register itself is package data, read via `resources` (see check.py).
455
+ # register itself is the consumer's own file, reached through the check's
456
+ # named `inputs`, not package data (see check.py).
408
457
  grants: 0
409
458
  timeout_ms: 60000
410
459
  - id: LAY-006
@@ -466,25 +515,6 @@ rows:
466
515
  - <plans>/**
467
516
  grants: 0
468
517
  timeout_ms: 60000
469
- - id: LAY-010
470
- name: profile-data
471
- domain: layout
472
- title: Enforce data-backed layout profile predicates
473
- severity: M
474
- controls:
475
- - EC-A.5.36
476
- engine:
477
- # The two `*.md` globs are removed. They are residue from the multi-mode
478
- # profile-data.sh this engine was split out of: its `layout.markdown-trees`
479
- # branch read Markdown, and that branch now lives in its own gate
480
- # (check-markdown-tree-location.sh) with its own row. This engine reads
481
- # PostgreSQL migrations and nothing else, so the globs only made every
482
- # documentation change schedule a gate with nothing to say. A stale scope
483
- # is a silent pass in one direction and dead work in the other (K-17).
484
- scope:
485
- - <rust>/crates/**
486
- grants: 0
487
- timeout_ms: 60000
488
518
  - id: LAY-011
489
519
  name: references
490
520
  domain: layout
@@ -592,7 +622,7 @@ rows:
592
622
  - id: LAY-016
593
623
  name: open-work-cap
594
624
  domain: layout
595
- title: No open plans or open gaps
625
+ title: Cap open plans and open gaps at ten
596
626
  severity: M
597
627
  controls:
598
628
  - EC-A.5.36
@@ -613,14 +643,16 @@ rows:
613
643
  engine:
614
644
  scope:
615
645
  - '**'
616
- # The LFS fixtures are deliberately oversized binaries committed WITHOUT
617
- # LFS -- that is precisely what they prove the check detects. Grading
618
- # them means a package that fixture-tests "large blobs must use LFS"
619
- # can never pass its own gate.
646
+ # LFS-001's own test cases are generated at test time under tmp_path
647
+ # (the committed LFS fixtures were retired 2026-10-01), so this gate no
648
+ # longer commits oversized binaries. The `!**/fixtures/**` exclusion
649
+ # remains because OTHER gates still commit fixtures, and fixture data
650
+ # is test input, not repository content to grade.
620
651
  - '!**/fixtures/**'
621
652
  grants: 0
622
653
  timeout_ms: 60000
623
654
 
655
+ # ---- pipeline ----
624
656
  - id: PIP-004
625
657
  name: phase-disjoint
626
658
  domain: pipeline
@@ -675,6 +707,13 @@ rows:
675
707
  - EC-A.5.21
676
708
  engine:
677
709
  scope:
710
+ # The tree-derived DEFAULT: each half is exactly two entries under its own
711
+ # tree. A repository whose manifests do not sit one level under its tree
712
+ # (enact-combined: a brace-union `typescript` tree, manifests at the root and
713
+ # under apps/*/) states the paths itself with `[controls.compliance.lockfiles]`
714
+ # (`bun-manifests`/`bun-lockfiles`, `cargo-manifests`/`cargo-lockfiles`); a
715
+ # declared half REPLACES that half's two entries, in the scope and in what the
716
+ # check grades. See `LockfileIntegrity.declared_scope`.
678
717
  - <rust>/Cargo.toml
679
718
  - <rust>/Cargo.lock
680
719
  - <typescript>/package.json
@@ -736,56 +775,3 @@ rows:
736
775
  - '**'
737
776
  grants: 0
738
777
  timeout_ms: 60000
739
- - id: REL-001
740
- name: changeset-plan
741
- domain: release
742
- title: Run retained changeset-plan gate
743
- severity: M
744
- controls:
745
- - EC-A.8.32
746
- engine:
747
- scope:
748
- # The gate's own "release-relevant" case list, which is six paths, not
749
- # one tree. `.changeset/**` alone understated it by five: while the gate
750
- # resolved its own diff those five were still tested, so the row and the
751
- # code disagreed and the code won. Now the row is the narrowing, so a
752
- # missing entry here is a file the gate can no longer see.
753
- - .changeset/**
754
- - VERSION
755
- - CHANGELOG.md
756
- - <workflows>/package.json
757
- - <workflows>/changesets/package.json
758
- - <workflows>/changesets/bun.lock
759
- grants: 0
760
- timeout_ms: 60000
761
- - id: REL-004
762
- name: version-release
763
- domain: release
764
- title: Run retained version-release gate
765
- severity: M
766
- controls:
767
- - EC-A.8.32
768
- engine:
769
- scope:
770
- # The FOUR files check.sh actually reads: VERSION and CHANGELOG.md
771
- # directly, plus the two entries in its `versioned_files` array. The
772
- # prior brace-glob form, `{VERSION,CHANGELOG.md,backend/Cargo.toml,
773
- # frontend/package.json,.changeset}/**`, appended `/**` after each
774
- # FILE name -- `_glob_bash_pattern` in lib/glob.sh requires a literal
775
- # "/" then more characters after the alternation, which a bare file
776
- # never has, so the pattern matched none of VERSION, CHANGELOG.md,
777
- # backend/Cargo.toml or frontend/package.json and only `.changeset/**`
778
- # ever selected this row (K-13: a positive glob matching nothing
779
- # excludes everything). backend/Cargo.toml (0.1.52) and
780
- # frontend/package.json (2.1.41) carry their own independent
781
- # versioning, not the release VERSION (0.0.11) -- check.sh does not
782
- # read either, so they are not restored here; adding them would
783
- # trigger this gate for two files it has no logic to grade.
784
- - VERSION
785
- - CHANGELOG.md
786
- - <workflows>/package.json
787
- - <workflows>/changesets/package.json
788
- grants: 0
789
- timeout_ms: 60000
790
-
791
- # ---- rust ----
@@ -27,7 +27,7 @@ from ..core.constants import Constants
27
27
  from ..core.finding import Severity
28
28
  from ..core.models import StrictModel
29
29
  from ..core.errors import CouldNotRun
30
- from .config import PLACEHOLDER, TreeMapError, expand
30
+ from .config import PLACEHOLDER, expand
31
31
  from collections.abc import Mapping
32
32
 
33
33
  from .config import load as load_tree_map
@@ -21,10 +21,27 @@ choice — none can be moved into an owning tree without breaking the tool that
21
21
  reads them. The same is true of `pyproject.toml` for Python and `Cargo.toml`
22
22
  for Rust. A repository using none of a section simply never matches its
23
23
  entries; an entry that permits an absent file costs nothing.
24
+
25
+ **Non-standard entries are declared per repository, not listed here.** The sets
26
+ below hold only what is standard across repositories. A repository that keeps
27
+ something else at its root — a `STATUS.md` register, an `apps/` tree — declares
28
+ it in its own `adl-config.toml` under `[controls.compliance.root]` (`files` and
29
+ `dirs`). That arrives in the engine as the `root-files` and `root-dirs`
30
+ declarations (comma-separated), and `allowed_root_files` / `allowed_root_dirs`
31
+ return the central set UNION those names. The gates compute the effective set at
32
+ grade time from `Context.declarations`; the module-level sets stay the central
33
+ defaults and are never mutated.
24
34
  """
25
35
 
26
36
  from __future__ import annotations
27
37
 
38
+ from collections.abc import Mapping
39
+
40
+ # The `Context.declarations` keys a repository's `[controls.compliance.root]`
41
+ # table is sent under (`--declare root-files=a,b` / `--declare root-dirs=x,y`).
42
+ ROOT_FILES_DECLARATION = "root-files"
43
+ ROOT_DIRS_DECLARATION = "root-dirs"
44
+
28
45
  # ── Files ─────────────────────────────────────────────────────────────────────
29
46
 
30
47
  VCS_AND_META: frozenset[str] = frozenset({
@@ -63,14 +80,12 @@ GOVERNANCE: frozenset[str] = frozenset({
63
80
  # Registers read by whoever picks the work up next. They sit at the root
64
81
  # because that is where someone arriving at the repository looks.
65
82
  #
66
- # STATUS.md (the live checklist) and DRIFT.md (the drift audit) are the same
67
- # kind of object: a register read by whoever picks the work up next, not
68
- # narrative documentation that belongs under docs/. (Tarun, 2026-09-27.)
83
+ # Only the standard ones. A repository's own registers (a STATUS.md, a DRIFT.md)
84
+ # are not standard: it declares them under `[controls.compliance.root] files`.
85
+ # (Tarun, 2026-10-01 — reverses the 2026-09-27 central listing.)
69
86
  REGISTERS: frozenset[str] = frozenset({
70
87
  "GAPS-AND-FINDINGS.md",
71
88
  "OPEN-ITEMS.md",
72
- "STATUS.md",
73
- "DRIFT.md",
74
89
  })
75
90
 
76
91
  NODE_TOOLCHAIN: frozenset[str] = frozenset({
@@ -140,6 +155,10 @@ PROJECT_CONFIG: frozenset[str] = frozenset({
140
155
  "docker-compose.yml",
141
156
  "drizzle.config.ts",
142
157
  "adl-config.toml",
158
+ # An adl-controlled Enact repository carries BOTH config files at its root,
159
+ # permanently (Tarun, 2026-10-01: "there will be both"). Built in here so no
160
+ # repository declares it by hand under `[controls.compliance.root] files`.
161
+ "enact-config.toml",
143
162
  "justfile",
144
163
  })
145
164
 
@@ -184,12 +203,10 @@ KNOWLEDGE_TREES: frozenset[str] = frozenset({
184
203
  "specs",
185
204
  })
186
205
 
206
+ # Only the standard source trees. `apps/` and `packaging/` are not standard — a
207
+ # repository that has them declares them under `[controls.compliance.root] dirs`.
208
+ # (Tarun, 2026-10-01 — reverses the 2026-09-27 central listing.)
187
209
  SOURCE_TREES: frozenset[str] = frozenset({
188
- # `apps/` (deployables) and `packaging/` are sanctioned root directories in
189
- # the Enact monorepo layout this repository follows — the Enact monorepo
190
- # itself carries both. (Tarun, 2026-09-27.)
191
- "apps",
192
- "packaging",
193
210
  "backend",
194
211
  "compliance",
195
212
  "docker",
@@ -248,3 +265,28 @@ ALLOWED_ROOT_DIRS: frozenset[str] = (
248
265
  # deliberately tiny: this package installs into repositories whose shape it does
249
266
  # not know, and every entry here is a demand made of all of them.
250
267
  REQUIRED_ROOT_FILES: frozenset[str] = frozenset({"AGENTS.md"})
268
+
269
+
270
+ # ── Per-repository declarations ───────────────────────────────────────────────
271
+
272
+
273
+ def declared_root_names(declarations: Mapping[str, str], key: str) -> frozenset[str]:
274
+ """The names a repository declared under `key` — a comma-separated string.
275
+
276
+ Whitespace around a name is stripped and empty entries are dropped, so
277
+ `" a, ,b,"` is `{"a", "b"}`. An absent key is the empty set, never an error:
278
+ a repository that declares nothing is graded against the central set alone.
279
+ """
280
+ return frozenset(
281
+ name for name in (part.strip() for part in declarations.get(key, "").split(",")) if name
282
+ )
283
+
284
+
285
+ def allowed_root_files(declarations: Mapping[str, str]) -> frozenset[str]:
286
+ """Root files permitted for THIS repository: the central set plus `root-files`."""
287
+ return ALLOWED_ROOT_FILES | declared_root_names(declarations, ROOT_FILES_DECLARATION)
288
+
289
+
290
+ def allowed_root_dirs(declarations: Mapping[str, str]) -> frozenset[str]:
291
+ """Root directories permitted for THIS repository: the central set plus `root-dirs`."""
292
+ return ALLOWED_ROOT_DIRS | declared_root_names(declarations, ROOT_DIRS_DECLARATION)
@@ -143,12 +143,20 @@ def applicable_files(
143
143
  exhaustive: bool,
144
144
  universe: Iterable[str] | None,
145
145
  trees: Mapping[str, str] | None,
146
+ restated: tuple[str, ...] | None = None,
146
147
  ) -> FileSet:
147
- """Resolve one row's scope once, for both ordinary and batched execution."""
148
+ """Resolve one row's scope once, for both ordinary and batched execution.
149
+
150
+ `restated` is the raw scope a check built from the repository's declarations
151
+ (`Check.declared_scope`), replacing the row's own; it is expanded and has its
152
+ absent trees dropped exactly like the registry's, and it is graded whole.
153
+ """
154
+ raw_scope = row.engine.scope if restated is None else restated
155
+ whole_scope = check.whole_scope or restated is not None
148
156
  try:
149
157
  patterns = tuple(
150
158
  expand(pattern, trees)
151
- for pattern in row.engine.scope
159
+ for pattern in raw_scope
152
160
  if not absent(pattern, trees)
153
161
  )
154
162
  except TreeMapError as exc:
@@ -166,7 +174,7 @@ def applicable_files(
166
174
  "a scope selecting nothing is could-not-run, never a clean pass"
167
175
  )
168
176
 
169
- if not check.whole_scope or not narrowed:
177
+ if not whole_scope or not narrowed:
170
178
  return narrowed
171
179
  if universe is None:
172
180
  if not exhaustive:
@@ -292,6 +300,7 @@ def run(
292
300
  trees: Mapping[str, str] | None = None,
293
301
  declared_trees: Mapping[str, str] | None = None,
294
302
  batch_results: Mapping[str, BatchResult] | None = None,
303
+ committed_sizes: Mapping[str, int] | None = None,
295
304
  ) -> Verdict:
296
305
  """Grade one row.
297
306
 
@@ -303,6 +312,9 @@ def run(
303
312
  `universe` is the complete Git-visible tree supplied alongside a narrowed
304
313
  set for checks declaring `whole_scope`; without it, a triggered such check
305
314
  is could-not-run rather than counting a partial tree.
315
+ `committed_sizes` is path -> size of the blob Git stores, measured by the CLI
316
+ (the only caller of git) and carried into `Context` for a check that reads it;
317
+ a path absent from it has no committed fact and is graded by the worktree.
306
318
  """
307
319
  try:
308
320
  check_class = lookup(row.id)
@@ -310,6 +322,11 @@ def run(
310
322
  return could_not_run(row, f"no check implements {row.id}")
311
323
 
312
324
  try:
325
+ # A check may restate its scope from what the repository declares; the
326
+ # default answers `None` and the registry's scope stands. Asked here,
327
+ # inside the same guard, so a malformed declaration is the row's
328
+ # could-not-run verdict.
329
+ restated = check_class.declared_scope(row.engine.scope, declarations or {})
313
330
  narrowed = applicable_files(
314
331
  row,
315
332
  check_class,
@@ -317,11 +334,12 @@ def run(
317
334
  exhaustive=exhaustive,
318
335
  universe=universe,
319
336
  trees=trees,
337
+ restated=restated,
320
338
  )
321
339
  except CouldNotRun as exc:
322
340
  return could_not_run(row, str(exc))
323
341
 
324
- if check_class.whole_scope and not narrowed:
342
+ if (check_class.whole_scope or restated is not None) and not narrowed:
325
343
  return decide(row, (), (), ())
326
344
 
327
345
  missing = [tool for tool in check_class.requires if shutil.which(tool) is None]
@@ -347,6 +365,7 @@ def run(
347
365
  root=root, row=row,
348
366
  inputs=resolve_inputs(check_class, root, inputs, stack, trees, declared_trees),
349
367
  declarations=dict(declarations or {}),
368
+ committed_sizes=dict(committed_sizes or {}),
350
369
  batch_reports=batch.reports if batch is not None else None,
351
370
  batch_error=batch.error if batch is not None else None,
352
371
  )
@@ -14,19 +14,12 @@
14
14
  "scripts": {
15
15
  "typecheck": "tsc --noEmit",
16
16
  "test": "bun test tests --coverage --timeout 30000",
17
- "check": "tsc --noEmit && bun test tests --coverage --timeout 30000",
18
- "coverage:ratchet": "bun workflows/scripts/coverage/ci-ratchet.ts",
19
- "coverage:produce": "bun test tests --coverage --timeout 30000 && bun workflows/scripts/coverage/command.ts"
17
+ "check": "tsc --noEmit && bun test tests --coverage --timeout 30000"
20
18
  },
21
19
  "dependencies": {
22
- "@tailwindcss/node": "4.2.1",
23
- "istanbul-lib-coverage": "3.2.2",
24
- "svelte": "5.38.10",
25
- "tailwindcss": "4.1.11",
26
20
  "typescript": "5.9.3"
27
21
  },
28
22
  "devDependencies": {
29
- "@types/bun": "1.4.2",
30
- "@types/istanbul-lib-coverage": "2.0.6"
23
+ "@types/bun": "1.4.2"
31
24
  }
32
25
  }
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env bash
2
+ # Records the activity/deny log row, like every other bundled hook. The Git LFS
3
+ # chaining for this hook (git-lfs installs a post-merge) runs in TypeScript, in
4
+ # src/hook.ts's `runHook` via src/lfs.ts -- the credential environment git
5
+ # handed the hook only exists there; see src/lfs.ts's header.
6
+ set -euo pipefail
7
+
8
+ ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0
9
+ cd "$ROOT"
10
+
11
+ # shellcheck source=lib/hook-log.sh
12
+ . "$(CDPATH='' cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)/lib/hook-log.sh"
13
+ hook_log_init post-merge "$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo HEAD)"
@@ -88,9 +88,9 @@ while IFS= read -r git_variable; do
88
88
  unset "$git_variable"
89
89
  done < <(git rev-parse --local-env-vars)
90
90
 
91
- # `just azdo-push` supplies its short-lived bearer header through Git's
92
- # command-scoped config environment. The parent Git process retains it for the
93
- # HTTPS push, but checks launched by this hook must never inherit it.
91
+ # azdo-push injects no credential (git-ado is the one boundary), but a caller's
92
+ # command-scoped Git config environment may still be set. The parent Git process
93
+ # keeps it for the push; checks launched by this hook must never inherit it.
94
94
  if [[ "$git_config_count" =~ ^[0-9]+$ ]]; then
95
95
  for ((index = 0; index < git_config_count; index++)); do
96
96
  unset "GIT_CONFIG_KEY_${index}" "GIT_CONFIG_VALUE_${index}"