Commit Graph
606 Commits
Author SHA1 Message Date
Environment TestandClaude Opus 4.6 e2dbbceb6a chore(sandbox): add cross-distro installer for bwrap/socat via make agent-install
Adds scripts/install/sandbox.sh, a distro-aware installer for the OS-level
dependencies the Claude Code sandbox backend needs (bubblewrap, socat),
and exposes it through a new `make agent-install` target. Documents the
target in docs/contributing/tools/make.md, scripts/install/README.md, and
the Claude sandbox guide so contributors on a fresh host can bring up a
working sandbox without hand-installing distro packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 18:06:57 +02:00
Environment TestandClaude Opus 4.6 65cf9caff7 chore(claude): restructure agent docs, harden sandbox config, update settings
- Move docs/contributing/tools/agents/claude.md to claude/settings.md
- Split sandbox explanations into claude/sandbox.md, add claude/README.md as index
- Enable OS-level sandbox ("sandbox.enabled: true") for project-wide filesystem isolation
- Fail-closed on missing backend ("sandbox.failIfUnavailable: true") to prevent false-security state when bwrap/sandbox-exec is absent
- Add deny rules: "git clean*", "git branch -D*"
- Remove redundant "Read(~/.cache/pre-commit/**)" allow entry
- Update CLAUDE.md to instruct agent to summarize live permission state from settings.json at session start
- Update AGENTS.md and common.md references to new doc paths
- Normalize .md formatting per documentation.md rules (em dash removal, headline emojis)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 16:55:45 +02:00
kevinveenbirkenbach cdcf431b40 Merge pull request #146 from infinito-nexus/dependabot/npm_and_yarn/roles/test-e2e-playwright/files/playwright/test-1.59.1
build(deps-dev): bump @playwright/test from 1.58.2 to 1.59.1 in /roles/test-e2e-playwright/files
2026-04-16 16:52:09 +02:00
Environment TestandClaude Opus 4.6 118d9b0e69 chore(claude): tighten gh workflow perms, consolidate /tmp grant, sort settings
- Split Bash(gh workflow *) into list/view (allow), run (ask), enable/disable (deny)
- Add Bash(break) to allow list
- Remove duplicate /tmp grant from permissions.additionalDirectories; rely on sandbox.filesystem.allowWrite
- Add AGENTS.md "Temporary Files" rule requiring agents to write transient files only under /tmp
- Reorder .claude/settings.json allow entries into logical sections (Git, GitHub CLI, Build, Python, Ansible, Docker, Shell, Read, Web)
- Document new gh workflow entries, break, and Temporary Files cross-link in docs/contributing/tools/agents/claude.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 16:10:39 +02:00
Environment Test dfa8cd99bb Merge branch 'main' into fix/free-disk-space/138 2026-04-16 14:00:27 +02:00
kevinveenbirkenbachandClaude Opus 4.6 d6487a7457 chore(claude): allow echo in Bash permissions
Split compound commands like `ls ... || echo ...` need `echo*` to match
the right-hand subcommand without approval prompts. Documented in
docs/contributing/tools/agents/claude.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 12:28:43 +02:00
kevinveenbirkenbach 34ddc4d2d2 Merge branch 'main' into fix/users-applications.yml
# Conflicts:
#	group_vars/all/00_general.yml
#	roles/web-app-dashboard/templates/playwright.env.j2
#	roles/web-app-nextcloud/config/main.yml
#	roles/web-app-nextcloud/templates/playwright.env.j2
2026-04-16 11:54:20 +02:00
kevinveenbirkenbach 1f017c94e4 Merge branch 'main' into fix/users-applications.yml 2026-04-16 11:16:21 +02:00
Environment TestandClaude Opus 4.6 27565e4332 chore(claude): allow direct script exec and chmod under scripts/
Adds `Bash(scripts/*)` so repository helper scripts can be invoked
directly by path (shebang-based), required by inner-loop workflows
such as the Playwright spec rerunner. Adds `Bash(chmod +x scripts/*)`
so newly added scripts can be made executable without approval prompts.

Documents both entries in docs/contributing/tools/agents/claude.md
next to the existing `bash scripts/*` and `source scripts/*` rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 00:24:55 +02:00
Environment TestandClaude Opus 4.6 31620bd827 chore(claude): allow pkill -f and pre-commit cache reads
Adds `Bash(pkill -f *)` to the allowlist so stuck background commands
(pre-commit hooks, `make test`, `git commit`) can be aborted without an
approval prompt. Broad wildcard consciously accepted — narrow per-pattern
entries required repeated allowlist edits for every new abort scenario.

