@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
@@ -0,0 +1,17 @@
1
+ ---
2
+ last_update: 2026-09-28T15:10:00Z
3
+ title: Agent notes ledger
4
+ description: Fixture task ledger, one append-only line per task start and finish.
5
+ type: Operations
6
+ status: stable
7
+ sources: packages/agent-settings/assets/GLOBAL-AGENTS.md
8
+ ---
9
+
10
+ # Agent notes ledger
11
+
12
+ An append-only log; one line when an agent starts a task and one when it finishes.
13
+
14
+ ## Lines
15
+
16
+ 2026-09-28 05:31 claude start: fixture task
17
+ 2026-09-28 05:40 claude finish: fixture task
@@ -0,0 +1,13 @@
1
+ ---
2
+ last_update: 2026-09-28T15:10:00Z
3
+ title: Agent notes ledger
4
+ description: Fixture task ledger, one append-only line per task start and finish.
5
+ type: Operations
6
+ status: stable
7
+ sources: packages/agent-settings/assets/GLOBAL-AGENTS.md
8
+ ---
9
+
10
+ # Agent notes ledger
11
+
12
+ An append-only log; one line when an agent starts a task and one when it finishes.
13
+
@@ -6,7 +6,6 @@ status: draft
6
6
  generated:
7
7
  by: process:test
8
8
  at: '2026-08-22T00:00:00Z'
9
- document_type: architecture
10
9
  sources:
11
10
  - resource: repository:fixture
12
11
  related:
@@ -3,6 +3,5 @@ common_required: [type, title, description, status, generated]
3
3
  profiles:
4
4
  - type: Architecture
