@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.12 → 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 (405) 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 +10 -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 +159 -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 +34 -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/src/azdo-pl.ts +2 -54
  140. package/packages/azdo/src/azdo-pr-review.ts +4 -4
  141. package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
  142. package/packages/azdo/src/azdo-wit.ts +41 -2
  143. package/packages/azdo/src/lib/agent-identity.ts +12 -14
  144. package/packages/azdo/src/lib/agent-token.ts +2 -2
  145. package/packages/azdo/src/lib/client.ts +0 -5
  146. package/packages/azdo/src/lib/graph-identity.ts +4 -4
  147. package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
  148. package/packages/azdo/src/workflow-rules.ts +128 -0
  149. package/packages/fleet/manifest.json +35 -11
  150. package/packages/fleet/manifest.schema.json +62 -10
  151. package/packages/fleet/src/default-agent-file.ts +3 -3
  152. package/packages/fleet/src/install-adl-package.ts +73 -15
  153. package/packages/fleet/src/install-embedding-model.ts +13 -13
  154. package/packages/fleet/src/managed-settings.ts +7 -7
  155. package/packages/fleet/src/repo-maintain.ts +91 -55
  156. package/packages/fleet/src/scratch-reap.ts +5 -5
  157. package/packages/fleet/src/vscode-settings.ts +5 -5
  158. package/packages/repo-controls/README.md +141 -43
  159. package/packages/repo-controls/assets/promote.ts +4 -4
  160. package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
  161. package/packages/repo-controls/assets/version-bump.sh +31 -84
  162. package/packages/repo-controls/bunfig.toml +6 -7
  163. package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
  164. package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
  165. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
  166. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
  167. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
  168. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
  169. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
  171. 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
  172. 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
  173. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
  174. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
  175. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
  176. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
  177. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
  178. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
  179. 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
  180. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
  181. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
  182. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
  183. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
  184. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
  185. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
  186. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
  187. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
  188. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
  189. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
  190. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
  191. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
  192. 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
  193. 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
  194. 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
  195. 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
  196. 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
  197. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
  198. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
  199. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
  200. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
  201. 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
  202. 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
  203. 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
  204. 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
  205. 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
  206. 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
  207. 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
  208. 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
  209. 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
  210. 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
  211. 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
  212. 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
  213. 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
  214. 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
  215. 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
  216. 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
  217. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
  218. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
  219. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
  220. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
  221. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
  222. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
  223. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
  224. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
  225. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
  226. 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
  227. 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
  228. 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
  229. 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
  230. 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
  231. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
  232. 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
  233. 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
  234. 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
  235. 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
  236. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
  237. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
  238. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
  239. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
  240. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
  241. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
  242. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
  243. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
  244. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
  245. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
  246. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
  247. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
  248. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
  249. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
  250. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
  251. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
  252. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
  253. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
  254. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
  255. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
  256. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
  257. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
  258. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
  259. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
  260. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
  261. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
  262. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
  263. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
  264. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
  265. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
  266. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
  267. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
  268. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
  269. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
  270. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
  271. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
  272. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
  273. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
  274. 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
  275. 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
  276. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
  277. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
  278. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
  279. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
  280. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
  281. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
  282. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
  283. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
  284. 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
  285. 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
  286. 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
  287. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
  288. 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
  289. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
  290. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
  291. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
  292. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
  293. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
  294. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
  295. 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
  296. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
  297. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
  298. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
  299. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
  300. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
  301. 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
  302. 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
  303. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
  304. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
  305. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
  306. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
  307. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
  308. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
  309. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
  310. 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
  311. 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
  312. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
  313. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
  314. 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
  315. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
  316. 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
  317. 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
  318. 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
  319. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
  320. 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
  321. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
  322. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
  323. 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
  324. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
  325. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
  326. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
  327. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
  328. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
  329. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
  330. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +256 -0
  331. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
  332. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
  333. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +1 -1
  334. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
  335. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
  336. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
  337. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
  338. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
  339. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
  340. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
  341. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
  342. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
  343. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
  344. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
  345. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
  346. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
  347. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
  348. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
  349. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
  350. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
  351. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
  352. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
  353. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
  354. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
  355. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
  356. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
  357. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
  358. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
  359. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
  360. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
  361. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
  362. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
  363. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
  364. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
  365. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
  366. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
  367. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
  368. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
  369. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
  370. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
  371. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
  372. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
  373. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
  374. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
  375. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
  376. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
  377. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
  378. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
  379. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
  380. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
  381. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
  382. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
  383. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
  384. package/packages/repo-controls/package.json +2 -9
  385. package/packages/repo-controls/scripts/hooks/post-merge +13 -0
  386. package/packages/repo-controls/scripts/hooks/pre-push +3 -3
  387. package/packages/repo-controls/src/azdo-push.ts +64 -36
  388. package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
  389. package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
  390. package/packages/repo-controls/src/cli.ts +29 -8
  391. package/packages/repo-controls/src/compliance-config.ts +410 -2
  392. package/packages/repo-controls/src/config.ts +133 -60
  393. package/packages/repo-controls/src/constants.ts +13 -27
  394. package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
  395. package/packages/repo-controls/src/doctor.ts +46 -19
  396. package/packages/repo-controls/src/gitignore-block.ts +5 -29
  397. package/packages/repo-controls/src/hook-log.ts +1 -2
  398. package/packages/repo-controls/src/hook.ts +201 -45
  399. package/packages/repo-controls/src/install.ts +14 -8
  400. package/packages/repo-controls/src/integrity.ts +3 -3
  401. package/packages/repo-controls/src/lfs.ts +111 -0
  402. package/packages/repo-controls/src/promote.ts +8 -8
  403. package/packages/repo-controls/src/runtime.ts +9 -1
  404. package/packages/repo-controls/src/workflows-drift.ts +4 -5
  405. package/packages/repo-controls/src/worktree-guard.ts +3 -3