Adds `Read(~/.cache/pre-commit/**)` so pre-commit's stashed patch files
can be reapplied via `git apply` after a manually killed hook run, and
uses `~` instead of a hardcoded username path.

Documents both entries in docs/contributing/tools/agents/claude.md,
including the explicit risk note that `pkill -f` with a regex can
terminate every user-owned process and should use the narrowest pattern
possible.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 00:24:55 +02:00
Environment TestandClaude Opus 4.6 7c9b9c7922 chore(claude): generalize awk permission, drop stale entries
Replaces two over-specific `Bash(awk ...)` allowlist entries (full paths
and exact patterns that would never match again) with a single
`Bash(awk*)` entry next to `jq*`, consistent with how `grep*`, `find*`,
and `sort*` are allowed. Removes the broken `Read(//var/lib/infinito/logs/**)`
entry: `/var/lib/infinito/` is a named Docker volume defined in
compose.yml and never exists on the host, so host-scoped read access
is meaningless (and the path had a double slash).

Documents the new `awk*` entry in docs/contributing/tools/agents/claude.md
with an explicit note that awk's `system()` and `"cmd" | getline` put
it in the same risk class as the already-allowed `find -exec`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 00:24:54 +02:00
Environment TestandClaude Opus 4.6 d6ca27d638 chore(claude): allow scripts/ source+bash, prefer make targets
Adds `Bash(bash scripts/*)` and `Bash(source scripts/*)` to the Claude
Code allowlist so repository helper scripts (e.g. env exports in
scripts/meta/env) can run without approval prompts, while still keeping
arbitrary paths scoped to review.

Documents both permissions in docs/contributing/tools/agents/claude.md,
including the caveat that `source` bypasses the allowlist for nested
commands.

Extends CLAUDE.md with an explicit rule that agents MUST prefer `make`
targets over direct docker/ansible/python/script invocations whenever
an equivalent target exists.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 00:24:54 +02:00
kevinveenbirkenbach 262e1b43fc Merge branch 'main' into fix/users-applications.yml
# Conflicts:
#	docs/contributing/design/services.md
#	plugins/lookup/applications_current_play.py
#	plugins/lookup/service.py
#	roles/sys-stk-backend/lookup_plugins/service_should_load.py
#	roles/sys-stk-backend/tasks/_load_service.yml
#	roles/sys-stk-backend/vars/main.yml
#	roles/sys-svc-compose/templates/base.yml.j2
#	roles/sys-svc-mail/tasks/01_core.yml
#	roles/sys-utils-service-loader/tasks/load_frontend_service.yml
#	tests/unit/plugins/lookup/test_applications_current_play.py
#	tests/unit/plugins/lookup/test_service.py
#	tests/unit/roles/sys-stk-backend/lookup_plugins/test_service_should_load.py
2026-04-15 23:59:54 +02:00
kevinveenbirkenbachandClaude Opus 4.6 b70a783423 refactor(lookups): migrate to runtime applications/users lookups
Replaces inline `applications`/`users` merging with dedicated lookup
plugins and runtime hydration. Introduces `add_csp_hash` filter,
integrates sort into `find_dock_val_by_bkp_entr`, splits the Keycloak
one-shot realm import into `05a_realm_import_run.yml`, and fixes the
Mastodon administrator task YAML. Removes obsolete `csp_hashes` filter,
`sys-token-store` Jinja filter, and empty CLI setup modules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 23:44:19 +02:00
Environment TestandClaude Opus 4.6 176340db3b chore(claude): allow direct script exec and chmod under scripts/
Adds `Bash(scripts/*)` so repository helper scripts can be invoked
directly by path (shebang-based), required by inner-loop workflows
such as the Playwright spec rerunner. Adds `Bash(chmod +x scripts/*)`
so newly added scripts can be made executable without approval prompts.

Documents both entries in docs/contributing/tools/agents/claude.md
next to the existing `bash scripts/*` and `source scripts/*` rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 22:39:58 +02:00
Environment TestandClaude Opus 4.6 63c42154d2 chore(claude): allow pkill -f and pre-commit cache reads
Adds `Bash(pkill -f *)` to the allowlist so stuck background commands
(pre-commit hooks, `make test`, `git commit`) can be aborted without an
approval prompt. Broad wildcard consciously accepted — narrow per-pattern
entries required repeated allowlist edits for every new abort scenario.