5
5
  paths: [docs/architecture/**]
6
- document_type: architecture
7
6
  required: [sources, related]
8
7
  headings: [[Purpose], [Target]]
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: "No type at all"
3
+ description: "Declares no type: unconstrained does not mean optional."
4
+ status: draft
5
+ last_update: '2026-10-01T06:13:54Z'
6
+ sources: plans/features/example/spec.md
7
+ ---
8
+
9
+ # No type at all
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Experiment
3
+ title: "Typed experiment"
4
+ description: "Declares type Experiment."
5
+ status: draft
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources: plans/features/example/spec.md
8
+ ---
9
+
10
+ # Typed experiment
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Research
3
+ title: "Typed research"
4
+ description: "Declares type Research."
5
+ status: draft
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources: plans/features/example/spec.md
8
+ ---
9
+
10
+ # Typed research
@@ -0,0 +1,5 @@
1
+ version: "1"
2
+ common_required: [type, title, description, status]
3
+ profiles:
4
+ - paths: [docs/research/**]
5
+ required: [last_update, sources]
@@ -6,7 +6,6 @@ status: canonical
6
6
  generated:
7
7
  by: process:test
8
8
  at: '2026-08-22T00:00:00Z'
9
- document_type: architecture
10
9
  sources:
11
10
  - resource: repository:fixture
12
11
  related:
@@ -3,6 +3,5 @@ common_required: [type, title, description, status, generated]
3
3
  profiles:
4
4
  - type: Architecture
5
5
  paths: [docs/architecture/**]
6
- document_type: architecture
7
6
  required: [sources, related]
8
7
  headings: [[Purpose], [Target]]
@@ -0,0 +1,15 @@
1
+ ---
2
+ type: Experiment
3
+ title: "Fixture experiment plan"
4
+ description: "A research page whose type differs from the other fixture; the Research profile must not constrain type."
5
+ status: draft
6
+ created: 2026-09-30
7
+ last_update: '2026-09-30T00:00:00Z'
8
+ sources:
9
+ - apps/example/src/stream.ts
10
+ - dev/config/profiles/local.yaml
11
+ ---
12
+
13
+ # Fixture experiment plan
14
+
15
+ Hypotheses, phases and a go/no-go gate would go here.
@@ -0,0 +1,15 @@
1
+ ---
2
+ type: Research
3
+ title: "Fixture with an ad-hoc key"
4
+ description: "A research page that carries every required field plus one key the register admits nowhere."
5
+ status: draft
6
+ created: 2026-10-01
7
+ last_update: '2026-10-01T06:13:54Z'
8
+ sources:
9
+ - plans/features/example/spec.md
10
+ review_frequency: weekly
11
+ ---
12
+
13
+ # Fixture with an ad-hoc key
14
+
15
+ Nothing here is decided.
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: Research
3
+ title: "Fixture with two ad-hoc keys"
4
+ description: "A research page that carries every required field plus two keys the register admits nowhere."
5
+ status: draft
6
+ created: 2026-10-01
7
+ last_update: '2026-10-01T06:13:54Z'
8
+ sources:
9
+ - plans/features/example/spec.md
10
+ owner: someone
11
+ review_frequency: weekly
12
+ ---
13
+
14
+ # Fixture with two ad-hoc keys
15
+
16
+ Nothing here is decided.
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Research
3
+ title: "Missing created"
4
+ description: "Research page with no created date."
5
+ status: draft
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources:
8
+ - plans/features/example/spec.md
9
+ ---
10
+
11
+ # Missing created
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Research
3
+ title: "Missing description"
4
+ status: draft
5
+ created: 2026-10-01
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources:
8
+ - plans/features/example/spec.md
9
+ ---
10
+
11
+ # Missing description
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Research
3
+ title: "Missing last_update"
4
+ description: "Research page with no last_update."
5
+ status: draft
6
+ created: 2026-10-01
7
+ sources:
8
+ - plans/features/example/spec.md
9
+ ---
10
+
11
+ # Missing last_update
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Research
3
+ title: "Missing sources"
4
+ description: "Research page with no sources."
5
+ status: draft
6
+ created: 2026-10-01
7
+ last_update: '2026-10-01T06:13:54Z'
8
+ ---
9
+
10
+ # Missing sources
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Research
3
+ title: "Missing status"
4
+ description: "Research page with no status."
5
+ created: 2026-10-01
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources:
8
+ - plans/features/example/spec.md
9
+ ---
10
+
11
+ # Missing status
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Research
3
+ description: "Research page with no title."
4
+ status: draft
5
+ created: 2026-10-01
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources:
8
+ - plans/features/example/spec.md
9
+ ---
10
+
11
+ # Missing title
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: Research
3
+ title: "Fixture with optional keys"
4
+ description: "A research page whose extra keys are all in the register's common_optional list."
5
+ status: draft
6
+ created: 2026-10-01
7
+ last_update: '2026-10-01T06:13:54Z'
8
+ sources:
9
+ - plans/features/example/spec.md
10
+ stale_after: '2027-01-01'
11
+ verified: true
12
+ ---
13
+
14
+ # Fixture with optional keys
15
+
16
+ Nothing here is decided.
@@ -0,0 +1,14 @@
1
+ ---
2
+ type: Research
3
+ title: "Fixture research input"
4
+ description: "A research page that carries every field the Research profile requires."
5
+ status: draft
6
+ created: 2026-10-01
7
+ last_update: '2026-10-01T06:13:54Z'
8
+ sources:
9
+ - plans/features/example/spec.md
10
+ ---
11
+
12
+ # Fixture research input
13
+
14
+ Nothing here is decided.
@@ -0,0 +1,21 @@
1
+ ---
2
+ type: Architecture
3
+ title: "Architecture page with a research-only key"
4
+ description: "An architecture page carrying created: the Research profile requires that key, but this profile does not admit it."
5
+ status: draft
6
+ created: 2026-10-01
7
+ sources: packages/example/**
8
+ related: docs/architecture/created-date.md
9
+ ---
10
+
11
+ # Architecture page with a research-only key
12
+
13
+ ## Purpose
14
+
15
+ ## Target
16
+
17
+ ## Invariant
18
+
19
+ ## Verification
20
+
21
+ Nothing here is decided.
@@ -0,0 +1,19 @@
1
+ ---
2
+ type: Experiment
3
+ title: "Research-shaped architecture page"
4
+ description: "Research frontmatter under docs/architecture: the Research profile must not capture it."
5
+ status: draft
6
+ last_update: '2026-10-01T06:13:54Z'
7
+ sources: packages/example/**
8
+ related: docs/architecture/research-shaped.md
9
+ ---
10
+
11
+ # Research-shaped architecture page
12
+
13
+ ## Purpose
14
+
15
+ ## Component
16
+
17
+ ## Constraint
18
+
19
+ ## Verification
@@ -0,0 +1,26 @@
1
+ ---
2
+ type: Operations
3
+ title: "Fixture runbook"
4
+ description: "An operations page with no last_update: that field is the Research profile's, not Operations'."
5
+ status: stable
6
+ sources: packages/example/**
7
+ related: docs/operations/runbook.md
8
+ ---
9
+
10
+ # Fixture runbook
11
+
12
+ ## Purpose
13
+
14
+ What this runbook is for.
15
+
16
+ ## Procedure
17
+
18
+ The steps.
19
+
20
+ ## Access
21
+
22
+ Who may run it.
23
+
24
+ ## Verification
25
+
26
+ How to check it worked.
@@ -4,23 +4,36 @@ Two fixtures, matching the shell version's exact scenarios: a compliant
4
4
  Architecture page, and one with an invalid `status` value. Each corpus carries
5
5
  its own cut-down profile register, passed as the `profiles` input override —
6
6
  the packaged production register is not what these two scenarios are about.
7
+
8
+ The tests below them grade the PACKAGED register: the task-ledger profile, and
9
+ the Research profile for `docs/research/**` together with the engine rule it
10
+ needs (a profile may declare no `type`, leaving the value unconstrained).
11
+
12
+ The last section grades the closed key set (2026-10-02): a document may carry
13
+ only the keys its profile admits — `common_required`, `common_optional`, and
14
+ the profile's own `required` — and every other frontmatter key is reported by
15
+ name.
7
16
  """
8
17
 
9
18
  from __future__ import annotations
10
19
 
11
20
  import pathlib
12
21
 
22
+ import pytest
23
+ import yaml
24
+
13
25
  from adl_compliance import runner
14
26
  from adl_compliance.core.verdict import Outcome
15
27
  from adl_compliance.policy.registry import load
16
28
 
17
29
  FIXTURES = pathlib.Path(__file__).parent / "fixtures"
30
+ PACKAGED_REGISTER = pathlib.Path(__file__).parent / "docs-okf-profiles.yaml"
18
31
  ROW = load().by_id("DOC-006")
19
32
 
20
33
 
21
- def run(case: str) -> object:
34
+ def run(case: str, only: tuple[str, ...] | None = None) -> object:
22
35
  directory = FIXTURES / case
23
- given = tuple(
36
+ given = only if only is not None else tuple(
24
37
  str(p.relative_to(directory))
25
38
  for p in directory.rglob("*.md")
26
39
  )
@@ -47,3 +60,216 @@ def test_no_set_is_could_not_run() -> None:
47
60
  inputs={ROW.id: {"profiles": FIXTURES / "okf-profile-violation" / "docs-okf-profiles.yaml"}},
48
61
  )
49
62
  assert verdict.outcome is Outcome.COULD_NOT_RUN
63
+
64
+
65
+ def run_packaged(case: str, only: tuple[str, ...] | None = None) -> object:
66
+ """Grade a fixture against the PACKAGED register (no `profiles` override),
67
+ because the subject here is the register this package ships."""
68
+ directory = FIXTURES / case
69
+ given = only if only is not None else tuple(
70
+ str(p.relative_to(directory)) for p in directory.rglob("*.md")
71
+ )
72
+ return runner.run(ROW, directory, given)
73
+
74
+
75
+ def test_the_task_ledger_matches_a_packaged_profile() -> None:
76
+ """`docs/notes.md` is the repository's task ledger (the global agent rule:
77
+ one line at the start and one at the finish of every task). It carries
78
+ OKF frontmatter and a `## Lines` section and nothing else a profile could
79
+ demand, so the packaged register must select a profile for it."""
80
+ verdict = run_packaged("okf-ledger-clean")
81
+ assert verdict.outcome is Outcome.CLEAN, verdict.render()
82
+
83
+
84
+ def test_the_task_ledger_profile_requires_the_lines_section() -> None:
85
+ """Without this, the clean case above also passes against a profile that
86
+ asserts nothing about the ledger."""
87
+ verdict = run_packaged("okf-ledger-no-lines")
88
+ assert verdict.outcome is Outcome.FINDINGS
89
+ assert any("missing one of headings: Lines" in f.message for f in verdict.findings), (
90
+ verdict.render()
91
+ )
92
+
93
+
94
+ def messages(verdict: object, relative: str) -> list[str]:
95
+ """Every message reported against one file, sorted, so a test can assert the
96
+ EXACT set rather than that some finding somewhere mentioned a field."""
97
+ return sorted(f.message for f in verdict.findings if f.path == relative)
98
+
99
+
100
+ # ---- a profile may leave `type` unconstrained (engine) ----------------------
101
+ #
102
+ # The two pages that moved to docs/research/ differ in `type` (Research and
103
+ # Experiment), so the Research profile cannot name one. `type` is optional per
104
+ # profile: a profile that declares none asserts nothing about the VALUE, while
105
+ # `common_required` still demands the field.
106
+
107
+ UNTYPED = "okf-profile-untyped"
108
+
109
+
110
+ @pytest.mark.parametrize("page", ["typed-research.md", "typed-experiment.md"])
111
+ def test_a_profile_that_declares_no_type_accepts_any_type_value(page: str) -> None:
112
+ verdict = run(UNTYPED, only=(f"docs/research/{page}",))
113
+ assert verdict.outcome is Outcome.CLEAN, verdict.render()
114
+
115
+
116
+ def test_a_profile_that_declares_no_type_still_requires_the_field_to_be_present() -> None:
117
+ """Unconstrained is not optional: `type` is in `common_required`."""
118
+ relative = "docs/research/no-type.md"
119
+ verdict = run(UNTYPED, only=(relative,))
120
+ assert verdict.outcome is Outcome.FINDINGS
121
+ assert messages(verdict, relative) == ["missing required OKF field type"], verdict.render()
122
+
123
+
124
+ def test_a_profile_that_declares_a_type_still_constrains_it() -> None:
125
+ """Guard for the change above: making `type` optional per profile must not
126
+ drop the assertion for the profiles that DO declare one. The page is
127
+ research-shaped (type Experiment) but sits under docs/architecture/, so the
128
+ Architecture profile grades it and rejects the type -- which also shows the
129
+ Research profile does not reach outside docs/research/."""
130
+ relative = "docs/architecture/research-shaped.md"
131
+ verdict = run_packaged("okf-research-neighbours", only=(relative,))
132
+ assert verdict.outcome is Outcome.FINDINGS
133
+ assert messages(verdict, relative) == [
134
+ "type must be 'Architecture' (got 'Experiment')",
135
+ ], verdict.render()
136
+
137
+
138
+ # ---- the packaged Research profile ------------------------------------------
139
+
140
+ RESEARCH = "okf-research"
141
+
142
+
143
+ def research(page: str) -> str:
144
+ return f"docs/research/{page}"
145
+
146
+
147
+ @pytest.mark.parametrize(
148
+ ("page", "declared_type"),
149
+ [("research-ok.md", "Research"), ("experiment-ok.md", "Experiment")],
150
+ )
151
+ def test_a_research_page_with_every_required_field_passes_whatever_its_type(
152
+ page: str, declared_type: str
153
+ ) -> None:
154
+ """Both real pages moved to docs/research/ declare a different `type`; each
155
+ carries title, description, status, created, last_update and sources, and neither
156
+ carries `related` (the profile does not require it)."""
157
+ source = (FIXTURES / RESEARCH / research(page)).read_text()
158
+ assert f"\ntype: {declared_type}\n" in source, "the fixture must declare the type it is named for"
159
+ assert "related" not in source
160
+ verdict = run_packaged(RESEARCH, only=(research(page),))
161
+ assert verdict.outcome is Outcome.CLEAN, verdict.render()
162
+
163
+
164
+ @pytest.mark.parametrize(
165
+ ("page", "expected"),
166
+ [
167
+ ("missing-title.md", ["missing required OKF field title"]),
168
+ ("missing-description.md", ["missing required OKF field description"]),
169
+ (
170
+ "missing-status.md",
171
+ ["invalid OKF status None", "missing required OKF field status"],
172
+ ),
173
+ ("missing-last-update.md", ["missing profile field last_update"]),
174
+ ("missing-sources.md", ["missing profile field sources"]),
175
+ ("missing-created.md", ["missing profile field created"]),
176
+ ],
177
+ )
178
+ def test_each_missing_research_field_is_reported_by_name(page: str, expected: list[str]) -> None:
179
+ verdict = run_packaged(RESEARCH, only=(research(page),))
180
+ assert verdict.outcome is Outcome.FINDINGS, verdict.render()
181
+ assert messages(verdict, research(page)) == sorted(expected), verdict.render()
182
+
183
+
184
+ def test_a_page_outside_docs_research_is_graded_by_its_own_profile() -> None:
185
+ """The runbook has no `last_update`. That field is the Research profile's;
186
+ the Operations profile must not have gained it."""
187
+ verdict = run_packaged("okf-research-neighbours", only=("docs/operations/runbook.md",))
188
+ assert verdict.outcome is Outcome.CLEAN, verdict.render()
189
+
190
+
191
+ def test_without_the_research_profile_a_research_page_matches_no_profile(
192
+ tmp_path: pathlib.Path,
193
+ ) -> None:
194
+ """Negative control. The finding this profile exists to remove is
195
+ "no OKF profile matches this path". Take the PACKAGED register, drop only
196
+ its Research profile, and the same page reproduces that finding; with the
197
+ profile in place the finding is gone. The only difference between the two
198
+ runs is the profile."""
199
+ register = yaml.safe_load(PACKAGED_REGISTER.read_text())
200
+ kept = [p for p in register["profiles"] if "docs/research/**" not in p["paths"]]
201
+ assert len(kept) == len(register["profiles"]) - 1, (
202
+ "the packaged register must carry exactly one profile covering docs/research/**"
203
+ )
204
+ register["profiles"] = kept
205
+ without = tmp_path / "docs-okf-profiles.yaml"
206
+ without.write_text(yaml.safe_dump(register))
207
+
208
+ page = research("research-ok.md")
209
+ before = runner.run(
210
+ ROW, FIXTURES / RESEARCH, (page,), inputs={ROW.id: {"profiles": without}},
211
+ )
212
+ assert before.outcome is Outcome.FINDINGS
213
+ assert messages(before, page) == ["no OKF profile matches this path"], before.render()
214
+
215
+ after = run_packaged(RESEARCH, only=(page,))
216
+ assert after.outcome is Outcome.CLEAN, after.render()
217
+
218
+
219
+ # ---- the frontmatter key set is closed (2026-10-02) --------------------------
220
+ #
221
+ # required-only grading has a hole the register itself kept documenting: keys
222
+ # nobody admitted accumulated in real documents because nothing rejected them.
223
+ # The set a document may draw from is exactly its profile's admission list —
224
+ # common_required, common_optional, and the profile's own required — and any
225
+ # other key is reported by name. That is the same extra="forbid" contract
226
+ # core/models.py grades this package's own policy documents with, applied at
227
+ # the frontmatter layer; the root agent rule's "admit the new key by editing
228
+ # docs-okf-profiles.yaml, never ad-hoc in a document" is this rule's workflow.
229
+
230
+ NEIGHBOURS = "okf-research-neighbours"
231
+
232
+
233
+ def test_a_frontmatter_key_outside_the_vocabulary_is_reported_by_name() -> None:
234
+ """`review_frequency` is audit metadata the Compliance Assessment profile
235
+ wants and nothing else admits; parked on a research page it is reported,
236
+ not graded around."""
237
+ relative = research("extra-key.md")
238
+ verdict = run_packaged(RESEARCH, only=(relative,))
239
+ assert verdict.outcome is Outcome.FINDINGS, verdict.render()
240
+ assert messages(verdict, relative) == [
241
+ "unknown OKF frontmatter key 'review_frequency'"
242
+ ], verdict.render()
243
+
244
+
245
+ def test_every_unknown_frontmatter_key_is_reported() -> None:
246
+ relative = research("extra-keys.md")
247
+ verdict = run_packaged(RESEARCH, only=(relative,))
248
+ assert verdict.outcome is Outcome.FINDINGS, verdict.render()
249
+ assert messages(verdict, relative) == [
250
+ "unknown OKF frontmatter key 'owner'",
251
+ "unknown OKF frontmatter key 'review_frequency'",
252
+ ], verdict.render()
253
+
254
+
255
+ def test_common_optional_frontmatter_keys_are_accepted() -> None:
256
+ """`stale_after` and `verified` are in the register's common_optional:
257
+ allowed on any document, required of none. An admitted-optional key must
258
+ not be reported — the set is closed, not shrunk to required-only."""
259
+ relative = research("optional-keys.md")
260
+ verdict = run_packaged(RESEARCH, only=(relative,))
261
+ assert verdict.outcome is Outcome.CLEAN, verdict.render()
262
+
263
+
264
+ def test_a_key_only_another_profile_requires_is_unknown_here() -> None:
265
+ """The set is closed PER PROFILE, not per register: `created` is in the
266
+ vocabulary — the Research profile requires it — but the Architecture
267
+ profile does not admit it, so an architecture page carrying it is
268
+ reported. Otherwise every profile's required list would leak into every
269
+ other profile by construction."""
270
+ relative = "docs/architecture/created-date.md"
271
+ verdict = run_packaged(NEIGHBOURS, only=(relative,))
272
+ assert verdict.outcome is Outcome.FINDINGS, verdict.render()
273
+ assert messages(verdict, relative) == [
274
+ "unknown OKF frontmatter key 'created'"
275
+ ], verdict.render()
@@ -12,6 +12,11 @@ over the same YAML would disagree with this one the moment either check grew a
12
12
  field, exactly as `checks/coverage/register.py`'s docstring records for
13
13
  `COV-002`/`COV-003`.
14
14
 
15
+ Retired 2026-10-01: `checks/coverage/register.py` and the whole `coverage`
16
+ domain (COV-001..005) were deleted. Every mention of them in this docstring is
17
+ kept as the record of why this register is shared, not as a pointer to code that
18
+ still exists.
19
+
15
20
  This is the one genuinely CROSS-domain register in the estate — every other
16
21
  shared document (the coverage register, the Rust policy JSON) is read by two
17
22
  checks that already share a domain. `core/` holds no precedent for a register
@@ -19,6 +19,8 @@ single gate's test module (no other ported check re-asserts it either).
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
+ import pathlib
23
+
22
24
  import pytest
23
25
  from helpers import corpus, corpus_files
24
26
 
@@ -220,8 +222,15 @@ def test_no_set_is_could_not_run() -> None:
220
222
  def test_an_absent_docs_root_is_a_finding_not_a_pass() -> None:
221
223
  """An absent directory yields an empty set, and an empty set is a clean
222
224
  pass everywhere else in this estate. Without this structural probe the
223
- tree losing docs/ entirely would pass in silence."""
224
- verdict = runner.run(ROW, corpus("coverage", "baseline") / "passing", given=())
225
+ tree losing docs/ entirely would pass in silence.
226
+
227
+ The root is `repository/lockfile-integrity`'s `clean` corpus, which holds no
228
+ `docs/` at all (a backend/frontend lockfile pair). It was the retired
229
+ `coverage/baseline` `passing` corpus until the `coverage` domain was deleted
230
+ 2026-10-01."""
231
+ verdict = runner.run(
232
+ ROW, corpus("repository", "lockfile-integrity") / "clean", given=()
233
+ )
225
234
  assert verdict.outcome is Outcome.FINDINGS, verdict.render()
226
235
  assert "docs content root is missing" in verdict.render()
227
236
 
@@ -1,8 +1,10 @@
1
1
  """The `layout.directory-ratchet` gate.
2
2
 
3
- A folder rather than a module because this gate GRADES A DOCUMENT, and the
4
- document belongs beside the check that reads it. `check.py` is the rule;
5
- anything else in here is what it grades.
3
+ One gate is one folder: `check.py` is the rule; the test and the fixture
4
+ corpora live beside it. The document the gate GRADES does NOT belong beside
5
+ the check — it is the CONSUMER's own register, named by the check's `inputs`
6
+ (`<compliance>/ratchets/LAY-004-over-limit-directory.yaml`, the K-42 history
7
+ on `inputs` in check.py). Only the fixtures' registers sit in here.
6
8
  """
7
9
 
8
10
  from __future__ import annotations