hoo-monthly-audit · git:20260719.9c57a7a · 2026-07-19 · sha256 d97f5175feee7652
hoo-monthly-audit git:20260719.9c57a7aA
Immutable. This exact content is served forever at /api/v1/blob/d97f5175feee7652.
---
name: hoo-monthly-audit
description: Use for the monthly deep audit - "run the monthly audit", /organic-os:monthly-audit, or the scheduled monthly routine.
---
# Monthly deep audit
1. Full sweep via the orchestrator pattern: launch all eight specialists in
parallel with the profile path.
2. Additionally: content freshness review (pages > 12 months stale that hold
rankings - freshness is a strong-evidence AEO factor), schema validity,
internal-link health, tracked-keyword trend over the month, outcomes review
(which applied changes moved metrics; feed wins/losses to the reflector).
Run the page-essentials dimension (skills/onsite-audit step 3: author
entity, answer capsule, in-content images, social image shape,
publisher schema shape, sitemap membership) site-wide across the
audited page set, not only on newly flagged pages - the checklist is
the product's eyes, and a check that does not run cannot fire. The
internal-link health line above runs as skills/onsite-audit step 4:
one capped own-site crawl (`onsite.linkgraph`, sitemap-seeded) for
broken links, orphans, hubs, shallow striking-distance pages, and
redirect chains - same signal severities, same one-proposal cap.
3. Compare with last month's runs/ artifacts; the report leads with deltas.
4. File signals, briefs, and fixes through core contracts; rebuild queue;
notify per approval channel. Only send items where `is_notified(item)` is
false; call `mark_notified(path)` right after a successful send.
5. Output runs/YYYYMM-monthly/REPORT.md: executive summary in plain language,
then per-specialist sections, then this month's queued work.
At each stage boundary, append a one-line progress marker with a UTC
timestamp to the run report file before starting the stage - headless runs
are watched by tailing that file, not a terminal.
## Entity consistency
1. Build the property set from the profile: the site's own homepage and
about page, plus every URL in the optional `brand.properties:` list
(a GitHub org or repo, a LinkedIn page - see site-repo-contract.md).
Only URLs the profile provides are fetched - never guess a handle or
search for unlisted profiles. No `brand.properties:` list means the
check runs on the site's own pages only, and the report says so.
2. Fetch each property (WebFetch of public pages within the session -
the sanctioned mechanism, docs/adr/0006 in the repo, same as the
citation tracker) and extract the core brand facts each one states:
brand name, one-line description, founding and location claims where
stated, logo reference, and sameAs cross-links between properties.
3. Compare across properties. Each inconsistency is one P2 signal per
fact: what differs, where (the URLs and their two values), and which
version the profile says is canonical (the profile's site name and
organization details are the reference; a fact the profile does not
state has no canonical version - report the divergence, pick none).
4. Route fixes by where they land: an inconsistency on the user's own
site becomes a gated proposal (a schema or about-page edit via
`create_item`, through the normal approval gate); an inconsistency
on a third-party property is a named human step in the report - this
skill never writes off-site.
5. Rationale line, carried next to this section's output: consistency
across authoritative sources drives inclusion in AI answers
(https://www.useomnia.com/blog/how-to-improve-brand-visibility-chatgpt).
No web access this session: skip this section and note it as one line
in REPORT.md ("entity consistency: skipped, no web access") instead of
guessing.