Adds `Read(~/.cache/pre-commit/**)` so pre-commit's stashed patch files
can be reapplied via `git apply` after a manually killed hook run, and
uses `~` instead of a hardcoded username path.

Documents both entries in docs/contributing/tools/agents/claude.md,
including the explicit risk note that `pkill -f` with a regex can
terminate every user-owned process and should use the narrowest pattern
possible.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 17:20:44 +02:00
Environment TestandClaude Opus 4.6 7584380573 chore(claude): generalize awk permission, drop stale entries
Replaces two over-specific `Bash(awk ...)` allowlist entries (full paths
and exact patterns that would never match again) with a single
`Bash(awk*)` entry next to `jq*`, consistent with how `grep*`, `find*`,
and `sort*` are allowed. Removes the broken `Read(//var/lib/infinito/logs/**)`
entry: `/var/lib/infinito/` is a named Docker volume defined in
compose.yml and never exists on the host, so host-scoped read access
is meaningless (and the path had a double slash).

Documents the new `awk*` entry in docs/contributing/tools/agents/claude.md
with an explicit note that awk's `system()` and `"cmd" | getline` put
it in the same risk class as the already-allowed `find -exec`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 16:42:40 +02:00
Environment TestandClaude Opus 4.6 a2275e6991 docs(make): pass variables after target to match Bash(make*) permission
Reorders all documented and scripted `make` invocations from the
`VAR=value make target` shell-env prefix form to the make-native
`make target VAR=value` form. GNU Make auto-exports both command-line
and inherited shell-env variables to recipe shells, so the change is
purely about command-line shape: only the make-suffix form starts with
`make` and is therefore matched by the `Bash(make*)` permission entry
in .claude/settings.json, avoiding unnecessary approval prompts for
agent runs.

Adds an explicit CLAUDE.md rule with ✅/❌ examples and the underlying
reason (permission prefix match, not Makefile semantics).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:28:44 +02:00
Environment TestandClaude Opus 4.6 8e57ab3ec8 chore(claude): allow scripts/ source+bash, prefer make targets
Adds `Bash(bash scripts/*)` and `Bash(source scripts/*)` to the Claude
Code allowlist so repository helper scripts (e.g. env exports in
scripts/meta/env) can run without approval prompts, while still keeping
arbitrary paths scoped to review.

Documents both permissions in docs/contributing/tools/agents/claude.md,
including the caveat that `source` bypasses the allowlist for nested
commands.

Extends CLAUDE.md with an explicit rule that agents MUST prefer `make`
targets over direct docker/ansible/python/script invocations whenever
an equivalent target exists.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 11:38:03 +02:00
kevinveenbirkenbach e9f95318e7 Merge branch 'infinito-nexus:main' into fix/nextcloud-talk 2026-04-15 01:46:38 +02:00
kevinveenbirkenbach 4d22ff74e3 Merge branch 'main' into feature/service-refactoring 2026-04-15 01:44:17 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 2309ba8e11 chore(claude): allow Bash(wait*) for background task synchronization
Adds the shell built-in `wait` to the Claude Code allow-list so the agent
can block on background commands started via run_in_background without
prompting for operator approval. Documents the new entry in the Claude
Code settings reference.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 23:12:32 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 3b19a92390 chore(claude): allow Bash(wait*) for background task synchronization
Adds the shell built-in `wait` to the Claude Code allow-list so the agent
can block on background commands started via run_in_background without
prompting for operator approval. Documents the new entry in the Claude
Code settings reference.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 23:11:54 +02:00
kevinveenbirkenbach 5f5d79f111 Merge branch 'main' into fix/nextcloud-talk 2026-04-14 21:01:15 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 0fe7c5fd6f docs(claude): document settings permissions and restructure agent docs
- Extend .claude/settings.json with git mv, rm, cherry-pick, apply, gh run, gh api, bash -n
- Add make chmod-scripts target and document it in make.md
- Move docs/contributing/tools/agents.md to agents/common.md
- Add docs/contributing/tools/agents/README.md and claude.md with full permission reference in table format
- Fix relative links in common.md after directory move

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 20:56:37 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 28e5ed4a1b docs(claude): document settings permissions and restructure agent docs
- Extend .claude/settings.json with git mv, rm, cherry-pick, apply, gh run, gh api, bash -n
- Add make chmod-scripts target and document it in make.md
- Move docs/contributing/tools/agents.md to agents/common.md
- Add docs/contributing/tools/agents/README.md and claude.md with full permission reference in table format
- Fix relative links in common.md after directory move

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 20:48:52 +02:00
kevinveenbirkenbach 3f626a71c1 Merge branch 'main' into feature/service-refactoring 2026-04-14 17:05:51 +02:00
Environment Test 1d99fa4e24 Merge branch 'main' into fix/nextcloud-talk 2026-04-14 02:41:54 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 5cebe3ea63 feat(ci): add CI_CANCEL_IN_PROGRESS variable and restructure branch docs
- Use vars.CI_CANCEL_IN_PROGRESS in entry-push-latest.yml so cancellation
  can be disabled per-repo without changing workflow code
