security-updates — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited security-updates (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use when:
composer auditThis step is mandatory. Do not run any composer commands until a new branch is created and confirmed. Never update packages directly onmainormaster.
Check the current branch first:
git branch --show-currentIf the user is on main, master, or any protected branch, stop and ask: "What would you like to name the new branch for these security fixes?"
Suggest a default if they are unsure (e.g., security/drupal-updates-YYYY-MM-DD).
git checkout -b <branch-name>Confirm the new branch is active before proceeding:
git branch --show-currentOnly continue to the next step once the output confirms a non-protected branch.
composer auditOutput lists packages with known advisories, CVE IDs, and links to the advisory.
composer audit --format=jsoncomposer audit --no-devcomposer update drupal/package --with-all-dependenciesUse --with-all-dependencies to allow transitive dependency version changes required by the update.
drupal/corecomposer update drupal/core-recommended drupal/core-composer-scaffold --with-all-dependenciesUpdate only packages flagged by the audit, staying within the version constraints in composer.json:
composer update --with-all-dependencies $(composer audit --format=json 2>/dev/null \
| python3 -c "import sys,json; data=json.load(sys.stdin); print(' '.join(set(a['packageName'] for a in data.get('advisories', {}).values() if isinstance(a, dict)) or [v[0]['packageName'] for v in data.get('advisories', {}).values()]))" 2>/dev/null)Or update them manually after reviewing the audit output:
# List vulnerable packages from audit output, then update each
composer update drupal/package1 drupal/package2 --with-all-dependenciescomposer auditExpected output after all fixes:
No security vulnerability advisories found.composer show drupal/package | grep versionsCheck the installed version matches the expected fix release. For Drupal core:
composer show drupal/core | grep versionsIf Drush is available locally:
drush statusExpected: Drupal bootstrap: Successful. If bootstrap fails, do not commit — investigate before proceeding.
After the audit is clean, always ask the user these questions in order:
>
1. "Do you want to commit these changes?" - If yes: ``bash git add composer.json composer.lock git commit -m "Apply Drupal security updates"`- If no → remind the user thatcomposer.jsonandcomposer.lock` are uncommitted before proceeding.
>
2. "Do you want to deploy these changes to an Acquia environment?" - If yes → follow the [Drupal Update and Deploy playbook](../../playbooks/drupal-update-deploy/SKILL.md) to push code, switch the environment, and optionally trigger a pipeline build. - If no → done.
>
3. After deployment: Run database updates on the target environment before marking the work complete: ``bash drush updb --yes drush cr ``The version required to fix the advisory conflicts with another constraint. Options:
# Check what requires the package
composer why drupal/package
# Check what prevents the update
composer why-not drupal/package 2.x
# Relax the constraint in composer.json if safe, then retry
composer update drupal/package --with-all-dependenciesComposer's local advisory database may be stale. Refresh it:
composer audit --update-cache
composer auditPin the conflicting package temporarily and file a follow-up:
# Check the full dependency tree
composer depends drupal/conflicting-packageResolve the constraint in composer.json before retrying.
If the update introduced a regression, restore the previous state from version control and reinstall:
git checkout composer.json composer.lock
composer installIf the update was already committed, revert the commit:
git revert HEAD
composer install~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.