@@ -1,4 +1,4 @@
1
- """LAY-004 — every registered tree's committed directory-shape ratchet.
1
+ """LAY-004 — every configured tree's committed directory-shape ratchet.
2
2
 
3
3
  Two rules over one measurement — a directory's DIRECT FILE COUNT — plus the
4
4
  third rule that makes this check unlike any other ported so far:
@@ -20,39 +20,64 @@ its own has zero children; each subdirectory is counted separately by the same
20
20
  rule. Nothing here walks: every count is taken from the set the runner handed
21
21
  over, narrowed to one tree at a time.
22
22
 
23
- The register is package data, shipped beside this file as a `resources` entry
24
- (`grants.yaml`, resolved through `importlib.resources` like every other packaged
25
- input) — not a consumer path spelled through the row's `grants:` field. It is
26
- not a catalogue of signed exceptions either way, and `structural_grant` is what
27
- says so: see `Check.structural_grant` for why passing its size as an allowance
28
- turns a failing gate green.
23
+ THE CEILINGS ARE CONFIG, NOT REGISTER CONTENT — the estate's generic ratchet
24
+ principle (owner ruling 2026-10-02, Tarun: "Move ALL configurations to
25
+ adl-config.toml"), superseding this gate's own earlier "ratchets sit ON TOP"
26
+ ruling the same day (the same supersession DOC-012 v2 shipped, and the two
27
+ gates must read as one family):
28
+
29
+ 1. The RULE — each tree's direct-file ceiling — is CONFIGURATION and lives
30
+ in `[controls.compliance.directory-ratchet].max_children`, reaching the
31
+ engine as the `directory-ceilings` declaration
32
+ (`<path>:<n>,<path>:<n>`). `_ceilings` resolves it the way DOC-012's
33
+ `page_cap` resolves its limit: each entry must be a repo-relative path
34
+ and a base-10 positive integer; any malformed entry is could-not-run
35
+ naming the config key and the entry. NO ceilings declared means nothing
36
+ to enforce — the gate is inert and the register is not even read.
37
+ 2. The register records STATE only — the consumer-owned
38
+ `<compliance>/ratchets/LAY-004-over-limit-directory.yaml` (the estate's
39
+ settled location for a consumer-owned ratchet number), holding
40
+ over-limit and single-file exemption baselines and nothing else. It
41
+ shipped once as a `resources` entry, one donor repository's entire
42
+ directory shape graded against every other repository (the K-42 defect,
43
+ recorded on `inputs` below); the `test_the_register_is_not_packaged_data`
44
+ regression test guards that return. `structural_grant` is what says it
45
+ is not an exception catalogue: see `Check.structural_grant` for why
46
+ passing its size as an allowance turns a failing gate green.
47
+ 3. At zero recorded state the file is DELETED — and the gate still runs,
48
+ enforcing the configured ceilings bare. "No ratchet file" means zero
49
+ exemptions allowed, never a toothless gate: an ABSENT register grades
50
+ STRICTER (the widening input's normal contract), a register that EXISTS
51
+ but is unusable is could-not-run, and a file recording zero state is a
52
+ load failure (the shared model's cross-field validator). A tree the
53
+ configuration names but the repository deleted is cleanup, not a defect:
54
+ one advisory says its baseline entries are no longer accounted, and the
55
+ remaining trees are graded normally. DIR-003 still fires for a baseline
56
+ entry under a LIVE tree whose directory was deleted, because the
57
+ register's own hygiene is the owner's edit and the gate still says so.
58
+
59
+ The register model lives in `.register` (same folder), shared with DOC-012,
60
+ which mints DIR-004/005/006 over the same file's `docs_pages.baseline` — one
61
+ family of rule ids over one file of state, graded by two gates. What changed
62
+ for LAY-004 in the 2026-10-02 generic-principle rework is only WHERE the
63
+ ceilings live; DIR-001/002/003, the message phrasing, and the measurement
64
+ discipline are untouched, so a repository's recorded state keeps meaning
65
+ exactly what it meant. `DirectoryShape` below stays here — it is this gate's
66
+ measurement, not the register's.
29
67
  """
30
68
 
31
69
  from __future__ import annotations
32
70
 
71
+ import re
33
72
  from collections.abc import Iterable
34
- from typing import Annotated, ClassVar, Literal
35
-
36
- from pydantic import Field
73
+ from typing import ClassVar
37
74
 
38
75
  from ....core.check import Check
39
76
  from ....core.context import Context, FileSet
40
77
  from ....core.errors import CouldNotRun, SchemaInvalid
41
78
  from ....core.finding import Report
42
79
  from ....core.models import StrictModel
43
-
44
-
45
- class Ratchet(StrictModel):
46
- """The register. `max_children` is the list of trees this gate holds at
47
- all, so an empty one is a gate grading nothing — a load failure, not a pass."""
48
-
49
- schema_version: Literal[2]
50
- """Locked, not just typed: a future bump must change this literal, which
51
- makes it a deliberate, schema-revealing edit rather than a silent one."""
52
-
53
- max_children: Annotated[dict[str, int], Field(min_length=1)]
54
- over_children_baseline: dict[str, int] = {}
55
- single_file_baseline: dict[str, str] = {}
80
+ from .register import Ratchet
56
81
 
57
82
 
58
83
  class DirectoryShape(StrictModel):
@@ -67,6 +92,16 @@ class DirectoryRatchet(Check):
67
92
  id: ClassVar[str] = "LAY-004"
68
93
  structural_grant: ClassVar[bool] = True
69
94
 
95
+ CEILINGS_DECLARATION: ClassVar[str] = "directory-ceilings"
96
+
97
+ CEILING: ClassVar[re.Pattern[str]] = re.compile(r"([\w.-]+(?:/[\w.-]+)*):([0-9]+)")
98
+ """One ceiling entry: a repo-relative path of word characters, dashes,
99
+ dots and slashes (no comma — the list separator; no colon — the entry
100
+ separator; no leading slash — paths are repository-relative), a colon,
101
+ and a base-10 positive integer. ASCII digits only, so `+20`, `1_0`,
102
+ ` 20` and full-width digits are refused, which `int()` alone would
103
+ accept."""
104
+
70
105
  # CONSUMER-OWNED, not package data. This shipped as a `resources` entry
71
106
  # (`grants.yaml`) holding one donor repository's entire directory shape:
72
107
  # 88 of its 104 lines named `<rust>/crates/enact-*`,
@@ -83,43 +118,124 @@ class DirectoryRatchet(Check):
83
118
  "register": "<compliance>/ratchets/LAY-004-over-limit-directory.yaml",
84
119
  }
85
120
 
121
+ # The runner's OPTIONAL-INPUT channel, in its NORMAL direction — the
122
+ # 2026-10-02 "ratchets sit ON TOP" exception this comment used to carry
123
+ # (an absent register removes every ceiling and baseline, so the gate
124
+ # passes clean) is SUPERSEDED for this gate by the generic ratchet
125
+ # principle: the ceilings are CONFIGURATION (adl-config.toml), and the
126
+ # register is recorded STATE, so an absent register removes the
127
+ # EXEMPTIONS and the gate grades STRICTER — `core.check`'s documented
128
+ # widening contract, exactly as on DOC-012. The channel is still the
129
+ # right mechanism: a repository that declares no `compliance` tree (or
130
+ # declares it "") must not be pressured into inventing one just to host
131
+ # a file it does not need — and the `structural_grant` docstring's
132
+ # "a gate grading nothing" failure mode no longer applies to absence,
133
+ # only to a file that exists recording zero state. Read with `.get()`,
134
+ # never assumed present.
135
+ widening_inputs: ClassVar[frozenset[str]] = frozenset({"register"})
136
+
86
137
  OVER: ClassVar[str] = "DIR-001"
87
138
  GREW: ClassVar[str] = "DIR-002"
88
139
  STALE: ClassVar[str] = "DIR-003"
89
140
 
90
141
  def graded(self, ctx: Context, files: FileSet) -> Iterable[Report]:
142
+ ceilings = self._ceilings(ctx)
143
+ if not ceilings:
144
+ # Nothing configured is nothing to enforce: the gate is inert,
145
+ # and the register is not read (its entries could only ever
146
+ # REMOVE findings).
147
+ return
148
+
91
149
  ratchet = self._register(ctx)
150
+ over_children: dict[str, int] = {}
151
+ single_file: dict[str, str] = {}
152
+ if ratchet is not None:
153
+ over_children = ratchet.over_children_baseline
154
+ single_file = ratchet.single_file_baseline
155
+
156
+ for tree, ceiling in sorted(ceilings.items()):
157
+ # Each tree sees only its OWN entries. The register holds every
158
+ # tree's state in one namespace, and a tree's measurement can
159
+ # never contain another tree's path — so without this filter
160
+ # every other tree's entries would report DIR-003 on every run.
161
+ over = self._entries_under(over_children, tree)
162
+ single = self._entries_under(single_file, tree)
92
163
 
93
- for tree, ceiling in sorted(ratchet.max_children.items()):
94
164
  if not ctx.path(tree).is_dir():
95
- raise CouldNotRun(f"registered tree directory is missing: {tree}")
165
+ # Generic principle: a tree the CONFIGURATION names but the
166
+ # repository no longer has is cleanup, not a defect. One
167
+ # advisory names what is unaccounted; the remaining trees
168
+ # are graded normally.
169
+ unaccounted = len(over) + len(single)
170
+ noun = "entry" if unaccounted == 1 else "entries"
171
+ yield self.advise(
172
+ tree,
173
+ f"tree {tree} with a configured ceiling ({ceiling} direct "
174
+ f"children) is absent from this repository; its "
175
+ f"{unaccounted} baseline {noun} are no longer "
176
+ "accounted — remove its register entries or restore the tree",
177
+ )
178
+ continue
96
179
 
97
180
  measured = self._measure(ctx, files, tree)
98
- # Each tree sees only its OWN entries. The register holds every
99
- # tree's exceptions in one namespace, and a tree's measurement can
100
- # never contain another tree's path — so without this filter every
101
- # other tree's entries would report DIR-003 on every run.
102
- over = self._entries_under(ratchet.over_children_baseline, tree)
103
- single = self._entries_under(ratchet.single_file_baseline, tree)
104
-
105
181
  yield from self._graded_over(measured, over, ceiling)
106
182
  yield from self._graded_single(measured, single)
107
183
 
184
+ # ------------------------------------------------------------ the ceilings
185
+
186
+ def _ceilings(self, ctx: Context) -> dict[str, int]:
187
+ """The per-tree ceilings in force, from the `directory-ceilings`
188
+ declaration (`[controls.compliance.directory-ratchet].max_children`).
189
+
190
+ Absent is `{}`: no table declared, nothing to enforce — the gate is
191
+ inert and the register is not read. Each entry must be
192
+ `<path>:<positive int>` with ASCII digits (paths carry slashes,
193
+ letters, dashes, underscores and dots — never a comma or a colon,
194
+ which are the list and entry separators); ANY malformed entry is
195
+ could-not-run naming the config key and the offending entry, never a
196
+ quiet skip — a ceiling the repository cannot state is not a ceiling
197
+ it meant. No down-only enforcement: a repository may declare any
198
+ ceilings it chooses, the same as DOC-012's cap.
199
+ """
200
+ declared = ctx.declarations.get(self.CEILINGS_DECLARATION)
201
+ if declared is None:
202
+ return {}
203
+ ceilings: dict[str, int] = {}
204
+ for entry in declared.split(","):
205
+ match = self.CEILING.fullmatch(entry)
206
+ if match is None or int(match.group(2)) < 1:
207
+ raise CouldNotRun(
208
+ f"declaration {self.CEILINGS_DECLARATION} entry {entry!r} is not "
209
+ "<path>:<count> with a base-10 positive integer; set "
210
+ "[controls.compliance.directory-ratchet].max_children to a "
211
+ "table of repo-relative paths and whole numbers of at least 1"
212
+ )
213
+ ceilings[match.group(1)] = int(match.group(2))
214
+ return ceilings
215
+
108
216
  # ------------------------------------------------------------ the register
109
217
 
110
- def _register(self, ctx: Context) -> Ratchet:
111
- """The repository's own baseline — see `inputs` above."""
112
- if not ctx.inputs["register"].is_file():
113
- shown = ctx.relative(ctx.inputs["register"])
114
- raise CouldNotRun(
115
- f"no directory-ratchet register at {shown}; a ratchet grades a "
116
- "repository against ITS OWN recorded shape, so there is nothing "
117
- "to grade until this repository records one (or points "
118
- "[controls.compliance.inputs].register at where it keeps it). "
119
- "An absent baseline is could-not-run, never a clean pass"
120
- )
218
+ def _register(self, ctx: Context) -> Ratchet | None:
219
+ """The repository's own recorded state — see `inputs`/`widening_inputs`.
220
+
221
+ Absent is None: no file, or the input dropped because the `compliance`
222
+ tree is undeclared or declared absent. Generic principle: absence
223
+ removes the EXEMPTIONS, not the rule — `graded` reads None as empty
224
+ baseline dicts and enforces the configured ceilings bare. A register
225
+ that EXISTS but cannot be used (invalid YAML, schema violation) is
226
+ could-not-run: it may be mid-edit, and grading it as "no baselines"
227
+ would silently drop every exemption it names. `exists()` follows
228
+ symlinks, so a broken symlink at the register path reads as absent —
229
+ no exemptions.
230
+ """
231
+ target = ctx.inputs.get("register")
232
+ if target is None or not target.exists():
233
+ return None
234
+ if not target.is_file():
235
+ shown = ctx.relative(target)
236
+ raise CouldNotRun(f"directory-ratchet register {shown} exists but is not a file")
121
237
  try:
122
- return self.parse_yaml(ctx, ctx.inputs["register"], Ratchet)
238
+ return self.parse_yaml(ctx, target, Ratchet)
123
239
  except SchemaInvalid as exc:
124
240
  raise CouldNotRun(f"ratchet register is unusable: {exc.detail}") from exc
125
241
 
@@ -1,6 +1,4 @@
1
1
  schema_version: 2
2
- max_children:
3
- frontend/packages/desktop/src: 10
4
2
  over_children_baseline: {}
5
3
  single_file_baseline:
6
4
  frontend/packages/desktop/src/renderer/solo: item.ts
@@ -1,6 +1,4 @@
1
1
  schema_version: 2
2
- max_children:
3
- frontend/packages/desktop/src: 20
4
2
  over_children_baseline: {}
5
3
  single_file_baseline:
6
4
  frontend/packages/desktop/src/renderer/solo: item.ts
@@ -0,0 +1,5 @@
1
+ schema_version: 2
2
+ over_children_baseline:
3
+ infra/stacks: 5
4
+ single_file_baseline:
5
+ frontend/packages/desktop/src/renderer/solo: item.ts
@@ -0,0 +1,4 @@
1
+ schema_version: 2
2
+ over_children_baseline:
3
+ frontend/packages/desktop/src: 3
4
+ single_file_baseline: {}
@@ -0,0 +1,5 @@
1
+ schema_version: 2
2
+ over_children_baseline:
3
+ frontend/packages/desktop/src/renderer/gone: 4
4
+ single_file_baseline:
5
+ frontend/packages/desktop/src/renderer/solo: item.ts
@@ -1,6 +1,4 @@
1
1
  schema_version: 2
2
- max_children:
3
- frontend/packages/desktop/src: 10
4
2
  over_children_baseline: {}
5
3
  single_file_baseline:
6
4
  frontend/packages/desktop/src/renderer/solo: item.ts
@@ -0,0 +1,127 @@
1
+ """The LAY-004/DOC-012 directory-ratchet register — ONE file of STATE, TWO gates.
2
+
3
+ Moved out of `directory_ratchet/check.py` on 2026-10-02, when DOC-012 started
4
+ reading the same consumer-owned file; reworked hours later to the estate's
5
+ generic ratchet principle (Tarun, 2026-10-02, superseding this file's earlier
6
+ "ratchets sit ON TOP" reading for LAY-004 — the same supersession DOC-012 v2
7
+ shipped):
8
+
9
+ 1. A ratchet file records STATE only — today's known violations, the
10
+ per-directory exemptions both gates forgive.
11
+ 2. The RULE is CONFIGURATION and lives in adl-config.toml: LAY-004's
12
+ per-tree ceilings in `[controls.compliance.directory-ratchet].
13
+ max_children` (arriving as the `directory-ceilings` declaration),
14
+ DOC-012's page cap in `[controls.compliance.limits].
15
+ docs_pages_per_directory`.
16
+ 3. At zero recorded state the file is DELETED — and the gates still run,
17
+ enforcing the configured rules bare. "No ratchet file" means zero
18
+ exemptions allowed, never a toothless gate; a file that EXISTS
19
+ recording zero state is a load failure, fail-loud.
20
+
21
+ This module holds the register's MODEL, not a check — the layer rule "no
22
+ check imports another" reaches check modules, and `docs/directory_size/
23
+ check.py` imports THIS module, never LAY-004's.
24
+
25
+ The consumer's document (`<compliance>/ratchets/LAY-004-over-limit-directory.yaml`)
26
+ carries whichever sections have state:
27
+
28
+ schema_version: 2
29
+ over_children_baseline: # LAY-004's over-limit exemptions:
30
+ frontend/src: 12 # directory -> its recorded direct-file count
31
+ single_file_baseline: # LAY-004's single-file exemptions:
32
+ frontend/src/solo: item.ts
33
+ docs_pages: # DOC-012's exemptions (baseline only; the cap
34
+ baseline: # is config, never register content)
35
+ docs/operations: 18
36
+
37
+ `max_children` is GONE from the model — it was configuration, and
38
+ configuration moved to adl-config.toml the same day; `extra="forbid"`
39
+ refuses the key, so a stale register fails loud instead of being silently
40
+ read as state. The cross-field validator holds the ruling's third arm: at
41
+ least one of `over_children_baseline` / `single_file_baseline` /
42
+ `docs_pages.baseline` must be non-empty — zero recorded state is no file.
43
+
44
+ `schema_version` stays the locked `Literal[2]`: a future bump must edit this
45
+ literal, which makes it a deliberate, schema-revealing edit rather than a
46
+ silent one. The removal of `max_children` did not earn a bump — no consumer
47
+ ever shipped ceilings in the file (adl-azdo never recorded tree state; the
48
+ one v1 file lasted hours), and a field's departure under a locked literal is
49
+ a load failure for stale files, which is the point.
50
+ """
51
+
52
+ from __future__ import annotations
53
+
54
+ from typing import Literal
55
+
56
+ from pydantic import model_validator
57
+
58
+ from ....core.models import StrictModel
59
+
60
+
61
+ class DocsPages(StrictModel):
62
+ """DOC-012's section: per-directory EXEMPTION baselines, nothing else.
63
+
64
+ `baseline` maps a docs/ directory to the page count it is exempted up to
65
+ — the count it held when recorded. DIR-004 fires over the cap with no
66
+ entry, DIR-005 past the recorded entry, DIR-006 for an entry no longer
67
+ required. The CAP itself is not here: it is the
68
+ `docs-pages-per-directory` declaration (`[controls.compliance.limits].
69
+ docs_pages_per_directory`, engine default 15), because the cap is
70
+ CONFIGURATION and the register is the repository's recorded state.
71
+ """
72
+
73
+ baseline: dict[str, int] = {}
74
+
75
+
76
+ class Ratchet(StrictModel):
77
+ """The register: recorded state, graded by LAY-004 and DOC-012.
78
+
79
+ An all-empty register is a load failure, not a pass — zero recorded
80
+ state is no file (the cross-field validator below holds the ruling's
81
+ third arm; a file that exists recording nothing is the wrong file or an
82
+ emptied one mid-cleanup, and reading it as "no exemptions" would silently
83
+ drop every baseline it used to name).
84
+ """
85
+
86
+ schema_version: Literal[2]
87
+ """Locked, not just typed: a future bump must change this literal, which
88
+ makes it a deliberate, schema-revealing edit rather than a silent one."""
89
+
90
+ over_children_baseline: dict[str, int] = {}
91
+ """LAY-004's over-limit exemptions: directory -> the direct-file count it
92
+ is forgiven up to. Was graded AGAINST the ceilings that lived in this
93
+ file's deleted `max_children`; it is state, and it stays."""
94
+
95
+ single_file_baseline: dict[str, str] = {}
96
+ """LAY-004's single-file exemptions: directory -> the name of its one
97
+ file. Meaningful only while the directory holds exactly one file."""
98
+
99
+ docs_pages: DocsPages | None = None
100
+ """DOC-012's exemption baselines. None means no docs exemptions are
101
+ recorded; the page cap is enforced bare over what the section would have
102
+ forgiven. At zero exemptions the file is deleted."""
103
+
104
+ @model_validator(mode="after")
105
+ def _grades_something(self) -> Ratchet:
106
+ """At least one of over/single/docs_pages.baseline must be non-empty.
107
+
108
+ Zero recorded state is no file — "if we reach zero the ratchet file
109
+ has no meaning and should be deleted. We cleaned up the house!" An
110
+ existing file that records nothing is either the wrong file or an
111
+ emptied register mid-cleanup, and reading it as "no exemptions"
112
+ would silently drop every baseline the gates used to forgive. The
113
+ v1 `max_children: Field(min_length=1)` intent — "a gate grading
114
+ nothing is a load failure, not a pass" — survives every rework of
115
+ WHAT the file records.
116
+ """
117
+ if (
118
+ not self.over_children_baseline
119
+ and not self.single_file_baseline
120
+ and (self.docs_pages is None or not self.docs_pages.baseline)
121
+ ):
122
+ raise ValueError(
123
+ "a register grading nothing: record over_children_baseline, "
124
+ "single_file_baseline or docs_pages.baseline entries, or "
125
+ "delete the file (zero recorded state is no ratchet)"
126
+ )
127
+ return self