- Move docs/contributing/tools/github/branch.md into branch/ subdirectory
  as security.md; add configuration.md for CI repository variables and
  README.md as directory index
- Fix all cross-references in SECURITY.md, pipeline.md, branch.md,
  pull-request.md, workflow.md, and repository.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 22:18:02 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 1bcb7cfbb0 Merge branch 'main' into feature/service-refactoring
Resolve conflicts:
- docs/agents/action/iteration.md: keep both new bullets (SERVICES_DISABLED
  proposal + make test requirement)
- docs/contributing/design/services.md: deleted (renamed to
  docs/contributing/code/services.md in this branch)
- group_vars/all/20_services.yml: keep deletion from this branch (req-001)
- tests/lint/ansible/roles/test_service_core_first_task_run_once.py:
  use build_service_registry_from_roles_dir (req-001) with repo_root()
  from main for robust path resolution

Fix broken relative links caused by rename and deletion of files:
- docs/contributing/design/architecture.md: services.md → ../code/services.md
- docs/contributing/design/exceptions.md: load_frontend_service.yml →
  load_service.yml
- docs/requirements/001-service-registry-refactoring.md: fix paths for
  unit.md, integration.md, principles.md, documentation.md, AGENTS.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 19:58:51 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 be6a310d59 refactor(services): implement role-local service registry (req-001)
- Delete group_vars/all/20_services.yml; all service metadata now lives
  in each role's config/main.yml under compose.services.<name>
- Rename generic 'database' service key to explicit 'mariadb'/'postgres'
  across all app roles; remove legacy type: field
- Add utils/service_registry.py and plugins/lookup/service_registry.py
  as the single source of truth for service discovery
- Add utils/database_service.py to centralize DB service resolution
- Delete service_load_enabled filter and service_should_load lookup;
  replaced by service lookup plugin
- Update sys-utils-service-loader to run in constructor stage and use
  generic load_service.yml; remove load_frontend_service.yml
- Add _service_loader_preloading guard to sys-svc-compose,
  sys-svc-webserver-core and sys-ctl-alm-compose to prevent
  health-checks/alarms from firing during preload phase
- Replace manual load_app.yml calls for shared DB/Mailu with assert-
  based preload validation in sys-svc-rdbms and sys-svc-mail
- Update networks.yml.j2 templates to resolve LDAP/AI networks via
  service_registry instead of hardcoded role names
- Migrate all tests to new service discovery API; delete obsolete tests
- Update docs/contributing/code/services.md to reflect role-local model

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 19:33:20 +02:00
Environment Test fabd7530e0 Merge branch 'main' into fix/nextcloud-talk 2026-04-13 13:32:50 +02:00
Environment Test 835b150d2d ci(deploy): restrict free-disk-space to safe options only
large-packages, docker-images and swap-storage can remove build
deps, cached layers and swap needed by memory-intensive services
(e.g. Keycloak 503 under memory pressure). Only android/dotnet/
haskell are guaranteed unused on deploy runners.

