This file applies to the repository root.
These instructions are mandatory for AI agents editing files in this
repository. Also follow ~/AGENTS.md for user-wide policy.
Whenever an agent creates, edits, renames, or deletes a file, it must run the relevant linter for that file type before finishing.
If multiple file types are changed, run all corresponding linters.
Applies to:
*.sh- shell scripts with shebangs (
#!/bin/bash,#!/usr/bin/env bash, etc.)
Required:
shellcheck --enable=all <file>
Applies to:
*.yml*.yaml
Required:
yamllint <file>
Applies to:
defaults/**/*.ymldefaults/**/*.yamlmeta/**/*.ymlmeta/**/*.yamlhandlers/**/*.ymlhandlers/**/*.yamltasks/**/*.ymltasks/**/*.yamltests/**/*.ymltests/**/*.yaml- any Ansible playbooks, task files, vars files, or metadata in this role repo
Required:
ws ansible lintyamllint <file>
Agents must run ws ansible lint every time an Ansible file is created or
modified, including files under tests/, even if other repo-wide lint commands
already pass. Do not run ansible-lint directly from the host machine for this
repository.
Applies to:
*.md
Required:
markdownlint -c ~/.markdownlint.json <file>
Applies to:
Jenkinsfile
Required:
ws lint-jenkinsfile
Agents must run ws lint-jenkinsfile every time Jenkinsfile is created or
modified.
- Lint after each meaningful change set and before final handoff.
- Do not skip linting because a change is small.
- Every newly created or modified Ansible file must be validated with
ws ansible lintbefore finishing the task. - If a linter is unavailable, report it clearly and provide the exact install command.
- Prefer targeted linting for changed files, then run broader linting if needed.
- Fix lint errors introduced by the change.
- Lint issues must be resolved in code or content; do not silence, suppress, or bypass rules unless an explicit, documented exception is approved.
- For shell scripts, always run
shellcheck --enable=alland treat reported findings, including info-level checks, as actionable. - Do not embed Python scripts or snippets inside Bash scripts or Bash command strings. If the task is assigned to Bash, implement it in Bash.
- Shell automation must remain compatible with both macOS and Linux Bash. Avoid GNU-only flags or syntax and avoid adding dependencies on non-native shell tools unless the dependency is already an explicit, documented project requirement.
- Do not commit user-specific absolute filesystem paths. Use
repository-relative paths, and use
~only when a home-relative path is genuinely required. - Workspace commands invoked by Jenkins must keep project toolchain binaries
inside the Workspace
consolecontainer. Jenkins agents should not need host-level Ansible, Galaxy, GitHub helper, JSON, or HTTP client CLIs beyond the documented Jenkins prerequisites. ws consoleis the intended boundary for forwarding Workspace and Jenkins credential values into theconsolecontainer. Keep credential forwarding centralized there withdocker compose exec -e, and do not pass release, Galaxy, or GitHub tokens as command-line arguments to helpers.- Jenkins operator choices must remain per-build controls, not fixed credential-style environment values. Keep release version selection and GitHub/Galaxy publication gates as build parameters or an equivalent explicit Jenkins input surface.
- Keep tracked override examples inert by default. Optional release and publication tokens must stay blank unless the operator explicitly configures real values locally or in Jenkins.
- Workspace helper commands that wrap nested
ws,docker,gh,ansible-galaxy, or other readiness checks must propagate child exit statuses withpassthruor explicit return-code handling. Token-required checks must fail clearly before calling external CLIs when the token is missing.
- Whenever code or behavior is changed, update
CHANGELOG.mdin the same task. - Whenever documentation is added or updated, mention it in
CHANGELOG.mdin the same task. - Add new work under an
Unreleasedsection unless a release is being finalized, or the branch is a pre-PR release-prep branch whose changelog already uses the latest concrete release section as the pending PR body. - Do not assign or change a release date for an unreleased section unless requested by the user or the change is part of release finalization.
- Only create or date a release entry when the release is actually being finalized.
- Concrete release headings must use a plain
YYYY-MM-DDdate with no suffixes. - Group entries under clear headings and keep wording concise.
- Whenever repository documentation is added, renamed, moved, or deleted,
update the root
README.mdin the same task. - Keep the
README.mdtable of contents aligned with the current document structure and available repository guidance. - Keep the
README.mdmaintainer, support, publication, inspiration, and installation details aligned with the current repository state.
- Shell:
shellcheck --enable=all path/to/file.sh - YAML:
yamllint path/to/file.yml - Ansible:
ws ansible lint - Jenkinsfile:
ws lint-jenkinsfile - Markdown:
markdownlint -c ~/.markdownlint.json AGENTS.md README.md CHANGELOG.md TODO.md docs/*.md tests/README.md
- This policy is strict by default.
- This role installs the operating-system ACL package and validates the local ACL command-line tools.
- The default validation path is local Docker through Workspace. Do not add cloud provider resources unless the role grows behavior that genuinely requires end-to-end cloud validation.
- Any exception must be explicitly documented in the task output with reason.