Add tests/lint/repository/test_markdown_links.py — a hard-fail lint
test that scans all git-tracked markdown files for broken relative and
repo-root-absolute links. Skips external URLs, anchor-only links, fenced
code blocks, and placeholder targets.
Apply documentation.md rules to all staged files: add emojis after
headlines in docs files, remove emojis from role README headings,
standardize Credits sections to the canonical format, remove empty
sections and orphaned sentences referring to missing documentation files,
fix raw URLs and incorrect link text across role READMEs and docs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rename artefact/image.md to artefact/image/origin.md and merge code/role/image.md into it
- Move artefact/mirror.md to artefact/image/mirror.md
- Move docs/contributing/code/role/ to docs/contributing/artefact/files/role/
- Rename readme_base.md to readme_md.md
- Apply documentation.md standards (emojis, RFC 2119, link text) to all modified files
- Fix all cross-references broken by the directory restructuring
- Remove publish section from mirror.md (module deleted in prior commit)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move iter_role_images + all helpers + ImageRef from cli/mirror/util.py and
cli/mirror/model.py into utils/docker/image_discovery.py; add source_file field
to ImageRef to distinguish config/main.yml vs vars/main.yml entries
- Delete cli/mirror/util.py; update all callers to import from utils.docker.image_discovery
- Move utils into subpackages: utils/docker/ (image_ref, paths_utils, hadolint) and
utils/roles/ (dependency_resolver, resource_validation); update all imports
- Reorganise tests into subpackages: tests/lint/docker/dockerfile/, tests/integration/docker/,
tests/unit/utils/docker/, tests/unit/utils/roles/; fix parents[N] offsets after relocation
- tests/lint/docker/test_image_versions.py now uses iter_role_images (same SPOT as mirror)
- Add vars/main.yml images.<name>.{image,version} support for non-application roles
(test-e2e-playwright, sys-ctl-hlth-csp); eliminate hardcoded duplicates in defaults/tasks
- Add web-app-matrix matrix-chatgpt-bot and web-app-mini-qr mini-qr entries in config/main.yml;
replace hardcoded image strings in vars/templates with lookup('config', ...) references
- Fix sync/__main__.py log line to use correct registry prefix for non-Docker-Hub images
- Update docs/contributing/code/role/dockerfile.md with image declaration rules and SPOT reference
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Transient issues (DNS timeout, slow CI runner) no longer cause immediate
failure — each test gets up to 2 retries before being marked as failed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Accept 1xx/2xx/3xx (status < 400) instead of only [200, 302] so that apps
returning 301 (e.g. simpleicons redirecting to sphinx docs) are correctly
recognised as ready. Also set follow_redirects=none so the wait checks the
app itself rather than its redirect target.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extend root AGENTS.md with a convention for per-role agent instruction
files, and introduce the first instance for the shared Playwright runner
to enforce minimal, confirmed changes only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Increase global test timeout from 60s to 300s; the OIDC login flow
alone can consume the full 60s budget, causing timeouts in subsequent
wait steps (waitForVisibleCandidate at line 171 in the CI logs)
- Replace non-existent NC 30+ selectors verified against the actual
nextcloud:production-fpm-alpine image:
- remove [aria-controls="header-menu-user-menu"] (not in NC 30+)
- remove settingsMenuButton role "Settings menu" (not confirmed)
- replace #content-vue / #appmenu with #header-start__appmenu
(layout.user.php uses <nav id="header-start__appmenu">)
- remove #logout (no such ID in layout.user.php)
- Dismiss the firstrunwizard modal before clicking the user menu:
firstrunwizard-activate.mjs opens a NcModal after DOMContentLoaded
on first login; its .modal-mask intercepts all clicks and would
cause the user-menu click to fail silently on first login
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>