Companion to ai-crawler-accessibility-audit, which already covers the crawler
half well (including the answer-engine vs training-bot distinction) but has
zero schema coverage. This fills that gap rather than duplicating it.
Scoped to structured data specifically. Deliberately excludes 'AEO content
strategy' -- comparison articles, parasite posting, manufactured industry
reports ranking yourself top. The last of those means publishing a misleading
document; structured data is a factual description of what you actually sell.
Leads with 'find what is already emitted', because duplicate conflicting schema
is a more common failure than missing schema -- Woo core, the SEO plugin and
the theme each emit their own. Covers AggregateOffer for variable products
where a single Offer misrepresents a size surcharge, per-locale emission on
WPML sites, and the field gotchas: comma decimal separators silently breaking
parsers, JS-injected JSON-LD being invisible to non-JS crawlers, and
non-standard WP table prefixes making a direct-SQL audit fail in a way that
reads as a different problem.
Retested 2026-09-07: a direct SigV4 PUT to s3.palmasolutions.net succeeds. The
Caddy fix landed the same day the bug was written up and the skill was never
updated, so for two weeks it told readers the endpoint was unusable.
Adds the actual cause of an apparently-dead offload: AS3CF 3.0+ stopped writing
amazonS3_info postmeta and records offloads in <prefix>_as3cf_items, so counting
postmeta reports zero on a working site. Also corrects the backfill recipe --
wp_update_attachment_metadata() does nothing in 4.x, the item handler is the
real API.
Records the gringo 2026-09-06 migration: zfs set mountpoint fails busy with
child datasets mounted, zfs set -u avoids it entirely, and jail.conf (not just
fstab) carries the path -- missing it means zero jails start.
Verified 2026-09-06: a launch failed on a missing chromium_headless_shell-1217
executable because the package moved to a build revision the cache lacked. The
skill previously said no re-download was needed.
Live local HTML progress report (status board, running narrative,
screenshots, newest-first log) served on localhost via a stdlib-only
Python server, so a human can watch a long/delegated agent task
without reading the raw transcript. Adapted from dbl8005/sitrep-panel
(MIT), evaluated and drafted via Codex per this fleet's standard
skill-candidate review process. Bundled server and HTML template
copied unmodified from upstream.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Trademark + domain clearance procedure for any new product/project
name, established while naming the Turnero job-board project. Covers:
querying OEPM's real live trademark search (consultas2.oepm.es) rather
than any partial local mirror -- confirmed Vixilia's own bopi_records
backfill is still incomplete (only reached 2012 as of 2026-08-23) and
would give false-clean results for anything registered 2015-2025; and
checking domain availability separately, since a clean trademark result
doesn't imply an available domain (confirmed real case: "Turnero" had
zero trademark hits but both turnero.com and turnero.es were already
taken by unrelated parties).
Codex-evaluated agentic-soc-platform (github.com/FunnyWolf/agentic-soc-platform)
against this fleet's Wazuh deployment and informatiq-dashboard monitoring
integration. Adopted the reusable architecture only (evidence-preserving
normalization, deterministic correlation, approval-gated playbooks,
shadow-mode rollout) - not the platform itself. Rejected BagelHole/DevOps-
Security-Agent-Skills (163 skills, all duplicate/out-of-scope/unsafe) and
guillaumemeyer/watermarks-remover (narrow, no reusable technique beyond
existing c2patool/ExifTool).
Documents the fleet's WP Offload Media pattern (warrior/stray MinIO,
dedicated bucket per site, WPS3Media plugin) and an open production bug
found while applying it to sateulera-dev: the public S3 API endpoint
(Caddy -> warrior) currently rejects all signed writes, unrelated to
credentials or plugin config.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Documents what's actually installed for browser automation in this sandbox
(Playwright via Python, no global Node package, browsers pre-cached) and a
DNS-routing quirk on *.palmasolutions.net domains, plus the circular
overflow:hidden badge-clipping bug class found while debugging sateulera-dev.
Codifies the existing (but silently skippable) humanize step as a
checked skill after a real content batch published without it —
codex hand-rolled its own generation call instead of going through
content-agent/agent.py, which unconditionally runs both draft_rewrite()
and humanize(). This skill makes the requirement explicit, gives the
safe invocation path, and states how to verify the pass actually ran
rather than trusting a delegate's self-report.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Merge in a checklist-style "provisioning script safety" section, adapted
from wshobson/agents' bash-defensive-patterns skill (fetched directly
from GitHub, MIT licensed) rather than trusted from its catalog summary.
Covers: shell-choice caution (#!/bin/bash isn't guaranteed on FreeBSD;
bash is a package at /usr/local/bin/bash, not base), a contextual
error-handling philosophy instead of a blanket `set -Eeuo pipefail`,
trap-based cleanup/logging for scripts interrupted mid-jail-creation
(without auto-rollback, which can worsen the known destroy/create IP
churn issue), jail-name/IP input validation before destructive `bastille`
commands, and FreeBSD `mktemp`/`sed -i`/`date` syntax differences from
GNU. Deliberately dropped the upstream's interactive `rm -rI` cleanup
pattern (wrong for unattended SSH automation) and did not import
retry/locking/ShellCheck-gate advice that wasn't actually present in the
real upstream files. Cross-references remote-shell-quoting-safety instead
of duplicating its nested-shell-quoting content.
Also documents the /usr/local/bastille vs /www/bastille bastille_prefix
split already present across this fleet's hosts (gringo/staging vs
granja), which the new script-safety guidance assumes readers already
know not to hardcode.
Full worked patterns and code examples live in the new
references/script-safety.md; SKILL.md keeps the load-bearing summary.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Paired skills.sh/autoskills.sh catalog scans (2026-08-15, reports in
granja/_temp/codex-logs/) independently flagged wordpress/agent-skills'
wp-performance module as the best net-new find of the whole scan: a
measurement-first, backend-only WP diagnostic workflow (WP-CLI
doctor/profile, headless Query Monitor, autoload/object-cache/cron
checks) — a strong fit since this fleet's 13+ WordPress sites are all
headless/jailed with no browser-first profiling access.
Adapted from github.com/wordpress/agent-skills (skills/wp-performance)
rather than installed verbatim: swapped the upstream's local/SSH
assumptions for the fleet's actual `bastille cmd ... su -m www`
remote-execution pattern (reusing wordpress-cli-remote-execution's
convention exactly), added a jail/site selector step against the real
granja/staging/gringo inventory, narrowed the always-collect baseline to
four metrics (TTFB, autoload size, object-cache presence, cron health)
with fleet-specific context for each, added redaction guidance for
Valkey/DB credentials that diagnostic output can surface, and replaced
the upstream's hardcoded "WordPress 7.0+" compatibility claim with
per-site version verification.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Per the 2026-08-15 skills.sh and autoskills.sh scans, both flagged
wordpress/agent-skills' wp-plugin-development module (Automattic-origin,
now WordPress-org-hosted) as high-value source material for iWP's plugin
skill: nonce+capability dual-check discipline, late escaping, prepared
SQL, cron idempotency, and uninstall-vs-deactivation guardrails.
Adapted (not copied) against real iWP plugin code in wp-plugins/:
- nonce+capability must-both framing, cited against
class-iwp-cache-db-cleanup.php's actual AJAX handler
- late-escaping and wp_unslash()/explicit-key superglobal reading
- %i identifier-placeholder version gate (WP 6.2+, most iWP plugins
floor at 6.0 or lower)
- new "Admin settings" section documenting the real Settings-API vs.
AJAX-dashboard split across the suite, since the source's generic
Settings-API-first prescription doesn't match roughly half of iWP's
plugins
- new cron idempotency section citing the existing wp_next_scheduled()
guard already used consistently in iwp-cache/iwp-woosales/iwp-booking
- new uninstall-vs-deactivation section flagging that only 3 of ~15
plugins ship uninstall.php despite most creating options/tables
- new release-packaging checklist tied to iWP's actual IWP_Updater
version-wiring convention (header/constant/updater param must agree)
Provenance noted inline with source URL. Left out the source's generic
architecture/Settings-API prescription and its detect_plugins.mjs
script (skill's house style is prose-only, no bundled scripts).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both the skills.sh and autoskills.sh scans (dispatched this session, see
granja/_temp/codex-logs/{skills-sh-scan,autoskills-sh-scan}.md) independently
flagged wordpress/agent-skills' official wp-wpcli-and-ops module as high-value
source material for this skill: safe search-replace, db export/import,
multisite targeting, and deterministic environment inspection before any
destructive command.
Merged in (adapted to this fleet's bastille cmd + su -m www invocation model,
not the upstream's local/SSH-direct WP-CLI assumption):
- pre-write environment/blast-radius inspection sequence (plain wp-cli calls
through the existing invocation pattern, not the upstream's Node.js
wpcli_inspect.mjs script)
- multisite targeting checklist (--url requirement, site list iteration)
- safe search-replace/domain-migration workflow (backup, dry-run, flush)
- db export/import, plugin/theme, and cron/cache-flush guardrails
Ties the upstream --allow-root warning to this fleet's own documented
wp-content ownership-drift incident (docs/server-granja.md) and cites the
real jail counts/CVE rollout from docs/server-granja.md, server-staging.md,
and server-gringo.md for grounding. Provenance noted in the file with source
URLs. Deliberately left out generic plugin-development/performance/PHPStan
material from the same upstream repo — out of scope for this remote-execution
skill.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
External DNS/SPF/DKIM/DMARC/MTA-STS/TLS/DNSBL diagnostics adapted from
arova-ai/agent-skills' email-server-diagnostics, combined with this
session's own direct mailcow migration experience (geeky/posta/postman
-> spoof consolidation): real container naming pattern
(mailcowdockerized-<service>-mailcow-1), mailcow's own official
helper-scripts/backup_and_restore.sh and update.sh, the acme-mailcow
cert container, and an explicit multi-tenant blast-radius guardrail
since one instance serves many unrelated businesses' domains.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sourced via Codex scan of github/spec-kit and deepseek-ai/deepseek-harness
(scan reports in granja/_temp/codex-logs/), then authored by Codex against
this repo's exact SKILL.md format/density, calibrated against
bastille-jail-provisioning/writing-implementation-plans/tdd. Spot-checked
two directly (write-feature-specification, harden-async-lifecycle-code) --
concrete, code-example-backed procedures, not generic advice.
From spec-kit: write-feature-specification, clarify-feature-specification,
audit-requirements-quality, analyze-spec-plan-task-consistency,
converge-implementation-to-spec.
From deepseek-harness: harden-async-lifecycle-code, test-real-entry-paths,
snapshot-agent-behavior, maintain-decision-records,
remove-reasoning-transcript-prose.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Evaluated the Stonewright WP MCP repo (github.com/cosmincraciun97/
stonewright-wp-mcp) per user request -- decided against adopting it or
its MCP server (this fleet already does WP work via shell+WP-CLI, and
its Gutenberg layer is thin wrapping over parse_blocks/serialize_blocks
we can already call directly). Its Elementor V3 _elementor_data
read/write pipeline is genuinely well-engineered, non-obvious, and worth
having as a reference: double-encoding trap, wp_slash-before-persist,
surgical patches that preserve unrecognized settings keys, and
readback+cache-clear+visual verification after write. Distilled into
this skill for CLI/wp-eval-based Elementor edits (not the MCP itself).
root@ works fine (standard key, same as every other host) — the
SSH-blocked claim was from a session that only tested malin@pinky.
Adds real survey detail: SDK path, no-JDK-on-host build pattern, the
shared Android emulator container.
Pinky was missing from the map entirely. Documents its purpose
(Docker/Linux-only workloads, esp. Android SDK/emulator builds) and the
current SSH access gap (root's key not authorized, user is malin) found
while chasing an apuntiq Android build.
Confirmed on Gitea 1.27.1 (2026-08-12): browser_download_url in the API
response points at an internal hostname (gitea.barky) but the file
downloads correctly once you swap in the instance's public hostname.
Verified end-to-end with a real binary asset (md5sum match) on a private
repo accessed via token.
Evaluated citeworthyio/seo-agent for reusable process knowledge. Relevant
to this fleet's WordPress content sites (granja travel news, content-agent
pipeline): a crawl-diagnose-approve-recrawl-measure loop for SEO metadata
changes, a three-layer AI-crawler accessibility audit (robots policy, bot
delivery, readable content), and a fail-closed method for generating and
safely injecting Article JSON-LD. Keyword research and citation-probe
pieces of the source repo were skipped as underdeveloped or too
infra-coupled to be reusable here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Evaluated obra/superpowers and JuliusBrussee/caveman for gaps in the
existing library. These three fill real ones (plan-to-delegate handoff,
evidence-based review triage, completion vs. integration authority);
adapted for this fleet's Gitea/RLS/multi-delegate conventions. Everything
else in both repos duplicated existing skills or didn't fit (see README
Provenance note on caveman).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- server-fleet-map: add gringo row
- bastille-jail-provisioning: elevate default-deny-outbound to the standard
for every new jail; reference gringo's live pf.conf
- modded-app-update-pattern: new skill, fork/rebase pattern for locally
patched apps; uses tailnetatlas on gringo as the concrete example
- dependency-vuln-scanning: new skill, npm audit / pip-audit / osv-scanner
cadence for deployments and monthly thereafter
Real incident on the staging host: nat on $ext_if from <subnet> to any ->
($ext_if) silently failed to rewrite the source IP when that IP was
already aliased on the same interface, breaking all outbound jail traffic
with no error anywhere - just clean timeouts. Fixed by using an explicit
target IP instead of the interface macro. Cost real debugging time to
trace from "WordPress admin hangs after a PHP upgrade" back to this.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two real gotchas from today's goddy->gringo Laravel migration: every jail
on an NPM-fronted host needs a dedicated listen port (8000+last-octet),
not just the shared port 80, or NPM cutover silently can't reach it even
though every direct/Host-header test passes. Separately, zsh ties a
variable literally named `path` to $PATH itself - overwriting it broke
every subsequent command in a config-editing script with no clear error.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adapts the clean (no-profanity) SKILL.md variant from Mte90/linus-torvalds-skill,
distilled from 38,293 real Linus Torvalds code-review moves across two decades
of Linux kernel mailing list emails. The upstream project also ships a profane
"soul" persona variant, deliberately not installed here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New skill wordpress-plugin-staging-verification: use the persistent
staging-1 jail (real-world plugin set left active) instead of a
disposable clean-room jail, full verification checklist, and the
cosmetic-proc_open-error-vs-real-fatal distinction.
Extended bastille-jail-provisioning: bastille0-loopback-missing gotcha
(pass the interface explicitly), IP-alias-can-silently-fail-after-
recreate gotcha, host-reverse-proxy-vs-jail-IP curl mixup, Valkey as
part of the stock stack (correct FreeBSD package name, ACL auth
requirement).
Extended wordpress-plugin-conventions: drop-in source files
(object-cache.php/advanced-cache.php logic) must be excluded from any
glob-based plugin autoloader, or they redeclare WP core's own
wp_cache_*() functions and fatal -- real bug found and fixed live during
iWP Cache's first staging activation attempt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
WordPress plugin rebrand/conventions/remote-CLI patterns, Gitea release
workflow, bastille jail provisioning, remote shell quoting safety, server
fleet map, delegate brief writing, and verification discipline -- all
derived from real incidents this session, plus two skills adapted (MIT
license, attributed) from obra/superpowers and andrej-karpathy-skills.