@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.12 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adl +2 -2
- package/bin/git +16 -17
- package/bin/git-ado +25 -24
- package/bin/git-defaults +173 -0
- package/bin/health-check +8 -1
- package/bin/kimi-hooks +1 -1
- package/bin/lib/adl-package.sh +257 -0
- package/bin/lib/fleet-host.sh +8 -5
- package/bin/reconcile +482 -232
- package/bin/reconcile-host +30 -20
- package/bin/setup +20 -17
- package/bin/shell-path-policy +15 -5
- package/bin/sync-and-reconcile +62 -64
- package/bin/validate-manifest +33 -9
- package/package.json +2 -10
- package/packages/agent-hooks/README.md +14 -9
- package/packages/agent-hooks/assets/hooks.json +0 -20
- package/packages/agent-hooks/src/cli/args.ts +1 -1
- package/packages/agent-hooks/src/cli/doctor.ts +6 -58
- package/packages/agent-hooks/src/deploy/deploy.ts +12 -41
- package/packages/agent-hooks/src/deploy/doctor.ts +8 -11
- package/packages/agent-hooks/src/deploy/index.ts +14 -14
- package/packages/agent-hooks/src/deploy/json-merge.ts +7 -8
- package/packages/agent-hooks/src/deploy/legacy-lock.ts +2 -2
- package/packages/agent-hooks/src/deploy/list.ts +1 -1
- package/packages/agent-hooks/src/deploy/lock.ts +31 -12
- package/packages/agent-hooks/src/deploy/profile.ts +3 -4
- package/packages/agent-hooks/src/deploy/source.ts +1 -1
- package/packages/agent-hooks/src/gating/config.ts +12 -24
- package/packages/agent-hooks/src/gating/root.ts +3 -3
- package/packages/agent-hooks/src/hooks/briefing/handler.ts +2 -2
- package/packages/agent-hooks/src/hooks/briefing/index.ts +27 -287
- package/packages/agent-hooks/src/hooks/contract.ts +17 -17
- package/packages/agent-hooks/src/hooks/crg/background.ts +27 -0
- package/packages/agent-hooks/src/hooks/crg/index.ts +7 -6
- package/packages/agent-hooks/src/hooks/log.ts +8 -10
- package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +1 -1
- package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +1 -1
- package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +6 -5
- package/packages/agent-hooks/src/hosts/registry.ts +1 -1
- package/packages/agent-hooks/src/log/adl-dir.ts +44 -0
- package/packages/agent-hooks/src/log/writer.ts +16 -2
- package/packages/agent-hooks/src/main.ts +7 -41
- package/packages/agent-hooks/src/pre-tool-use/handler.ts +71 -82
- package/packages/agent-hooks/src/rules/engine.ts +13 -17
- package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +3 -3
- package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +12 -14
- package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +28 -28
- package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +8 -9
- package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +56 -59
- package/packages/agent-hooks/src/rules/impl/adl-identity.ts +16 -23
- package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +19 -16
- package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +2 -2
- package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +9 -12
- package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +5 -7
- package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +411 -0
- package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +4 -5
- package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +6 -7
- package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +77 -70
- package/packages/agent-hooks/src/rules/impl/deny-allowlist.ts +131 -0
- package/packages/agent-hooks/src/rules/impl/git-helpers.ts +21 -23
- package/packages/agent-hooks/src/rules/impl/git-worktree.ts +14 -28
- package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -3
- package/packages/agent-hooks/src/rules/impl/messages.ts +1 -1
- package/packages/agent-hooks/src/rules/impl/pr-completion.ts +1 -1
- package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +35 -46
- package/packages/agent-hooks/src/rules/impl/tool-find.ts +34 -7
- package/packages/agent-hooks/src/rules/impl/tool-grep.ts +33 -12
- package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +52 -9
- package/packages/agent-hooks/src/rules/ports.ts +5 -7
- package/packages/agent-hooks/src/rules/registry.ts +4 -6
- package/packages/agent-hooks/src/rules/shell/git-identity.ts +86 -101
- package/packages/agent-hooks/src/rules/shell/git-internals.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/invocation.ts +24 -118
- package/packages/agent-hooks/src/rules/shell/piped-script.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/prefixes.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +11 -10
- package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +26 -26
- package/packages/agent-hooks/src/rules/shell/substitution.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/xargs.ts +2 -2
- package/packages/agent-hooks/src/rules/spec.ts +2 -2
- package/packages/agent-settings/README.md +287 -0
- package/packages/agent-settings/assets/GLOBAL-AGENTS.md +14 -16
- package/packages/agent-settings/assets/agents/architect.toml +2 -0
- package/packages/agent-settings/assets/agents/code-reviewer.toml +2 -0
- package/packages/agent-settings/assets/agents/executor.toml +2 -0
- package/packages/agent-settings/assets/agents/explore.toml +2 -0
- package/packages/agent-settings/assets/agents/planner.toml +2 -0
- package/packages/agent-settings/assets/mcp.json +0 -4
- package/packages/agent-settings/deploy-profile.json +139 -0
- package/packages/agent-settings/deploy-profile.schema.json +147 -0
- package/packages/agent-settings/managed/README.md +29 -30
- package/packages/agent-settings/managed/codex-requirements.toml +9 -9
- package/packages/agent-settings/package.json +20 -0
- package/packages/agent-settings/src/deploy/agent-render.ts +2 -2
- package/packages/agent-settings/src/deploy/agent-toml.ts +1 -1
- package/packages/agent-settings/src/deploy/agents-deploy.ts +17 -3
- package/packages/agent-settings/src/deploy/doctor.ts +3 -83
- package/packages/agent-settings/src/deploy/index.ts +6 -33
- package/packages/agent-settings/src/deploy/legacy-lock.ts +6 -6
- package/packages/agent-settings/src/deploy/list.ts +5 -19
- package/packages/agent-settings/src/deploy/lock.ts +8 -18
- package/packages/agent-settings/src/deploy/mcp-deploy.ts +10 -5
- package/packages/agent-settings/src/deploy/mcp-merge.ts +22 -3
- package/packages/agent-settings/src/deploy/mcp-source.ts +1 -1
- package/packages/agent-settings/src/deploy/profile.ts +11 -35
- package/packages/agent-settings/src/deploy/retire-lean-ctx.ts +184 -0
- package/packages/agent-settings/src/deploy/settings.ts +17 -22
- package/packages/agent-settings/src/global-surface-sweep.ts +0 -2
- package/packages/agent-settings/src/kimi-hooks.ts +339 -192
- package/packages/agent-settings/src/opencode-hooks.ts +1 -1
- package/packages/agent-settings/tsconfig.json +23 -0
- package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +120 -0
- package/packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh +276 -0
- package/packages/agent-skills/assets/debug-issue/SKILL.md +8 -7
- package/packages/agent-skills/assets/explore-codebase/SKILL.md +13 -13
- package/packages/agent-skills/assets/refactor-safely/SKILL.md +12 -11
- package/packages/agent-skills/assets/review-changes/SKILL.md +7 -7
- package/packages/agent-skills/assets/testing/references/e2e.md +37 -0
- package/packages/agent-skills/assets/testing/references/integration.md +37 -0
- package/packages/agent-skills/assets/testing/references/unit.md +32 -0
- package/packages/agent-skills/dist/deploy.d.ts +2 -0
- package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
- package/packages/agent-skills/dist/deploy.js +27 -1
- package/packages/agent-skills/dist/deploy.js.map +1 -1
- package/packages/agent-skills/dist/doctor.d.ts +0 -2
- package/packages/agent-skills/dist/doctor.d.ts.map +1 -1
- package/packages/agent-skills/dist/doctor.js +1 -1
- package/packages/agent-skills/dist/doctor.js.map +1 -1
- package/packages/agent-skills/dist/fs-utils.d.ts +0 -1
- package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -1
- package/packages/agent-skills/dist/fs-utils.js +1 -1
- package/packages/agent-skills/dist/fs-utils.js.map +1 -1
- package/packages/agent-skills/src/deploy.ts +29 -1
- package/packages/agent-skills/src/doctor.ts +1 -1
- package/packages/agent-skills/src/fs-utils.ts +1 -1
- package/packages/azdo/README.md +10 -9
- package/packages/azdo/package.json +1 -3
- package/packages/azdo/scripts/probe-ado-rules.ts +311 -0
- package/packages/azdo/src/azdo-pl.ts +2 -54
- package/packages/azdo/src/azdo-pr-review.ts +4 -4
- package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
- package/packages/azdo/src/azdo-wit.ts +44 -2
- package/packages/azdo/src/lib/agent-identity.ts +12 -14
- package/packages/azdo/src/lib/agent-token.ts +2 -2
- package/packages/azdo/src/lib/client.ts +0 -5
- package/packages/azdo/src/lib/graph-identity.ts +4 -4
- package/packages/azdo/src/workflow-ladder.csv +241 -0
- package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
- package/packages/azdo/src/workflow-rules.ts +194 -0
- package/packages/fleet/manifest.json +35 -11
- package/packages/fleet/manifest.schema.json +62 -10
- package/packages/fleet/src/default-agent-file.ts +3 -3
- package/packages/fleet/src/install-adl-package.ts +73 -15
- package/packages/fleet/src/install-embedding-model.ts +13 -13
- package/packages/fleet/src/managed-settings.ts +7 -7
- package/packages/fleet/src/repo-maintain.ts +91 -55
- package/packages/fleet/src/scratch-reap.ts +5 -5
- package/packages/fleet/src/vscode-settings.ts +5 -5
- package/packages/repo-controls/README.md +141 -43
- package/packages/repo-controls/assets/promote.ts +4 -4
- package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
- package/packages/repo-controls/assets/version-bump.sh +31 -84
- package/packages/repo-controls/bunfig.toml +6 -7
- package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
- package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
- 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
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
- 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
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
- 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
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
- 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
- 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
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
- 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
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +258 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +9 -4
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +3 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
- package/packages/repo-controls/package.json +2 -9
- package/packages/repo-controls/scripts/hooks/post-merge +13 -0
- package/packages/repo-controls/scripts/hooks/pre-push +3 -3
- package/packages/repo-controls/src/azdo-push.ts +64 -36
- package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
- package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
- package/packages/repo-controls/src/cli.ts +29 -8
- package/packages/repo-controls/src/compliance-config.ts +410 -2
- package/packages/repo-controls/src/config.ts +133 -60
- package/packages/repo-controls/src/constants.ts +13 -27
- package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
- package/packages/repo-controls/src/doctor.ts +46 -19
- package/packages/repo-controls/src/gitignore-block.ts +5 -29
- package/packages/repo-controls/src/hook-log.ts +1 -2
- package/packages/repo-controls/src/hook.ts +201 -45
- package/packages/repo-controls/src/install.ts +14 -8
- package/packages/repo-controls/src/integrity.ts +3 -3
- package/packages/repo-controls/src/lfs.ts +111 -0
- package/packages/repo-controls/src/promote.ts +8 -8
- package/packages/repo-controls/src/runtime.ts +9 -1
- package/packages/repo-controls/src/workflows-drift.ts +4 -5
- package/packages/repo-controls/src/worktree-guard.ts +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""LAY-004 — every
|
|
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
|
-
|
|
24
|
-
(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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,
|
|
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
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
b
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const item = 1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
b
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
c
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const item = 1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const item = 1;
|
|
@@ -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
|