Rationale linked from each step comment and documented in
docs/contributing/artefact/files/github/workflow.md.
2026-04-13 13:13:16 +02:00
Environment Test 32ba0f1cea Merge branch 'main' into fix/free-disk-space/138 2026-04-13 12:54:37 +02:00
Environment TestandClaude Sonnet 4.6 8946ea0461 docs(principles): add YAGNI to code design principles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:52:11 +02:00
Environment TestandClaude Sonnet 4.6 5c59fe23dd docs(principles): add YAGNI to code design principles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:51:23 +02:00
Environment TestandClaude Sonnet 4.6 8998b0b318 fix(docs): fix broken relative links in organisation/communication.md
File moved one level deeper — update SECURITY.md and CODE_OF_CONDUCT.md
paths from ../../ to ../../../.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:21:38 +02:00
Environment TestandClaude Sonnet 4.6 6d1f7781c1 docs(contributing): add organisation dir and split principles
Move Agile Manifesto principles out of design/principles.md into a
dedicated organisation/principles.md so code and process concerns live
in separate files. Move communication.md into the same directory for
consistency. Add SRP to design/principles.md. Add cross-references
between the two principles files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:32:44 +02:00
Environment TestandClaude Sonnet 4.6 7fa51003a9 docs(contributing): add organisation dir and split principles
Move Agile Manifesto principles out of design/principles.md into a
dedicated organisation/principles.md so code and process concerns live
in separate files. Move communication.md into the same directory for
consistency. Add SRP to design/principles.md. Add cross-references
between the two principles files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:31:42 +02:00
Environment Test ce000094b1 Merge branch 'main' into fix/free-disk-space/138
# Conflicts:
#	docs/contributing/artefact/git/branch.md
#	scripts/meta/resolve/pr/branch_prefix.sh
2026-04-11 14:33:11 +02:00
Environment Test 745ae310e2 fix(ci): allow update branch prefix 2026-04-11 14:29:32 +02:00
Environment Test 1b6ca9d073 docs(ci): explain GHCR mirroring flow 2026-04-11 13:40:02 +02:00
Environment TestandClaude Sonnet 4.6 afd332bb4e feat(ci): trigger orchestrator on alert-autofix-* branches
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 07:41:48 +02:00
Environment TestandClaude Sonnet 4.6 c2fcc58259 fix(urls): suppress unreachable URLs, fix dead links, and correct Matrix spec paths
- Add `# nocheck: url` / `<!-- nocheck: url -->` above-line suppression support
- Fix Matrix mautrix templates: desktop-server-api → client-server-api
- Fix Mobilizon geospatial URLs (Addok, Photon) with above-line nocheck
- Add nocheck markers for BigBlueButton, Fider, Magento, Matomo, OnlyOffice
- Fix dead Retroarch, AUR, base-devel, and BigBlueButton Greenlight links
- Remove unresolvable WireGuard link; add nocheck for Wikipedia connection resets
- Remove unit tests for integration test logic (test_external_url_reachability.py)
- Document rule: MUST NOT write unit tests for integration test logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 01:26:31 +02:00
Environment TestandClaude Sonnet 4.6 750c110f45 fix(docs): apply documentation rules, fix URLs, and remove orphaned references
- Apply documentation.md rules across staged files (emojis after headlines, RFC 2119 keywords, correct link text, Credits format)
- Remove expired ChatGPT share URLs from 39+ role READMEs and templates
- Remove orphaned text after link deletion: bare # @see, {# @see  #}, Discussion: #}, empty Chat Conversation sections, dangling "Conversation is here available.", "Refer to the conversation with ChatGPT ()", "See ChatGPT Conversation", "ChatGPT Session Transcript" references
- Remove empty ## Further Resources and ## Credits sections where no links remain
- Fix URL reachability test: treat 401/403/405 as ok, 429/500/503 as warn, Timeout as warn; add # nocheck: url suppression (inline and line-above)
- Add lint test for broken relative and repo-root-absolute markdown links
- Add # nocheck: url to AUR git clone URLs, CSP allowlist entries, and other non-browser URLs
- Restore docs.infinito.nexus/setup in documentation.md MUST NOT example
- Fix Mobilizon geospatial endpoints (Addok, Photon) reverted to original values with # nocheck: url
- Add integration test rule: MUST NOT write unit tests for integration test logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:38:42 +02:00
Environment TestandClaude Sonnet 4.6 2b90239282 test(external): fail on client/server errors instead of warning for dead links
Change the URL reachability test to fail on 4xx, non-500 5xx, and
request errors (DNS, connection). Only HTTP 500 now emits a warning
annotation, distinguishing temporary upstream breakage from dead links.
Add a unit test for the probe classification logic.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 23:23:43 +02:00
Environment Test 78a69130c9 test(external): add live url reachability scan 2026-04-10 23:01:25 +02:00
Environment Test 51341629d6 docs(external): clarify suite behavior 2026-04-10 22:42:23 +02:00
Environment Test 212cc39052 test(external): split live registry checks
Keep live registry lookups out of the default make test flow.

Add a dedicated external suite, workflow, and docs so the check stays opt-in but still gates code CI when enabled.
2026-04-10 22:31:42 +02:00
Environment TestandClaude Sonnet 4.6 0b8e16a45d test(lint): add markdown link checker and fix all broken links
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>
2026-04-10 22:00:46 +02:00