- Replace `command -v` with `ansible.builtin.stat` for verifying backup tool existence to improve idempotency and error handling
- Update `docker-postgres-dump` condition to `docker-postgres-backup` for consistency
- Correct `docker-volume` condition to `docker-volume-backup` in volume backup tasks
- Add Odoo backup task inclusion in `roles/odoo/tasks/odoo.yml` to integrate with the unified restic backup mechanism
- Standardize variable registration and failure conditions across all backup verification tasks
- Replace `sed`-based hostname extraction with `grep -oE` to accurately isolate numeric suffixes
- Ensure consistent variable quoting in loops and `printf` commands to prevent word splitting
- Update the free hostname check to use anchored `grep` patterns for precise matching
- Fix variable naming in `roles/odoo/files/docker-odoo-init` from `without_demo` to `with_demo` to accurately reflect the intended behavior
- Update the `-w` flag handling to set `with_demo` to `--with-demo` instead of clearing the `without_demo` variable
- Ensure the Odoo initialization command correctly passes the demo flag when the `-w` option is provided
- Add `snippet` to `enabledCssSnippets` in `.obsidian/appearance.json` to activate the custom CSS snippet
- Add `.obsidian/appearance.json` to configure Ubuntu Mono as the default font family
- Remove `.obsidian/appearance.json` and `.obsidian/graph.json` from `.gitignore` to track appearance settings
- Ensure `.vercel` is properly listed in `.gitignore` with a trailing newline
- Revert `roles/postgres/defaults/main.yml` to mount the volume to `/var/lib/postgresql` instead of `/var/lib/postgresql/data`
- Align the volume configuration with the backup and restore scripts which expect the parent directory mount
- Remove unused CSS snippet in `.obsidian/snippets/snippet.css`
- Fix `roles/postgres/defaults/main.yml` and `README.md` to mount the named volume directly to `/var/lib/postgresql/data` instead of the parent directory
- Prevent Docker from creating an anonymous volume that causes data loss during backup and restore operations
- Update `prompt.md` with a detailed explanation of the volume declaration issue and the fix
- Fix `docker-volume-backup` to correctly parse volume names by filtering for `Type == "volume"` and using proper newline separation instead of concatenating names
- Replace fragile manual array conversion with `mapfile` and `IFS` handling for robust volume list processing
- Fix `docker-volume-restore` to prevent word splitting errors by passing the filename via environment variable and using single quotes for the inner shell command
- Update `prompt.md` to reflect the completed task and token usage
- Rename GitHub Actions workflows to `deploy-docs.yml` and `test-project.yml` with specific job names
- Configure `deploy-docs.yml` to trigger only on markdown file changes
- Create `docs/` directory and move `roles.md`, `scripts.md`, and `upgrade-odoo.md` into it
- Add symlinks in `docs/` for `README.md` and `roles/` to maintain root-level access
- Update `.vuepress/config.js` to resolve absolute paths for `dest`, `public`, `temp`, and `cache`
- Update `package.json` scripts to build and dev from the `docs` folder
- Mark the migration task in `prompt.md` as completed with model and token details
- Add `prompt.md` file documenting the task to move Vuepress pages into a `docs` folder
- Remove obsolete prompt files (`prompts/01` through `prompts/23`) as their tasks have been completed
- Consolidate historical task records to maintain a clean repository state
- Change log message in `roles/docker/files/docker-import` from "Importing content" to "Stream content" to accurately describe the streaming tar operation
- Aligns with previous refactoring that eliminated intermediate file transfers
- Add command to remove the temporary PostgreSQL dump file after successful restore
- Add command to remove the temporary filestore tar archive after successful import
- Ensure no residual artifacts remain on the target server post-upgrade
- Replace `USERNAME` and `TARGET_USERNAME` with `USER` and `TARGET_USER` in `bin/upgrade-odoo` to align with existing environment variable conventions
- Update SSH command construction in `upgrade-odoo` to use the standardized user variables
- Refactor `roles/docker/files/docker-export` to stream tar content directly to the destination file, eliminating temporary file creation inside the container
- Refactor `roles/docker/files/docker-import` to stream tar content directly from the source file, removing the need for intermediate file transfer and cleanup
- Update log messages in both scripts to reflect the streaming approach
- Add `postgres_volumes` configuration with legacy mount path `/var/lib/postgresql/data` to 56 existing host vars files for Postgres versions <= 17
- Skip updates for hosts already using Postgres 18+ or those with existing volume configurations
- Update `AGENTS.md` with session info details for the pi harness
- Fix `roles/odoo/README.md` Ansible command to target `inventories/mint_system`
- Create prompt file documenting the volume configuration migration task
- Change PostgreSQL volume mount path from `/var/lib/postgresql/data` to `/var/lib/postgresql` across README files and role defaults
- Upgrade default PostgreSQL Docker image from `postgres:14-alpine` to `postgres:18-alpine`
- Update documentation and configuration defaults in `README.md`, `roles/docker_compose/README.md`, `roles/postgres/README.md`, and `roles/postgres/defaults/main.yml`
- Replace private user room link with public `#ansible-build` room in `.vuepress/config.js`
- Update Matrix badge URL in `README.md` to match the new public room link
- Add "Free disk space" label to the current environment output section
- Add "Free disk space" label to the target environment output section
- Maintain existing output formatting and variable usage
- Introduce `odoo_apps` role to the `plays/odoo.yml` playbook
- Assign the `odoo_apps` tag to the new role for selective execution
- Ensure the role is included after `packages` in the play sequence
- Update `cron` role installation script to fetch from `$repository/cron/` instead of `$repository/postgres/`
- Update `docker` role installation script to fetch from `$repository/docker/` instead of `$repository/docker_volume/`
- Update `firehol` role installation script to fetch from `$repository/firehol/` instead of `$repository/cron/`
- Update `nginx` role installation script to fetch from `$repository/nginx/` instead of the generic `$repository/`
- Ensure all installation scripts target the correct directory structure within the repository for their respective roles
- Disable sourcemaps and compressed size reporting in the Vite bundler to reduce build output size
- Increase Node.js memory limit to 768MB for the build script to prevent out-of-memory errors
- Configure `viteOptions` within `viteBundler` to apply build optimizations globally
- Eliminate explanatory comments regarding record normalization and formatting rules
- Retain the functional logic for normalizing MX and TXT records in the `infomaniak_desired_records` fact
- Clean up the `infomaniak_dns.yml` file to reduce visual noise while preserving the single source of truth for record formatting
- Replace repetitive per-task target formatting logic with a single normalization step
- Introduce `infomaniak_desired_records` fact to store structured objects (key, id, source, type, target, ttl)
- Apply specific formatting rules for MX (priority prefix) and TXT (quote wrapping) records during normalization
- Simplify Create, Update, and Delete tasks to operate on the pre-normalized list
- Remove redundant variable definitions and conditional logic from individual URI tasks
- Ensure consistent key generation across all DNS record operations
- Update VuePress ecosystem packages (bundler-vite, client, plugins, theme, utils) from rc.112/rc.115/rc.24 to rc.134/rc.31
- Upgrade Vue from 3.5.18 to 3.5.42 and Sass from 1.90.0 to 1.104.0
- Update Vite to 8.2.2 and Shiki to 4.4.3
- Refresh `pnpm-lock.yaml` to reflect new dependency tree and resolved versions
- Remove redundant `[task](./task.md)` link in `README.md` as `task help` is sufficient
- Update `.vuepress/config.js` page patterns to explicitly include only `roles/**/*.md`, `README.md`, `roles.md`, `scripts.md`, and `upgrade-odoo.md`
- Remove generic glob patterns and excluded directories to focus the documentation build on core operational guides
- Replace string-based DNS record identification with structured objects containing key, id, source, type, target, and ttl
- Update DNS creation, update, and deletion logic to use the new composite key for matching records
- Refine TTL update logic to only trigger when the desired TTL differs from the existing one
- Remove `open-url-with-delay` calls in favor of `open-url` in `upgrade-odoo` and `task` scripts
- Simplify URL opening logic by removing unnecessary delay arguments
- Add `|| true` to `activate-venv` call to prevent script failure if virtual environment is not available
- Ensure task execution continues even when venv activation is skipped
- Add `--user` flag support to install scripts in `~/.local/bin` instead of `/usr/local/bin`
- Remove `sudo` requirement for script installation and execution
- Fix repository URL from `cron` to `postgres` for script downloads
- Update installation directory logic to handle both system and user contexts
- Create target directory automatically when installing in user mode
- Add section for "Hetzner InRelease repo expired" with problem description, workaround using archive repo, and solution to upgrade distro
- Add section for "Debian InRelease repo expired" with similar workaround and solution steps
- Include specific commands for backing up sources.list, modifying repo URLs, and disabling validity checks
- Update `roles/update/README.md` to assist users encountering apt cache expiration errors
- Rename opsone inventory folders and hosts to follow `clio_odoo_*` scoping pattern
- Merge `clio` and `clio_odoo_*` groups into `inventories/mint_system/hosts.yml`
- Move scoped `host_vars` from opsone to mint_system directory
- Remove `inventories/opsone` folder after successful merge
- Validate merged inventory structure using `ansible-inventory`
- Document the task execution, scope, and worklog in `prompts/22_merge-opsone-inventory.md`
- Add section detailing how to create an admin account using `docker exec`
- Provide the specific `rake admin:create` command and explain the output
- Note that the command returns credentials for accessing the admin panel
- Replace verbose package installation tasks in Ubuntu 18.04 and 22.04 roles with a single `fail` task executing the official bbb-install script
- Update Ubuntu 22.04 script URL to v3.0.x-release and add `-g` flag for Greenlight integration
- Remove `greenlight_container` removal and extensive file cleanup tasks from `roles/cleanup/tasks/bbb_install.yml` as the installation is now handled externally
- Update task names to reflect the shift from manual configuration to script execution
- Rename "Deploy to Kubernetes" step to "Delete existing pods" for clarity
- Add "Wait for pod to be running" step to ensure new pods are ready before proceeding
- Add missing newlines to separate workflow steps
- Add `set_fact` task to initialize `infomaniak_dns_present` to an empty list at the start of `infomaniak_dns.yml`
- Remove redundant `| default([])` filter in the fact accumulation step as the list is now explicitly reset
- Document the fix in `prompts/21_fix-infomaniak-dns-task.md` with context, task details, and worklog
- Change `cp` commands in `task` build-vuepress function to `cp -r` to correctly copy directory contents from roles
- Add `pnpm-workspace.yaml` to project root and update `.gitignore` to track it
- Update README.md to replace Vercel badge with GitHub Actions deploy workflow badge
- Add default values for PORT and TARGET_PORT variables in `bin/upgrade-odoo` script
- Add `.github/workflows/deploy.yml` to automate Kubernetes pod deletion on main branch push
- Change Ansible log path from `/var/log/ansible.log` to `/var/tmp/ansible.log` in `ansible.cfg.template`
- Remove manual log file setup steps from the `task` install function as the log path no longer requires root permissions
- Reorder roles in `plays/setup.yml` to move `iam` to the end and remove `restic_server` and `dozzle`
- Update `roles/docker` to use `ansible.builtin.get_url` for GPG key retrieval, aligning with modern Ansible best practices
- Add troubleshooting documentation for public key verification errors in `roles/docker/README.md`
- Merge `odoo` and `nextcloud` inventories into `mint_system` with scoped host and group variables
- Rename host_vars folders and apply `_odoo`/`_nextcloud` suffixes to hosts for clear separation
- Restructure `mint_system/hosts.yml` to group hosts under `setup`, `odoo`, and `nextcloud` children
- Update playbooks (`all`, `nextcloud`, `odoo`, `setup`) to target specific host groups instead of `all`
- Remove redundant `postgres` and `mariadb` dependencies from `nextcloud` role meta
- Refactor `list-hosts` script to support flattened inventory structures and improved column sorting
- Mark inventory merge task as completed in documentation
- Fix missing variable expansion in the upgrade-production step by adding the `$` prefix to `USE_OPENUPGRADE`
- Add conditional logic to the update step to skip module updates when OpenUpgrade is enabled, preventing unnecessary operations during the upgrade process
- Include the postgres role in the odoo play to ensure database dependencies are met
- Apply the `odoo` tag to the postgres role to enable selective execution via Ansible filtering