@amsterdamdatalabs/adl-agent-control-darwin-arm64 0.1.4
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 +4 -0
- package/bin/cursor-settings +14 -0
- package/bin/default-agent-file +14 -0
- package/bin/git +670 -0
- package/bin/git-ado +425 -0
- package/bin/global-agents +14 -0
- package/bin/global-surface-sweep +14 -0
- package/bin/health-check +38 -0
- package/bin/kimi-hooks +14 -0
- package/bin/lean-ctx-observe-strip +361 -0
- package/bin/lib/bun-compile-build.sh +34 -0
- package/bin/lib/lean-ctx-observe-hooks.sh +634 -0
- package/bin/managed-settings +14 -0
- package/bin/opencode-hooks +14 -0
- package/bin/reconcile +2648 -0
- package/bin/scratch-reap +14 -0
- package/bin/shell-path-policy +64 -0
- package/bin/surface-policy +14 -0
- package/bin/sync-and-reconcile +215 -0
- package/bin/update-azure-agent-pool +29 -0
- package/bin/validate-manifest +171 -0
- package/bin/vscode-settings +14 -0
- package/package.json +44 -0
- package/packages/agent-hooks/README.md +411 -0
- package/packages/agent-hooks/assets/hooks.json +97 -0
- package/packages/agent-hooks/assets/opencode-plugin.template.ts +224 -0
- package/packages/agent-hooks/bunfig.toml +27 -0
- package/packages/agent-hooks/deploy-profile.json +53 -0
- package/packages/agent-hooks/deploy-profile.schema.json +120 -0
- package/packages/agent-hooks/package.json +23 -0
- package/packages/agent-hooks/src/cli/args.ts +99 -0
- package/packages/agent-hooks/src/cli/doctor.ts +241 -0
- package/packages/agent-hooks/src/cli/rules.ts +133 -0
- package/packages/agent-hooks/src/deploy/deploy.ts +181 -0
- package/packages/agent-hooks/src/deploy/doctor.ts +158 -0
- package/packages/agent-hooks/src/deploy/index.ts +17 -0
- package/packages/agent-hooks/src/deploy/json-merge.ts +115 -0
- package/packages/agent-hooks/src/deploy/legacy-lock.ts +213 -0
- package/packages/agent-hooks/src/deploy/list.ts +117 -0
- package/packages/agent-hooks/src/deploy/lock.ts +65 -0
- package/packages/agent-hooks/src/deploy/opencode-template.ts +74 -0
- package/packages/agent-hooks/src/deploy/profile.ts +117 -0
- package/packages/agent-hooks/src/deploy/render.ts +162 -0
- package/packages/agent-hooks/src/deploy/source.ts +84 -0
- package/packages/agent-hooks/src/gating/config.ts +514 -0
- package/packages/agent-hooks/src/gating/root.ts +117 -0
- package/packages/agent-hooks/src/hooks/briefing/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/briefing/index.ts +320 -0
- package/packages/agent-hooks/src/hooks/contract.ts +112 -0
- package/packages/agent-hooks/src/hooks/crg/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/crg/index.ts +209 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/index.ts +173 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/mapping.ts +121 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/scope-rewrite.ts +207 -0
- package/packages/agent-hooks/src/hooks/log.ts +233 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/config.ts +58 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/constants.ts +149 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/handler.ts +72 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/index.ts +203 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +212 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/skill-roots.ts +73 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/skills.ts +98 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +115 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +174 -0
- package/packages/agent-hooks/src/hosts/impl/claude.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/codex.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/cursor.ts +40 -0
- package/packages/agent-hooks/src/hosts/impl/kimi.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/opencode.ts +54 -0
- package/packages/agent-hooks/src/hosts/registry.ts +29 -0
- package/packages/agent-hooks/src/hosts/spec.ts +113 -0
- package/packages/agent-hooks/src/lean-ctx/env.ts +106 -0
- package/packages/agent-hooks/src/lean-ctx/mcp.ts +140 -0
- package/packages/agent-hooks/src/lib/spawn-with-timeout.ts +120 -0
- package/packages/agent-hooks/src/log/writer.ts +230 -0
- package/packages/agent-hooks/src/main.ts +269 -0
- package/packages/agent-hooks/src/pre-tool-use/handler.ts +549 -0
- package/packages/agent-hooks/src/rules/engine.ts +293 -0
- package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +51 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +320 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +249 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +258 -0
- package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +731 -0
- package/packages/agent-hooks/src/rules/impl/adl-identity.ts +128 -0
- package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +179 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +65 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +156 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +121 -0
- package/packages/agent-hooks/src/rules/impl/adl-session-required.ts +403 -0
- package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +92 -0
- package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +74 -0
- package/packages/agent-hooks/src/rules/impl/advisory-coverage.ts +43 -0
- package/packages/agent-hooks/src/rules/impl/advisory-finder.ts +62 -0
- package/packages/agent-hooks/src/rules/impl/agent-secrets-stay-unread.ts +173 -0
- package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +508 -0
- package/packages/agent-hooks/src/rules/impl/fs-canonical-checkout.ts +86 -0
- package/packages/agent-hooks/src/rules/impl/fs-git-internals.ts +75 -0
- package/packages/agent-hooks/src/rules/impl/fs-mv.ts +66 -0
- package/packages/agent-hooks/src/rules/impl/fs-rm.ts +83 -0
- package/packages/agent-hooks/src/rules/impl/fs-trash.ts +140 -0
- package/packages/agent-hooks/src/rules/impl/git-core.ts +101 -0
- package/packages/agent-hooks/src/rules/impl/git-helpers.ts +408 -0
- package/packages/agent-hooks/src/rules/impl/git-history.ts +77 -0
- package/packages/agent-hooks/src/rules/impl/git-paths.ts +139 -0
- package/packages/agent-hooks/src/rules/impl/git-plumbing.ts +167 -0
- package/packages/agent-hooks/src/rules/impl/git-protected-tree.ts +132 -0
- package/packages/agent-hooks/src/rules/impl/git-transitions.ts +292 -0
- package/packages/agent-hooks/src/rules/impl/git-verify.ts +95 -0
- package/packages/agent-hooks/src/rules/impl/git-worktree.ts +265 -0
- package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +76 -0
- package/packages/agent-hooks/src/rules/impl/messages.ts +128 -0
- package/packages/agent-hooks/src/rules/impl/parse-uncertain.ts +143 -0
- package/packages/agent-hooks/src/rules/impl/pr-completion.ts +35 -0
- package/packages/agent-hooks/src/rules/impl/shell-remote-script-exec.ts +63 -0
- package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +283 -0
- package/packages/agent-hooks/src/rules/impl/tool-bun-test.ts +81 -0
- package/packages/agent-hooks/src/rules/impl/tool-cargo.ts +66 -0
- package/packages/agent-hooks/src/rules/impl/tool-chmod-hook.ts +42 -0
- package/packages/agent-hooks/src/rules/impl/tool-find.ts +82 -0
- package/packages/agent-hooks/src/rules/impl/tool-frontend.ts +83 -0
- package/packages/agent-hooks/src/rules/impl/tool-grep.ts +93 -0
- package/packages/agent-hooks/src/rules/impl/tool-lean-ctx-global.ts +594 -0
- package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +77 -0
- package/packages/agent-hooks/src/rules/ports.ts +178 -0
- package/packages/agent-hooks/src/rules/registry.ts +233 -0
- package/packages/agent-hooks/src/rules/shell/git-identity.ts +1415 -0
- package/packages/agent-hooks/src/rules/shell/git-internals.ts +186 -0
- package/packages/agent-hooks/src/rules/shell/invocation.ts +1083 -0
- package/packages/agent-hooks/src/rules/shell/piped-script.ts +201 -0
- package/packages/agent-hooks/src/rules/shell/prefixes.ts +214 -0
- package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +108 -0
- package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +149 -0
- package/packages/agent-hooks/src/rules/shell/split.ts +179 -0
- package/packages/agent-hooks/src/rules/shell/substitution.ts +394 -0
- package/packages/agent-hooks/src/rules/shell/token.ts +180 -0
- package/packages/agent-hooks/src/rules/shell/xargs.ts +81 -0
- package/packages/agent-hooks/src/rules/spec.ts +152 -0
- package/packages/agent-hooks/src/surface-policy.ts +37 -0
- package/packages/agent-hooks/tsconfig.json +23 -0
- package/packages/agent-settings/assets/GLOBAL-AGENTS.md +107 -0
- package/packages/agent-settings/assets/agents/architect.toml +30 -0
- package/packages/agent-settings/assets/agents/code-reviewer.toml +27 -0
- package/packages/agent-settings/assets/agents/critic.toml +35 -0
- package/packages/agent-settings/assets/agents/executor.toml +28 -0
- package/packages/agent-settings/assets/agents/explore.toml +25 -0
- package/packages/agent-settings/assets/agents/planner.toml +29 -0
- package/packages/agent-settings/assets/lean-ctx/config.toml +39 -0
- package/packages/agent-settings/assets/lean-ctx/gitignore +6 -0
- package/packages/agent-settings/assets/lean-ctx/layout.toml +5 -0
- package/packages/agent-settings/assets/mcp.json +20 -0
- package/packages/agent-settings/managed/README.md +331 -0
- package/packages/agent-settings/managed/claude-managed-settings.json +150 -0
- package/packages/agent-settings/managed/codex-requirements.toml +105 -0
- package/packages/agent-settings/protected.json +470 -0
- package/packages/agent-settings/src/deploy/agent-render.ts +94 -0
- package/packages/agent-settings/src/deploy/agent-toml.ts +76 -0
- package/packages/agent-settings/src/deploy/agents-deploy.ts +129 -0
- package/packages/agent-settings/src/deploy/doctor.ts +201 -0
- package/packages/agent-settings/src/deploy/index.ts +33 -0
- package/packages/agent-settings/src/deploy/json-pretty.ts +66 -0
- package/packages/agent-settings/src/deploy/lean-ctx-deploy.ts +138 -0
- package/packages/agent-settings/src/deploy/legacy-lock.ts +286 -0
- package/packages/agent-settings/src/deploy/list.ts +135 -0
- package/packages/agent-settings/src/deploy/lock.ts +112 -0
- package/packages/agent-settings/src/deploy/mcp-deploy.ts +175 -0
- package/packages/agent-settings/src/deploy/mcp-inspect.ts +56 -0
- package/packages/agent-settings/src/deploy/mcp-merge.ts +164 -0
- package/packages/agent-settings/src/deploy/mcp-render.ts +80 -0
- package/packages/agent-settings/src/deploy/mcp-source.ts +43 -0
- package/packages/agent-settings/src/deploy/profile.ts +296 -0
- package/packages/agent-settings/src/deploy/settings.ts +65 -0
- package/packages/agent-settings/src/global-agents.ts +230 -0
- package/packages/agent-settings/src/global-surface-sweep.ts +2179 -0
- package/packages/agent-settings/src/kimi-hooks.ts +455 -0
- package/packages/agent-settings/src/opencode-hooks.ts +76 -0
- package/packages/agent-settings/src/surface-policy.ts +441 -0
- package/packages/agent-settings/surface-policy.json +20 -0
- package/packages/agent-skills/assets/code-review/SKILL.md +100 -0
- package/packages/agent-skills/assets/codebase-design/SKILL.md +98 -0
- package/packages/agent-skills/assets/codebase-design/references/DEEPENING.md +37 -0
- package/packages/agent-skills/assets/codebase-design/references/DESIGN-IT-TWICE.md +44 -0
- package/packages/agent-skills/assets/codebase-design/references/TESTABILITY.md +29 -0
- package/packages/agent-skills/assets/debug-issue/SKILL.md +40 -0
- package/packages/agent-skills/assets/diagnosing-bugs/SKILL.md +100 -0
- package/packages/agent-skills/assets/diagnosing-bugs/references/FEEDBACK-LOOP-TACTICS.md +34 -0
- package/packages/agent-skills/assets/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/packages/agent-skills/assets/domain-modeling/SKILL.md +86 -0
- package/packages/agent-skills/assets/domain-modeling/references/ADR-FORMAT.md +47 -0
- package/packages/agent-skills/assets/domain-modeling/references/CONTEXT-FORMAT.md +60 -0
- package/packages/agent-skills/assets/explore-codebase/SKILL.md +41 -0
- package/packages/agent-skills/assets/handoff/SKILL.md +28 -0
- package/packages/agent-skills/assets/implement/SKILL.md +28 -0
- package/packages/agent-skills/assets/refactor-safely/SKILL.md +44 -0
- package/packages/agent-skills/assets/review-changes/SKILL.md +45 -0
- package/packages/agent-skills/assets/tdd/SKILL.md +49 -0
- package/packages/agent-skills/assets/tdd/references/mocking.md +59 -0
- package/packages/agent-skills/assets/tdd/references/tests.md +77 -0
- package/packages/agent-skills/assets/testing/SKILL.md +54 -0
- package/packages/agent-skills/assets/to-feature/SKILL.md +91 -0
- package/packages/agent-skills/assets/to-feature/references/FEATURE-SPEC-TEMPLATE.md +88 -0
- package/packages/agent-skills/assets/to-workitems/SKILL.md +90 -0
- package/packages/agent-skills/assets/to-workitems/references/AZURE-DEVOPS-HIERARCHY.md +118 -0
- package/packages/agent-skills/assets/to-workitems/references/TICKET-TEMPLATES.md +70 -0
- package/packages/agent-skills/assets/wayfinder/SKILL.md +100 -0
- package/packages/agent-skills/assets/wayfinder/references/TEMPLATES.md +35 -0
- package/packages/agent-skills/assets/wayfinder/references/TICKET-TYPES.md +8 -0
- package/packages/agent-skills/deploy-profile.json +9 -0
- package/packages/agent-skills/deploy-profile.schema.json +45 -0
- package/packages/agent-skills/dist/deploy.d.ts +27 -0
- package/packages/agent-skills/dist/deploy.d.ts.map +1 -0
- package/packages/agent-skills/dist/deploy.js +186 -0
- package/packages/agent-skills/dist/deploy.js.map +1 -0
- package/packages/agent-skills/dist/doctor.d.ts +24 -0
- package/packages/agent-skills/dist/doctor.d.ts.map +1 -0
- package/packages/agent-skills/dist/doctor.js +141 -0
- package/packages/agent-skills/dist/doctor.js.map +1 -0
- package/packages/agent-skills/dist/fs-utils.d.ts +8 -0
- package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -0
- package/packages/agent-skills/dist/fs-utils.js +40 -0
- package/packages/agent-skills/dist/fs-utils.js.map +1 -0
- package/packages/agent-skills/dist/index.d.ts +8 -0
- package/packages/agent-skills/dist/index.d.ts.map +1 -0
- package/packages/agent-skills/dist/index.js +8 -0
- package/packages/agent-skills/dist/index.js.map +1 -0
- package/packages/agent-skills/dist/legacy-lock.d.ts +44 -0
- package/packages/agent-skills/dist/legacy-lock.d.ts.map +1 -0
- package/packages/agent-skills/dist/legacy-lock.js +121 -0
- package/packages/agent-skills/dist/legacy-lock.js.map +1 -0
- package/packages/agent-skills/dist/list.d.ts +23 -0
- package/packages/agent-skills/dist/list.d.ts.map +1 -0
- package/packages/agent-skills/dist/list.js +75 -0
- package/packages/agent-skills/dist/list.js.map +1 -0
- package/packages/agent-skills/dist/manifest.d.ts +15 -0
- package/packages/agent-skills/dist/manifest.d.ts.map +1 -0
- package/packages/agent-skills/dist/manifest.js +57 -0
- package/packages/agent-skills/dist/manifest.js.map +1 -0
- package/packages/agent-skills/dist/profile.d.ts +41 -0
- package/packages/agent-skills/dist/profile.d.ts.map +1 -0
- package/packages/agent-skills/dist/profile.js +86 -0
- package/packages/agent-skills/dist/profile.js.map +1 -0
- package/packages/agent-skills/dist/skill-config.d.ts +24 -0
- package/packages/agent-skills/dist/skill-config.d.ts.map +1 -0
- package/packages/agent-skills/dist/skill-config.js +68 -0
- package/packages/agent-skills/dist/skill-config.js.map +1 -0
- package/packages/agent-skills/dist/skill-meta.d.ts +17 -0
- package/packages/agent-skills/dist/skill-meta.d.ts.map +1 -0
- package/packages/agent-skills/dist/skill-meta.js +67 -0
- package/packages/agent-skills/dist/skill-meta.js.map +1 -0
- package/packages/agent-skills/package.json +31 -0
- package/packages/agent-skills/src/deploy.ts +222 -0
- package/packages/agent-skills/src/doctor.ts +178 -0
- package/packages/agent-skills/src/fs-utils.ts +40 -0
- package/packages/agent-skills/src/index.ts +29 -0
- package/packages/agent-skills/src/legacy-lock.ts +152 -0
- package/packages/agent-skills/src/list.ts +94 -0
- package/packages/agent-skills/src/manifest.ts +66 -0
- package/packages/agent-skills/src/profile.ts +128 -0
- package/packages/agent-skills/src/skill-config.ts +75 -0
- package/packages/agent-skills/src/skill-meta.ts +78 -0
- package/packages/agent-skills/tsconfig.build.json +13 -0
- package/packages/agent-skills/tsconfig.json +23 -0
- package/packages/azdo/README.md +111 -0
- package/packages/azdo/package.json +21 -0
- package/packages/azdo/src/azdo-pl.ts +275 -0
- package/packages/azdo/src/azdo-pr-review.ts +160 -0
- package/packages/azdo/src/azdo-pr.ts +289 -0
- package/packages/azdo/src/azdo-repo-doctor.ts +839 -0
- package/packages/azdo/src/azdo-wit.ts +145 -0
- package/packages/azdo/src/cli.ts +251 -0
- package/packages/azdo/src/lib/agent-identity.ts +198 -0
- package/packages/azdo/src/lib/agent-token.ts +167 -0
- package/packages/azdo/src/lib/client.ts +259 -0
- package/packages/azdo/src/lib/graph-identity.ts +153 -0
- package/packages/azdo/src/lib/validate-pr-metadata.ts +57 -0
- package/packages/azdo/src/mcp-server.ts +209 -0
- package/packages/azdo/src/tool-dispatch.ts +204 -0
- package/packages/azdo/tsconfig.json +13 -0
- package/packages/fleet/jobs/git-maintain/src/main.ts +588 -0
- package/packages/fleet/manifest.json +207 -0
- package/packages/fleet/manifest.schema.json +283 -0
- package/packages/fleet/src/default-agent-file.ts +144 -0
- package/packages/fleet/src/install-adl-package.ts +178 -0
- package/packages/fleet/src/install-embedding-model.ts +412 -0
- package/packages/fleet/src/launch-agents.ts +649 -0
- package/packages/fleet/src/managed-settings.ts +278 -0
- package/packages/fleet/src/scratch-reap.ts +601 -0
- package/packages/fleet/src/vscode-settings.ts +705 -0
- package/packages/fleet/systemd/adl-azure-agent-update.service +13 -0
- package/packages/fleet/systemd/adl-azure-agent-update.timer +10 -0
- package/packages/repo-controls/AGENTS.md +96 -0
- package/packages/repo-controls/CLAUDE.md +1 -0
- package/packages/repo-controls/LICENSE +20 -0
- package/packages/repo-controls/README.md +493 -0
- package/packages/repo-controls/assets/enable-integration-auto-complete.mjs +79 -0
- package/packages/repo-controls/assets/promote.ts +371 -0
- package/packages/repo-controls/assets/version-bump.sh +189 -0
- package/packages/repo-controls/azure-pipelines.yml +274 -0
- package/packages/repo-controls/bin/adl-repo-controls.ts +10 -0
- package/packages/repo-controls/bunfig.toml +58 -0
- package/packages/repo-controls/package/adl-compliance/AGENTS.md +163 -0
- package/packages/repo-controls/package/adl-compliance/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/conftest.py +78 -0
- package/packages/repo-controls/package/adl-compliance/pyproject.toml +31 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/__init__.py +50 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +98 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/check.py +210 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-bad-status/docs/architecture/overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-bad-status/docs/decisions/adr-901-proposed.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-broken-backlink/docs/decisions/adr-902-dangling.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-clean/docs/architecture/overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-clean/docs/decisions/adr-900-example.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/.plans/b_committed/26-08-08-lifecycle-fixture.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/.specs/demo/lifecycle.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/docs/decisions/adr-903-frontmatter-mismatch.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/.plans/c_done/26-08-08-completed-fixture.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/.specs/demo/lifecycle.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/docs/decisions/adr-904-completed-plan.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/check.py +91 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/architecture/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/compliance/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/decisions/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/index.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/operations/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/research/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/stray-root-file.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/totally-made-up/nonsense.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +106 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +291 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/clean/backend/clean.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/excluded/frontend/mobile/src/i18n/locales/zh-CN/strings.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend/escaped.rs +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend/raw.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend//346/226/207/344/273/266.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +193 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/check.py +140 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-clean/docs/architecture/foo.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-clean/docs/architecture/index.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-violation/docs/architecture/foo.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-violation/docs/architecture/index.md +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/test_check.py +98 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +378 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +192 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/index.md +14 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs-knowledge-indexes.yaml +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/index.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs-knowledge-indexes.yaml +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/index.md +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs-knowledge-indexes.yaml +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +102 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/check.py +387 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-bad-date/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-clean/plans/LEDGER.md +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-empty-table/plans/LEDGER.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-long-event/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-violation/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +427 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/check.py +84 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-fence/docs/bad-fence.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-fence/docs/valid.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-frontmatter/docs/bad-front-matter.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-frontmatter/docs/valid.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-clean/docs/valid.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/test_check.py +126 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +210 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +119 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs/architecture/bad-status.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +49 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +159 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/check.py +578 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/architecture/backend/crate-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/architecture/team/team-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/compliance/controls/control-matrix.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/compliance/controls/control-matrix.yaml +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/research/benchmarks/note.md +24 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/backend/crate-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-delivery.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-recommendation.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/target-narration.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/team/team-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/compliance/controls/control-matrix.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/compliance/controls/control-matrix.yaml +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/research/benchmarks/bad-research.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +461 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/check.py +124 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/.workflows/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/.workflows/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/CLAUDE.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/INVARIANTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/bad-pointer/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/bad-pointer/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/docs/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/docs/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/missing-pair/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/owned/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/owned/CLAUDE.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/test_check.py +116 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/__init__.py +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/check.py +380 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/fixtures/redeclared-workflows-tree/automation/pipelines/pr-validation.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/test_check.py +274 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +227 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/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-clean/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/fresh/fresh.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub1/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub10/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub11/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub2/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub3/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub4/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub5/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub6/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub7/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub8/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub9/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/services/i18n/locales/de/common.json +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/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-excluded/frontend/packages/desktop/src/vendored-crate/Cargo.toml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/fresh/fresh.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub1/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub10/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub11/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub2/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub3/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub4/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub5/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub6/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub7/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub8/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub9/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/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-unbaselined/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +138 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +240 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/.plans/a_new/plan.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/backend/AGENTS.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/docs/page.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-stray/backend/notes.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-stray/docs/page.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +220 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/__init__.py +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +225 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/GAPS-AND-FINDINGS.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/features/az601-clean/spec.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +330 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +240 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/agent/crates/enact-providers/src/snapshots/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-app/assets/builtin-assistants/avatars/assistant.jpg +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-assets/assets/logos/tools/coding/tool.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-session/src/backend/codex_init_prompt.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/mobile/assets/images/icon.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/logos/brand/app.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/themes/default-theme.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/public/pwa/icon-192.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/resources/product.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/apps/legacy/file.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/backend/crates/enact-session/src/backend/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/frontend/unapproved/screenshot.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +230 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +53 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +438 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/AGENTS.md +1 -0
- 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 +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/spec.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/templates/feature.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-violation/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-violation/plans/features/az347-test-coverage/spec.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +461 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/check.py +62 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/NotAMigration.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/0001_long_prefix.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/001_init.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/002_add_index.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/003-dashed-slug.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/004_MixedCase.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/005_trailing space.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/01_short_prefix.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/not-a-migration.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/test_check.py +116 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +188 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/.plans/c_done/26-07-27-history.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/README.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/links.md +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/route-target.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/.plans/c_done/26-07-27-history.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/README.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/links.md +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/route-target.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/test_check.py +166 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +135 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.agents/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.changeset/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.claude/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.code-review-graph/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.code-review-graph_old/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.codex/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.cursor/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.cursorrules +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.dockerignore +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.docs/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.donors/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.kimi-code/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.lfsconfig +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.mcp.json +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.opencode/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.workflows/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CHANGELOG.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CLAUDE-INVARIANTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/INDEPENDENT-VERIFICATION.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/INVARIANTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/LICENSE +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/NOTICE +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/RELEASE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/backend/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/compliance/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/dev/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/docker/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/docs/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/frontend/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/infra/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/justfile +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/opencode.jsonc +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/rule-tests/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/rules/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/unapproved-root/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/undeclared-root-file.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +122 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +290 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.changeset/some-change.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.plans/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.specs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.workflows/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/CHANGELOG.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/CLAUDE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INDEPENDENT-VERIFICATION.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INVARIANTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/README.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/RELEASE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/STRAY.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/docs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/docs/architecture/note.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/frontend/README.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/.workflows/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/docs/overview.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/plans/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +329 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/a/b/c/d/at-limit.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/a/b/c/d/e/too-deep.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-01.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-02.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-03.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-04.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-05.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-06.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-07.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-08.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-09.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-10.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-11.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-12.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-13.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-14.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-15.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-16.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +163 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +169 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/large file.bin +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/large file.bin +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/small.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/missing-filter/large file.bin +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/payload.dat +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +133 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/check.py +129 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/disjoint/gate-registry.yaml +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/empty/gate-registry.yaml +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/overlapping/gate-registry.yaml +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/test_check.py +109 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/check.py +149 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/clean/docs/readme.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/relevant/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/test_check.py +151 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/check.py +202 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/changesets/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/CHANGELOG.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/changesets/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/CHANGELOG.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/test_check.py +162 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/check.py +103 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/git-bad.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/git-note.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/good.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-bad.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-note.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-trailing.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/notes.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/elsewhere/loose-git.sh +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/elsewhere/loose-grep.sh +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/test_check.py +117 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/__init__.py +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +265 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/fixtures/ignored-paths/keep.log +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/fixtures/ignored-paths/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +180 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/check.py +84 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-clean/LICENSE +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-mismatch/LICENSE +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-missing/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/test_check.py +66 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +167 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.lock +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.toml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/rust-toolchain.toml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/frontend/bun.lock +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.lock +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.toml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/rust-toolchain.toml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/frontend/bun.lock +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +109 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +483 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/ast_grep.py +199 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/batch.py +52 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +303 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +106 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +99 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/errors.py +32 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/finding.py +65 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/models.py +40 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/receipt.py +63 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/scope.py +82 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/verdict.py +161 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +131 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.toml +30 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +65 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +791 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.schema.yaml +176 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +791 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants-registry.yaml +112 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants.py +129 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +281 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +250 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/severity-policy.yaml +114 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/providers/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +371 -0
- package/packages/repo-controls/package/adl-compliance/uv.lock +199 -0
- package/packages/repo-controls/package.json +33 -0
- package/packages/repo-controls/scripts/hooks/commit-msg +63 -0
- package/packages/repo-controls/scripts/hooks/lib/hook-log.sh +62 -0
- package/packages/repo-controls/scripts/hooks/post-checkout +15 -0
- package/packages/repo-controls/scripts/hooks/post-commit +18 -0
- package/packages/repo-controls/scripts/hooks/pre-commit +82 -0
- package/packages/repo-controls/scripts/hooks/pre-push +144 -0
- package/packages/repo-controls/src/azdo-push.ts +463 -0
- package/packages/repo-controls/src/azure-devops-governance.ts +248 -0
- package/packages/repo-controls/src/azure-devops-remote.ts +61 -0
- package/packages/repo-controls/src/cli.ts +188 -0
- package/packages/repo-controls/src/compliance-config.ts +200 -0
- package/packages/repo-controls/src/config.ts +690 -0
- package/packages/repo-controls/src/constants.ts +97 -0
- package/packages/repo-controls/src/coverage-ratchet.ts +153 -0
- package/packages/repo-controls/src/doc-freshness.ts +172 -0
- package/packages/repo-controls/src/doctor.ts +304 -0
- package/packages/repo-controls/src/findings-ratchet.ts +163 -0
- package/packages/repo-controls/src/gitignore-block.ts +253 -0
- package/packages/repo-controls/src/hook-log.ts +72 -0
- package/packages/repo-controls/src/hook.ts +694 -0
- package/packages/repo-controls/src/install.ts +506 -0
- package/packages/repo-controls/src/integrity.ts +104 -0
- package/packages/repo-controls/src/promote.ts +25 -0
- package/packages/repo-controls/src/runtime.ts +110 -0
- package/packages/repo-controls/src/workflows-drift.ts +106 -0
- package/packages/repo-controls/src/worktree-guard.ts +272 -0
- package/packages/repo-controls/src/worktree-limit.ts +11 -0
- package/packages/repo-controls/tsconfig.json +14 -0
- package/packages/repo-controls/workflows/scripts/release/verify-npm-artifact.ts +119 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""LAY-014 — ported from
|
|
2
|
+
`compliance_new/checks/layout/scripts-size-depth/test.sh`.
|
|
3
|
+
|
|
4
|
+
ONE corpus, two sets, copied byte-for-byte from the shell tree's fixtures
|
|
5
|
+
(`fixtures/scripts-layout/`): 16 direct files under `.workflows/scripts` plus
|
|
6
|
+
one file exactly at the depth limit (`a/b/c/d/at-limit.sh`, 4 levels down) and
|
|
7
|
+
one past it (`a/b/c/d/e/too-deep.sh`, 5 levels down). The gate counts direct
|
|
8
|
+
files and measures depth over the GIVEN SET, so the SAME tree grades clean or
|
|
9
|
+
over-limit depending only on what it was handed — test.sh's point, carried
|
|
10
|
+
over unchanged.
|
|
11
|
+
|
|
12
|
+
This check is not yet wired into `checks/__init__.py` (a later step wires this
|
|
13
|
+
port's whole wave into the registry in one shot, to avoid concurrent edits to
|
|
14
|
+
that shared file), so `runner.run` would report "no check implements LAY-014"
|
|
15
|
+
before ever reaching this check's own logic. Every test below therefore calls
|
|
16
|
+
`ScriptsSizeDepth().run(...)` directly and assembles the verdict with
|
|
17
|
+
`decide()` itself — the same bypass `MarkdownTrees`' test module already uses
|
|
18
|
+
for the same reason.
|
|
19
|
+
|
|
20
|
+
test.sh's "no set: could not run" case is a shell-only mechanism: check.sh
|
|
21
|
+
refuses to run at all when `ADL_CHANGED_FILES` is unset. A Python check is
|
|
22
|
+
never handed "unset" — it is handed a `FileSet`, always — so the equivalent
|
|
23
|
+
here is the generic could-not-run path `runner.run` takes for every check when
|
|
24
|
+
the row's `engine.scope` intersects an exhaustively-given set to nothing (see
|
|
25
|
+
`core/verdict.py`'s `could_not_run` and `runner.run`'s `exhaustive` guard).
|
|
26
|
+
That is a property of the runner shared by every gate, not of this one, so it
|
|
27
|
+
is verified at the scope layer directly, exactly as `MarkdownTrees`' own
|
|
28
|
+
`test_the_rows_scope_selects_nothing_from_an_empty_given_set` does.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import pathlib
|
|
34
|
+
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
|
|
37
|
+
from helpers import corpus_files
|
|
38
|
+
|
|
39
|
+
from adl_compliance.checks.layout.scripts_size_depth import ScriptsSizeDepth
|
|
40
|
+
from adl_compliance.core import scope
|
|
41
|
+
from adl_compliance.core.context import Context, FileSet
|
|
42
|
+
from adl_compliance.core.finding import Finding
|
|
43
|
+
from adl_compliance.core.verdict import Outcome, decide
|
|
44
|
+
from adl_compliance.policy.registry import load
|
|
45
|
+
|
|
46
|
+
FIXTURES = pathlib.Path(__file__).parent / "fixtures"
|
|
47
|
+
CORPUS = FIXTURES / "scripts-layout"
|
|
48
|
+
ROW = load().by_id("LAY-014")
|
|
49
|
+
|
|
50
|
+
GIVEN = corpus_files(CORPUS)
|
|
51
|
+
# rg -v 'direct-16\.sh$|too-deep\.sh$' — the clean set drops the 16th direct
|
|
52
|
+
# file and the one-past-the-limit nested file.
|
|
53
|
+
NARROWED = tuple(
|
|
54
|
+
p for p in GIVEN
|
|
55
|
+
if not p.endswith("direct-16.sh") and not p.endswith("too-deep.sh")
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def verdict(given: tuple[str, ...], root: Path = CORPUS, scripts_root: str = ".workflows/scripts"):
|
|
60
|
+
# The scripts root is a RESOLVED INPUT now, not a class constant. The corpus
|
|
61
|
+
# keeps the packaged default's shape, so every count and limit asserted
|
|
62
|
+
# below is unchanged — only where the root comes from moved.
|
|
63
|
+
ctx = Context(root=root, row=ROW, inputs={"scripts_root": root / scripts_root})
|
|
64
|
+
findings = tuple(
|
|
65
|
+
r for r in ScriptsSizeDepth().run(ctx, FileSet(paths=given))
|
|
66
|
+
if isinstance(r, Finding)
|
|
67
|
+
)
|
|
68
|
+
return decide(ROW, findings, 0, ())
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# -------------------------------------------------------------------- premise
|
|
72
|
+
def test_the_premise_holds() -> None:
|
|
73
|
+
"""Asserted, not assumed: a mistyped suffix would leave both sets
|
|
74
|
+
identical and every case below would agree for nothing."""
|
|
75
|
+
assert len(GIVEN) == 18
|
|
76
|
+
assert len(NARROWED) == 16
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ------------------------------------------------------- exactly at the limits
|
|
80
|
+
def test_exactly_at_both_limits_is_clean() -> None:
|
|
81
|
+
"""15 direct files and 4 levels are permitted, so a finding on either
|
|
82
|
+
number is a breach of the limit and not merely the gate counting."""
|
|
83
|
+
result = verdict(NARROWED)
|
|
84
|
+
assert result.outcome is Outcome.CLEAN, result.render()
|
|
85
|
+
assert result.findings == ()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# ------------------------------------------------ one file and one level over
|
|
89
|
+
def test_one_file_and_one_level_over_is_reported() -> None:
|
|
90
|
+
result = verdict(GIVEN)
|
|
91
|
+
assert result.outcome is Outcome.FINDINGS, result.render()
|
|
92
|
+
|
|
93
|
+
text = result.render()
|
|
94
|
+
assert ".workflows/scripts: has 16 direct files; limit is 15" in text
|
|
95
|
+
assert "a/b/c/d/e: is 5 levels below .workflows/scripts; limit is 4" in text
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_exactly_two_findings_fire() -> None:
|
|
99
|
+
"""Without this, a gate that also fired on `at-limit.sh`'s own directory
|
|
100
|
+
(which sits exactly at the depth limit, not past it) would also pass."""
|
|
101
|
+
result = verdict(GIVEN)
|
|
102
|
+
assert len(result.findings) == 2
|
|
103
|
+
assert {f.rule for f in result.findings} == {"LAY-014"}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# --------------------------------------------------------- isolation proof
|
|
107
|
+
def test_every_finding_resolves_inside_the_corpus() -> None:
|
|
108
|
+
"""This checkout has its own `.workflows/scripts` tree, larger and deeper
|
|
109
|
+
than the corpus. A check that resolved a repository root instead of
|
|
110
|
+
reading the `Context` it was handed would name paths from it."""
|
|
111
|
+
for finding in verdict(GIVEN).findings:
|
|
112
|
+
assert (CORPUS / finding.path).is_dir(), finding.render()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# ------------------------------------------------------------- the given set
|
|
116
|
+
def test_the_stray_files_outside_the_given_set_are_not_reported() -> None:
|
|
117
|
+
"""Both breaches are still on disk; a set that omits them must report
|
|
118
|
+
neither — the same "intersection, half one" case every ported gate proves."""
|
|
119
|
+
result = verdict(tuple(p for p in NARROWED if not p.endswith("at-limit.sh")))
|
|
120
|
+
assert result.outcome is Outcome.CLEAN, result.render()
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# --------------------------------------------------- no set: could not run
|
|
124
|
+
def test_the_rows_scope_selects_nothing_from_an_empty_given_set() -> None:
|
|
125
|
+
assert scope.intersect(ROW.resolved_scope(), ()) == ()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# ------------------------------------------------- the root is not a constant
|
|
129
|
+
def test_the_scripts_root_follows_the_declared_tree(tmp_path: Path) -> None:
|
|
130
|
+
"""The regression guard for a literal `.workflows/scripts` in the package.
|
|
131
|
+
|
|
132
|
+
enact-m5 keeps CI in `workflows/` while `.workflows/` is repo-controls' own
|
|
133
|
+
install artefact, so the hardcoded constant made this gate report
|
|
134
|
+
`missing .workflows/scripts` and then call all 44 real scripts "outside
|
|
135
|
+
scripts root" — 45 findings, not one of them true. Its printed remedy was
|
|
136
|
+
"update SCRIPTS_ROOT in check.py": the gate asking a consumer to edit the
|
|
137
|
+
shared package.
|
|
138
|
+
"""
|
|
139
|
+
root = tmp_path / "repo"
|
|
140
|
+
over_limit = root / "ci/scripts/tools"
|
|
141
|
+
over_limit.mkdir(parents=True)
|
|
142
|
+
for index in range(ScriptsSizeDepth.MAX_DIRECT_FILES + 1):
|
|
143
|
+
(over_limit / f"s{index}.sh").write_text("#!/bin/sh\n")
|
|
144
|
+
|
|
145
|
+
given = tuple(
|
|
146
|
+
f"ci/scripts/tools/s{index}.sh"
|
|
147
|
+
for index in range(ScriptsSizeDepth.MAX_DIRECT_FILES + 1)
|
|
148
|
+
)
|
|
149
|
+
result = verdict(given, root=root, scripts_root="ci/scripts")
|
|
150
|
+
|
|
151
|
+
text = result.render()
|
|
152
|
+
assert "missing" not in text, text
|
|
153
|
+
assert "outside scripts root" not in text, text
|
|
154
|
+
# graded under the declared root, and named by it
|
|
155
|
+
assert "ci/scripts/tools: has 16 direct files; limit is 15" in text, text
|
|
156
|
+
assert ".workflows" not in text, text
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_a_missing_scripts_root_names_the_declared_path_not_a_constant(tmp_path: Path) -> None:
|
|
160
|
+
result = verdict((), root=tmp_path, scripts_root="ci/scripts")
|
|
161
|
+
text = result.render()
|
|
162
|
+
assert "missing ci/scripts" in text, text
|
|
163
|
+
assert ".workflows" not in text, text
|
package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""lfs."""
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""The `lfs.integrity` gate.
|
|
2
|
+
|
|
3
|
+
A folder rather than a module because the ported test carries its own fixture
|
|
4
|
+
corpus beside the check, same as every other gate in this package.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .check import Integrity
|
|
10
|
+
|
|
11
|
+
__all__ = ["Integrity"]
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""LFS-001 (`lfs.integrity`) — a blob over 1 MiB entering the repository must
|
|
2
|
+
go through the LFS filter, or it is `LFS-002`.
|
|
3
|
+
|
|
4
|
+
Ported from `compliance_new/checks/lfs/integrity/check.sh`. The row id
|
|
5
|
+
(`LFS-001`) and the finding id (`LFS-002`) are different on purpose — that
|
|
6
|
+
split already exists in check.sh itself (its own header names the row
|
|
7
|
+
`LFS-002` because an EARLIER row, also called `LFS-001`, was retired when this
|
|
8
|
+
one absorbed its question; see check.sh's opening comment). This port keeps
|
|
9
|
+
both spellings exactly as the source has them: `id` is the row this class
|
|
10
|
+
implements, `rule` is the one finding it emits, the same `id` != `rule` shape
|
|
11
|
+
`REP-002`'s `LCK-001`/`LCK-002` already uses.
|
|
12
|
+
|
|
13
|
+
**Reconstructing check.sh's text.** Every `check.sh`/`test.sh` file under
|
|
14
|
+
`compliance_new/checks/lfs/integrity/` has had the literal word "git" removed
|
|
15
|
+
from it (verified: `rg -c git compliance_new/checks/lfs/integrity/check.sh`
|
|
16
|
+
returns 0, and the same is true of 94 of the tree's 98 `check.sh` files, so
|
|
17
|
+
this is a property of the reference corpus, not of this one gate). The
|
|
18
|
+
finding text below restores it, and this is a RECONSTRUCTION, not a
|
|
19
|
+
transcription — recorded here rather than done silently:
|
|
20
|
+
|
|
21
|
+
message check.sh has `"... entering without the LFS filter"` (note the
|
|
22
|
+
double space). Restored to `"... entering Git without the LFS
|
|
23
|
+
filter"` — a single removed word explains the exact gap.
|
|
24
|
+
fix check.sh has `.attributes` and `' lfs track'`. Restored to
|
|
25
|
+
`.gitattributes` and `'git lfs track'`.
|
|
26
|
+
pointer check.sh compares the object's first line against
|
|
27
|
+
`'version https://-lfs.hub.com/spec/v1'`. Restored to
|
|
28
|
+
`'version https://git-lfs.github.com/spec/v1'`.
|
|
29
|
+
|
|
30
|
+
The pointer restoration is not a guess: `test.sh` proves it. Its clean-pass
|
|
31
|
+
case runs a REAL `git lfs install --local --force` and
|
|
32
|
+
`git add --renormalize`, which produces a real Git LFS pointer file — and a
|
|
33
|
+
real pointer file's first line is the well-known, standard
|
|
34
|
+
`version https://git-lfs.github.com/spec/v1`, never the garbled
|
|
35
|
+
`.../-lfs.hub.com/...` string check.sh's own source literally contains. If
|
|
36
|
+
check.sh's comparison used the literal garbled string, that same clean-pass
|
|
37
|
+
case would report a finding instead of passing. The restored string is the
|
|
38
|
+
only one consistent with test.sh's own asserted outcome.
|
|
39
|
+
|
|
40
|
+
**Two deviations this port does NOT resolve, only documents**, because
|
|
41
|
+
`compliance_py`'s architecture makes check.sh's literal design unstatable
|
|
42
|
+
here rather than merely inconvenient:
|
|
43
|
+
|
|
44
|
+
1. **No git object reads (K-41).** check.sh deliberately reads the path from
|
|
45
|
+
the index (`:path`, pre-commit) or `HEAD` (`HEAD:path`, elsewhere) via
|
|
46
|
+
`git cat-file`, and its own comment explains why at length: the WORKTREE
|
|
47
|
+
file is not a safe source, because a correctly-tracked LFS pointer is
|
|
48
|
+
smudged back to full content on disk, and a check reading the worktree
|
|
49
|
+
would flag the very files that are doing the right thing. check.sh calls
|
|
50
|
+
this risk "latent, not hypothetical" for the shell tree's OWN prior
|
|
51
|
+
design, which read the worktree and was replaced because of it.
|
|
52
|
+
|
|
53
|
+
`compliance_py` has exactly one file that calls `git` or resolves a root
|
|
54
|
+
— `cli.py` — and every check, this one included, is handed a `Context`
|
|
55
|
+
and a `FileSet` with no way to reach a git object store (see
|
|
56
|
+
`core/check.py`'s docstring and `INVARIANTS.md`'s K-41 entry, verified
|
|
57
|
+
there as `git: 1 module`). There is no established mechanism in this
|
|
58
|
+
package for a check to read `:path`/`HEAD:path` instead of the worktree
|
|
59
|
+
file, and none is added here. `graded` below reads the WORKTREE file
|
|
60
|
+
`ctx.path(rel)` resolves to, which means it inherits the exact risk
|
|
61
|
+
check.sh's comment names — a large file whose LFS pointer HAS been
|
|
62
|
+
smudged back to full content by an active `git-lfs` filter would be
|
|
63
|
+
misreported as a violation. check.sh's own measurement on the checkout it
|
|
64
|
+
was written against found no case of this actually happening (one sampled
|
|
65
|
+
LFS-tracked file was the same byte count in the worktree as in `HEAD`),
|
|
66
|
+
so the risk carries over as documented rather than as an active defect —
|
|
67
|
+
but it is a real, named gap, not a silent one, and resolving it needs
|
|
68
|
+
either a git-object-reading mechanism added to this package's
|
|
69
|
+
architecture or an accepted exception for this one gate.
|
|
70
|
+
|
|
71
|
+
2. **No phase (K-43).** check.sh branches its object read on
|
|
72
|
+
`ADL_GATE_PHASE` (index at pre-commit, `HEAD` everywhere else).
|
|
73
|
+
`compliance_py` reads no phase anywhere — "nothing reads a phase" is
|
|
74
|
+
K-43, and K-33 records phase-conditional behaviour as retired by
|
|
75
|
+
construction. There is one behaviour here, not two: `graded` grades
|
|
76
|
+
whatever the caller's `FileSet` contains, exactly like every other check
|
|
77
|
+
in this package.
|
|
78
|
+
|
|
79
|
+
`.gitattributes` matching is scoped to the repository-root file only, using
|
|
80
|
+
"last matching pattern wins" (`core.scope.matches`, the same rule real
|
|
81
|
+
`.gitattributes` files and this package's own `engine.scope` both use).
|
|
82
|
+
check.sh's `git check-attr` resolves the full multi-directory and global
|
|
83
|
+
attribute stack; this does not, and every case `test.sh` exercises uses a
|
|
84
|
+
single root-level file, so this is enough to prove the branch, not a claim
|
|
85
|
+
of full `check-attr` parity.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
from __future__ import annotations
|
|
89
|
+
|
|
90
|
+
from collections.abc import Iterable
|
|
91
|
+
from pathlib import Path
|
|
92
|
+
from typing import ClassVar
|
|
93
|
+
|
|
94
|
+
from ....core import scope
|
|
95
|
+
from ....core.check import Check
|
|
96
|
+
from ....core.context import Context, FileSet
|
|
97
|
+
from ....core.finding import Report
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class Integrity(Check):
|
|
101
|
+
id: ClassVar[str] = "LFS-001"
|
|
102
|
+
rule: ClassVar[str] = "LFS-002"
|
|
103
|
+
|
|
104
|
+
THRESHOLD: ClassVar[int] = 1024 * 1024
|
|
105
|
+
"""check.sh: `threshold=$((1024 * 1024))`. A blob strictly larger fails."""
|
|
106
|
+
|
|
107
|
+
POINTER: ClassVar[str] = "version https://git-lfs.github.com/spec/v1"
|
|
108
|
+
"""The first line of a real Git LFS pointer file. See the module
|
|
109
|
+
docstring's "Reconstructing check.sh's text" for why this is restored
|
|
110
|
+
rather than the garbled string check.sh's own source contains."""
|
|
111
|
+
|
|
112
|
+
GITATTRIBUTES: ClassVar[str] = ".gitattributes"
|
|
113
|
+
FILTER_LFS: ClassVar[str] = "filter=lfs"
|
|
114
|
+
|
|
115
|
+
def graded(self, ctx: Context, files: FileSet) -> Iterable[Report]:
|
|
116
|
+
for rel in files:
|
|
117
|
+
target = ctx.path(rel)
|
|
118
|
+
if not target.is_file():
|
|
119
|
+
# check.sh: a path `cat-file --batch-check` answers `missing`
|
|
120
|
+
# for -- deleted from the index, or never tracked -- is not a
|
|
121
|
+
# blob entering the repository, so there is nothing to
|
|
122
|
+
# enforce (its own comment on the `blob` type test).
|
|
123
|
+
continue
|
|
124
|
+
|
|
125
|
+
size = target.stat().st_size
|
|
126
|
+
if size <= self.THRESHOLD:
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
if self._tracked_by_lfs(ctx, rel) and self._first_line(target) == self.POINTER:
|
|
130
|
+
continue
|
|
131
|
+
|
|
132
|
+
# check.sh: both conditions are required, not either one -- a
|
|
133
|
+
# `.gitattributes` rule alone does not excuse content that was
|
|
134
|
+
# never actually converted to a pointer, and a pointer-shaped
|
|
135
|
+
# first line alone does not excuse a path with no rule tracking
|
|
136
|
+
# it. See "attribute-without-conversion" in this gate's fixtures.
|
|
137
|
+
yield self.report(
|
|
138
|
+
rel,
|
|
139
|
+
f"{rel} is a {size}-byte blob entering Git without the LFS filter",
|
|
140
|
+
f"add a .gitattributes rule matching {rel} to filter=lfs, run "
|
|
141
|
+
f"'git lfs track' for that pattern, then re-add {rel}",
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# ------------------------------------------------------------- reading
|
|
145
|
+
|
|
146
|
+
def _tracked_by_lfs(self, ctx: Context, rel: str) -> bool:
|
|
147
|
+
"""Root `.gitattributes` only; see the module docstring's scope note."""
|
|
148
|
+
body = self.text(ctx, self.GITATTRIBUTES)
|
|
149
|
+
if body is None:
|
|
150
|
+
return False
|
|
151
|
+
matched = False
|
|
152
|
+
for line in body.splitlines():
|
|
153
|
+
stripped = line.strip()
|
|
154
|
+
if not stripped or stripped.startswith("#"):
|
|
155
|
+
continue
|
|
156
|
+
pattern, *attrs = stripped.split()
|
|
157
|
+
if scope.matches(pattern, rel):
|
|
158
|
+
matched = self.FILTER_LFS in attrs
|
|
159
|
+
return matched
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def _first_line(target: Path) -> str:
|
|
163
|
+
"""Only a small prefix is read -- check.sh's own comment measures the
|
|
164
|
+
cost of reading whole oversized blobs and avoids it with
|
|
165
|
+
`--batch-check`; this avoids it by never opening more than one
|
|
166
|
+
buffer's worth of an already-known-oversized file."""
|
|
167
|
+
with target.open("rb") as handle:
|
|
168
|
+
prefix = handle.read(4096)
|
|
169
|
+
return prefix.split(b"\n", 1)[0].decode("utf-8", errors="replace").rstrip("\r")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ordinary
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
|
Binary file
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""LFS-001 — ported from `compliance_new/checks/lfs/integrity/test.sh`.
|
|
2
|
+
|
|
3
|
+
test.sh builds one fixture inline (`mktemp -d`, real `git init`/`add`/`commit`
|
|
4
|
+
calls, `head -c 1048577 /dev/zero`, `git lfs install --local --force`) and
|
|
5
|
+
walks it through a sequence of states, asserting the gate's verdict at each
|
|
6
|
+
one. Ported here as separate COMMITTED fixture directories, one per state —
|
|
7
|
+
the same shift every other ported check.sh/test.sh pair in this package
|
|
8
|
+
already made, and the one this task calls out `coverage.backend-ratchet`
|
|
9
|
+
(`COV-002`) as its concrete precedent for. Nothing here invents a scenario
|
|
10
|
+
test.sh does not have; each fixture below is named for, and traced back to,
|
|
11
|
+
one specific `run_gate`/`run_gate_tree` call in test.sh.
|
|
12
|
+
|
|
13
|
+
check.sh reads `:path`/`HEAD:path` (index or `HEAD`, by `ADL_GATE_PHASE`)
|
|
14
|
+
and this port reads the WORKTREE file instead — see `check.py`'s module
|
|
15
|
+
docstring for why (K-41: no check calls git; K-43: no phase). Concretely,
|
|
16
|
+
that collapses two of test.sh's cases into one fixture each here:
|
|
17
|
+
|
|
18
|
+
test.sh case -> fixture
|
|
19
|
+
---------------------------------------------------------------------
|
|
20
|
+
pre-commit: raw blob staged, no .gitattributes missing-filter
|
|
21
|
+
pre-commit: .gitattributes matches, blob still raw attribute-without-conversion
|
|
22
|
+
pre-commit: converted to a pointer, passes clean (bin)
|
|
23
|
+
qua_deploy: same tree, whole-repo audit, passes clean (bin, same file)
|
|
24
|
+
qua_deploy: payload.dat, large, unmatched extension unmatched-extension
|
|
25
|
+
pre-commit: small.txt, silent clean (txt)
|
|
26
|
+
|
|
27
|
+
`clean/` alone therefore stands in for THREE of test.sh's assertions (the
|
|
28
|
+
converted-pointer pass at both phases, plus the untouched small file), which
|
|
29
|
+
is exact rather than a simplification: with no phase in this port, "passes at
|
|
30
|
+
pre-commit" and "passes at qua_deploy" are the same claim about the same
|
|
31
|
+
file.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
from helpers import corpus, corpus_files
|
|
37
|
+
|
|
38
|
+
from adl_compliance import runner
|
|
39
|
+
from adl_compliance.checks.lfs.integrity import Integrity
|
|
40
|
+
from adl_compliance.core.verdict import Outcome
|
|
41
|
+
from adl_compliance.policy.registry import load
|
|
42
|
+
|
|
43
|
+
import pytest
|
|
44
|
+
|
|
45
|
+
FIXTURES = corpus("lfs", "integrity")
|
|
46
|
+
ROW = load().by_id("LFS-001")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.fixture(autouse=True)
|
|
50
|
+
def _wired(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
51
|
+
# LFS-001 is not yet in `checks/__init__.py`'s CHECKS tuple — a later step
|
|
52
|
+
# wires this wave of checks into the registry in one shot, to avoid
|
|
53
|
+
# concurrent edits to that shared file. Until then, `runner.lookup` cannot
|
|
54
|
+
# find this row, so the dispatch path (`runner.run`) is exercised here
|
|
55
|
+
# with its one lookup call patched to resolve LFS-001 to this module's
|
|
56
|
+
# class — everything else (scope intersection, structural/graded split,
|
|
57
|
+
# verdict decision) runs for real.
|
|
58
|
+
monkeypatch.setattr(runner, "lookup", lambda gate_id: Integrity)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def run(case: str) -> object:
|
|
62
|
+
root = FIXTURES / case
|
|
63
|
+
return runner.run(ROW, root, corpus_files(root))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_the_row_identifies_this_check() -> None:
|
|
67
|
+
assert ROW.domain == "lfs"
|
|
68
|
+
assert ROW.name == "integrity"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_a_large_staged_blob_outside_the_lfs_filter_is_rejected() -> None:
|
|
72
|
+
# test.sh: `run_gate pre-commit -- "large file.bin"` on a raw 1048577-byte
|
|
73
|
+
# blob with no `.gitattributes` at all must fail.
|
|
74
|
+
verdict = run("missing-filter")
|
|
75
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
76
|
+
assert len(verdict.findings) == 1
|
|
77
|
+
finding = verdict.findings[0]
|
|
78
|
+
assert finding.rule == "LFS-002"
|
|
79
|
+
assert finding.path == "large file.bin"
|
|
80
|
+
assert finding.line is None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_the_filename_with_spaces_is_not_truncated() -> None:
|
|
84
|
+
# test.sh: "A space in the name on purpose: a diagnostic that truncates at
|
|
85
|
+
# the space names a file nobody can find." check.sh's own shell diagnostics
|
|
86
|
+
# ran the risk of stopping at the first word; `Finding.path` and `render()`
|
|
87
|
+
# are plain Python strings with no such hazard, asserted directly rather
|
|
88
|
+
# than by absence.
|
|
89
|
+
verdict = run("missing-filter")
|
|
90
|
+
assert verdict.findings[0].path == "large file.bin"
|
|
91
|
+
assert "LFS-002 large file.bin: " in verdict.render()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_the_finding_names_the_size_and_an_actionable_fix() -> None:
|
|
95
|
+
verdict = run("missing-filter")
|
|
96
|
+
finding = verdict.findings[0]
|
|
97
|
+
assert finding.message == (
|
|
98
|
+
"large file.bin is a 1048577-byte blob entering Git without the LFS filter"
|
|
99
|
+
)
|
|
100
|
+
assert finding.fix == (
|
|
101
|
+
"add a .gitattributes rule matching large file.bin to filter=lfs, run "
|
|
102
|
+
"'git lfs track' for that pattern, then re-add large file.bin"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_a_matching_gitattributes_rule_does_not_excuse_a_raw_blob() -> None:
|
|
107
|
+
# test.sh: "the .attributes rule is added AFTER the blob was staged...
|
|
108
|
+
# This is the case that makes the `||` in the check load-bearing." A
|
|
109
|
+
# `.gitattributes` match alone must not pass a file that was never
|
|
110
|
+
# actually converted to an LFS pointer.
|
|
111
|
+
verdict = run("attribute-without-conversion")
|
|
112
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
113
|
+
assert verdict.rules == ["LFS-002"]
|
|
114
|
+
assert verdict.findings[0].path == "large file.bin"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_a_correctly_tracked_lfs_pointer_and_a_small_file_both_stay_silent() -> None:
|
|
118
|
+
# test.sh: the renormalized pointer passes at both pre-commit and
|
|
119
|
+
# qua_deploy, and `small.txt` is silent throughout — three assertions,
|
|
120
|
+
# one fixture, per this test module's own docstring.
|
|
121
|
+
verdict = run("clean")
|
|
122
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
123
|
+
assert verdict.findings == ()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_a_large_ordinary_blob_of_an_unmatched_extension_is_reported() -> None:
|
|
127
|
+
# test.sh: "qua_deploy sees a large ordinary blob in HEAD" — .gitattributes
|
|
128
|
+
# matches `*.bin` only, so `payload.dat` is committed as an ordinary
|
|
129
|
+
# object and must still be reported.
|
|
130
|
+
verdict = run("unmatched-extension")
|
|
131
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
132
|
+
assert verdict.rules == ["LFS-002"]
|
|
133
|
+
assert verdict.findings[0].path == "payload.dat"
|
package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""pipeline."""
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""The `pipeline.phase-disjoint` gate.
|
|
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.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .check import PhaseDisjoint
|
|
11
|
+
|
|
12
|
+
__all__ = ["PhaseDisjoint"]
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""PIP-004 — ported from
|
|
2
|
+
`compliance_new/checks/pipeline/phase-disjoint/check.sh` (rule id `MET-001`).
|
|
3
|
+
|
|
4
|
+
No gate registry row may run in two mutually exclusive phases:
|
|
5
|
+
|
|
6
|
+
1. never both pre-commit and pre-push
|
|
7
|
+
2. never both pr_validation and qua_deploy
|
|
8
|
+
|
|
9
|
+
Entirely `structural`: the registry is a NAMED INPUT (`Check.inputs`, resolved
|
|
10
|
+
by the runner into `ctx.inputs["registry"]`) and every row it grades is inside
|
|
11
|
+
that one document, so there is nothing in `graded` for this gate to read — the
|
|
12
|
+
shell version's own comment says as much: it takes no arguments and holds no
|
|
13
|
+
root variable, and finds the registry structurally from its own position in
|
|
14
|
+
the package.
|
|
15
|
+
|
|
16
|
+
`PhaseRow` and `PhaseRegistry` are `OpenModel`, not `StrictModel`. The real
|
|
17
|
+
`policy/gate-registry.yaml` carries `name`, `domain`, `title`, `severity`,
|
|
18
|
+
`controls`, `engine`, `test`, `grants`, `timeout_ms` on every row — none of
|
|
19
|
+
which is this gate's business. `extra="forbid"` here would make this gate
|
|
20
|
+
refuse to run against the real registry on every single invocation, exactly
|
|
21
|
+
the trap `contracts.transport-boundaries`' own docstring names for its input.
|
|
22
|
+
|
|
23
|
+
A missing registry or one that decodes to zero rows is `CouldNotRun` here,
|
|
24
|
+
exactly as the shell version treats them (exit 2 in both cases) — never a
|
|
25
|
+
`MET-001` finding. The shell script asserts its row count before the verdict
|
|
26
|
+
for the same reason `contracts.transport-boundaries` asserts a non-empty
|
|
27
|
+
`boundaries` list: an empty decode and a clean estate are the same exit code
|
|
28
|
+
otherwise, and the empty one is a broken gate reporting success.
|
|
29
|
+
|
|
30
|
+
**A field this repository's schema does not carry.** Neither the currently
|
|
31
|
+
shipped shell registry (`compliance_new/policy/gate-registry.yaml`) nor this
|
|
32
|
+
package's own (`policy/gate-registry.yaml`, whose `Row` model in
|
|
33
|
+
`policy/registry.py` declares exactly `id · name · domain · title · severity ·
|
|
34
|
+
controls · engine · test · grants · timeout_ms`, closed by K-09) has a single
|
|
35
|
+
row carrying `phases:` today — the scheduling model this gate grades was
|
|
36
|
+
already retired in favour of `engine.scope`-based triggering before this row
|
|
37
|
+
was ported (see `compliance_new/AGENTS.md`, "A phase is not this tree's word",
|
|
38
|
+
and this package's own K-43, "No phase here"). This gate is ported faithfully
|
|
39
|
+
regardless, exactly as `check.sh` specifies it, because retiring a rule is a
|
|
40
|
+
decision for whoever owns the registry row, not something a port silently
|
|
41
|
+
does on its behalf — see this check's own `test_check.py` and this file's
|
|
42
|
+
folder-level notes for what that means for a real run against either registry.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
from __future__ import annotations
|
|
46
|
+
|
|
47
|
+
from collections.abc import Iterable
|
|
48
|
+
from typing import Annotated, ClassVar
|
|
49
|
+
|
|
50
|
+
import yaml
|
|
51
|
+
from pydantic import Field, ValidationError
|
|
52
|
+
|
|
53
|
+
from ....core.check import Check
|
|
54
|
+
from ....core.context import Context
|
|
55
|
+
from ....core.errors import CouldNotRun
|
|
56
|
+
from ....core.finding import Report
|
|
57
|
+
from ....core.models import OpenModel
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PhaseRow(OpenModel):
|
|
61
|
+
"""One row of the gate registry, projected to just what MET-001 grades."""
|
|
62
|
+
|
|
63
|
+
id: str
|
|
64
|
+
phases: Annotated[tuple[str, ...], Field(strict=False)] = ()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class PhaseRegistry(OpenModel):
|
|
68
|
+
"""Open: the real document also carries `schema` at the top level."""
|
|
69
|
+
|
|
70
|
+
rows: Annotated[tuple[PhaseRow, ...], Field(strict=False)] = ()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class PhaseDisjoint(Check):
|
|
74
|
+
id: ClassVar[str] = "PIP-004"
|
|
75
|
+
rule: ClassVar[str] = "MET-001"
|
|
76
|
+
|
|
77
|
+
inputs: ClassVar[dict[str, str]] = {
|
|
78
|
+
"registry": "<compliance>/policy/gate-registry.yaml",
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
PRE_COMMIT: ClassVar[str] = "pre-commit"
|
|
82
|
+
PRE_PUSH: ClassVar[str] = "pre-push"
|
|
83
|
+
PR_VALIDATION: ClassVar[str] = "pr_validation"
|
|
84
|
+
QUA_DEPLOY: ClassVar[str] = "qua_deploy"
|
|
85
|
+
|
|
86
|
+
def structural(self, ctx: Context) -> Iterable[Report]:
|
|
87
|
+
registry_path = ctx.inputs["registry"]
|
|
88
|
+
shown = ctx.relative(registry_path)
|
|
89
|
+
|
|
90
|
+
body = self.text(ctx, registry_path)
|
|
91
|
+
if body is None:
|
|
92
|
+
raise CouldNotRun(f"missing input: {shown}")
|
|
93
|
+
|
|
94
|
+
registry = self._load_registry(body, shown)
|
|
95
|
+
if not registry.rows:
|
|
96
|
+
raise CouldNotRun(f"{shown} decoded zero rows")
|
|
97
|
+
|
|
98
|
+
for row in registry.rows:
|
|
99
|
+
phases = set(row.phases)
|
|
100
|
+
|
|
101
|
+
if self.PRE_COMMIT in phases and self.PRE_PUSH in phases:
|
|
102
|
+
yield self.report(
|
|
103
|
+
shown,
|
|
104
|
+
f"{row.id} runs at both {self.PRE_COMMIT} and {self.PRE_PUSH}",
|
|
105
|
+
f"drop one of {self.PRE_COMMIT} or {self.PRE_PUSH} from "
|
|
106
|
+
f"{row.id}'s phases in {shown}",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
if self.PR_VALIDATION in phases and self.QUA_DEPLOY in phases:
|
|
110
|
+
yield self.report(
|
|
111
|
+
shown,
|
|
112
|
+
f"{row.id} runs at both {self.PR_VALIDATION} and {self.QUA_DEPLOY}",
|
|
113
|
+
f"drop one of {self.PR_VALIDATION} or {self.QUA_DEPLOY} from "
|
|
114
|
+
f"{row.id}'s phases in {shown}",
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# -------------------------------------------------------------- the registry
|
|
118
|
+
|
|
119
|
+
def _load_registry(self, body: str, shown: str) -> PhaseRegistry:
|
|
120
|
+
try:
|
|
121
|
+
loaded = yaml.safe_load(body)
|
|
122
|
+
except yaml.YAMLError as exc:
|
|
123
|
+
raise CouldNotRun(f"could not read .rows from {shown}: {exc}") from exc
|
|
124
|
+
if not isinstance(loaded, dict):
|
|
125
|
+
raise CouldNotRun(f"could not read .rows from {shown}: not a mapping")
|
|
126
|
+
try:
|
|
127
|
+
return PhaseRegistry.model_validate(loaded)
|
|
128
|
+
except ValidationError as exc:
|
|
129
|
+
raise CouldNotRun(f"could not read .rows from {shown}: {exc}") from exc
|