Skip to content

Commit cdc8990

Browse files
authored
Merge pull request #173 from aicodingstack/codex/seo
fix(seo): improve crawlability and install marketing skills
2 parents 2d5a71f + 087b91b commit cdc8990

260 files changed

Lines changed: 31631 additions & 311 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
---
2+
name: ad-account-auditor
3+
slug: aaron-ad-account-auditor
4+
displayName: "Ad Account Auditor · 付费广告账户审计"
5+
summary: "付费广告账户审计/ROAS评分"
6+
description: 'Use when auditing a paid ad account for incremental contribution, wasted spend, or measurement integrity before scaling; runs a typed 20-item ROAS profile with verified vetoes and a SHIP/FIX/BLOCK/UNDECIDED gate on own exported data. Not for campaign structure design — use campaign-architect; not for creative production — use ad-creative-builder. 付费广告账户审计/ROAS评分'
7+
version: "19.0.0"
8+
license: Apache-2.0
9+
compatibility: "Claude Code and compatible agent-skill hosts"
10+
homepage: "https://github.com/aaron-he-zhu/aaron-marketing-skills"
11+
when_to_use: "Use when checking whether a paid account or portfolio is safe to launch or scale. Requires normalized own-data outcomes, attribution windows, currency, conversion lag, and business constraints."
12+
argument-hint: "<campaign + outcome exports> <currency/window/lag> [profile]"
13+
allowed-tools: WebFetch
14+
class: auditor
15+
metadata: {"author": "aaron-he-zhu", "version": "19.0.0", "discipline": "ad", "phase": "activate", "geo-relevance": "medium", "hermes": {"tags": ["marketing", "ad", "activate"], "category": "ad"}, "openclaw": {"emoji": "🎯", "homepage": "https://github.com/aaron-he-zhu/aaron-marketing-skills"}}
16+
---
17+
18+
# Ad Account Auditor
19+
20+
Audit one paid-media account or portfolio for incremental contribution and operating quality under declared constraints. Platform-reported ROAS is one input, never the objective or truth set by itself.
21+
22+
## When This Must Trigger
23+
24+
- Before launching, materially increasing spend, or changing a risky bid/targeting strategy.
25+
- When tracking, attribution inflation, unsafe placements, claims, or wasted spend are in doubt.
26+
- When the user requests a ROAS/RQS account audit from their exports.
27+
28+
## Quick Start
29+
30+
```text
31+
Audit this USD account for direct response using 7-day click, 3-day lag, and $120 CAC ceiling.
32+
Run the incremental-profit profile against the holdout and order-ID exports.
33+
```
34+
35+
## Skill Contract
36+
37+
**Reads:** one normalized account/portfolio evidence set. **Writes:** only a permissioned v3 artifact. **Done when:** required context and all 20 states are explicit, vetoes use verified evidence, and scorer output is reported without executing spend changes.
38+
39+
This skill judges. `conversion-signal-qa`, `attribution-reconciler`, `campaign-architect`, `ad-creative-builder`, and `budget-pacing-monitor` build/fix the inputs. Never enable campaigns, change bids, upload audiences, or scale budgets without separate explicit approval.
40+
41+
## Data Sources
42+
43+
| Need | Preferred evidence |
44+
|---|---|
45+
| Delivery/spend | Campaign, query, placement, audience, and change-history exports |
46+
| Outcome truth | Deduplicated order/lead IDs from ecommerce, analytics, or CRM |
47+
| Economics | Currency, margin/contribution, CAC/payback constraint |
48+
| Attribution | Platform + own-data timestamps/IDs, normalized windows and lag |
49+
| Safety/claims | Placement report, rendered ad/landing, approved claim/disclosure state from [offer-claims-registry](../../../protocol/offer-claims-registry/SKILL.md) (the paid claims SSOT) |
50+
| Incrementality | Holdout/geo split/causal test, otherwise explicitly labeled proxy |
51+
52+
## Instructions
53+
54+
### Runtime and Setup
55+
56+
Read `../../../references/auditor-runbook.md`, `scoring-semantics.md`, `roas-benchmark.md`, and the ROAS catalog entry. Standalone installs use bundled immutable `references/auditor-runtime.md`; never fetch mutable `main`. Before deterministic calls, follow [`runtime-invocation.md`](../../../references/runtime-invocation.md), resolve `AARON_SKILLS_ROOT="${CLAUDE_PLUGIN_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || true)}"`, and require the scorer, validator, and typed catalogs. If unavailable, return `score_state: NOT_SCORED` / `score_confidence: not_scored` with no gate verdict or persistent artifact.
57+
58+
Declare profile (`direct-response|prospecting|incremental-profit`), target, currency, attribution window, conversion lag, business constraint, goal, and observation date. If any required context is missing, return `NEEDS_INPUT/UNDECIDED`.
59+
60+
### Evidence and Scoring
61+
62+
1. Normalize currency, windows, IDs, lag, and portfolio scope before comparing metrics.
63+
2. Score all 20 `R1..S5` criteria from the benchmark with source/date/type/confidence.
64+
3. Use Unknown for missing own-data truth, placement exports, or reconciliation. No data is not a veto and cannot be N/A merely because access is inconvenient.
65+
4. Verify vetoes:
66+
- `ROAS-R1`: instrumentation demonstrably fails the named own-data truth set.
67+
- `ROAS-R2`: material double-counting/inflation is demonstrated.
68+
- `ROAS-O1`: material claim/disclosure failure against the `offer-claims-registry` approved state.
69+
- `ROAS-O2`: applicable platform/restricted-category violation.
70+
- `ROAS-A1`: placement evidence demonstrates a material safety breach.
71+
5. Run the typed scorer. Report estimated/proxy incrementality as such; do not call platform attribution causal.
72+
73+
## §2 ROAS Worked Examples
74+
75+
- Complete direct-response profile, raw 78, no veto/fail: `DONE/SHIP`, final 78.
76+
- Complete profile, raw 78, one verified R1 failure: `DONE_WITH_CONCERNS/FIX`, final 59.
77+
- Complete profile, verified R1 and R2 failures: `DONE/BLOCK`, raw retained, no final score.
78+
- Missing placement report: A1 Unknown, `NEEDS_INPUT/UNDECIDED`, no overall score.
79+
80+
## §3 ROAS Guardrails
81+
82+
- High reported ROAS can reflect under-spend, branded-demand capture, or attribution inflation.
83+
- Learning-phase disruption is an S2 finding, not an automatic veto.
84+
- ATT/modeled data may reduce confidence; it does not automatically fail R1.
85+
- Frequency, creative fatigue, and audience saturation require separate evidence.
86+
- Never compare cross-platform returns before normalizing currency/window/lag and deduplicating outcomes.
87+
88+
## §5 ROAS Translation
89+
90+
Lead with business impact and evidence. On trace request, qualify `ROAS-R1/R2/O1/O2/A1`; do not expose bare IDs that collide with RAMP/ECHO/TALE.
91+
92+
## Report and Verdict
93+
94+
Begin with the auditor-runbook's exact typed conversation header. Never replace `status`, `verdict`, or `score_state` with prose; list each explicitly missing qualified item as ``ID: `unknown``` before findings.
95+
96+
Show verdict, profile/context, score or coverage/interval, confidence, R/O/A/S detail, reconciliation table, verified critical controls, Unknown evidence, and prioritized fix/owner/rerun condition. The scorer owns status/verdict and the 59 ceiling.
97+
98+
## Validation Checkpoints
99+
100+
- Scope/currency/window/lag/constraint/goal are explicit.
101+
- Own-data outcome truth is separated from platform self-report.
102+
- All 20 items have valid states and provenance; Unknown is not renormalized.
103+
- Veto failures are positively verified.
104+
- No spend/account mutation occurred without separate approval.
105+
106+
## Persistence
107+
108+
Persist only after explicit authorization to `memory/audits/ad/YYYY-MM-DD-<topic>.md`. Assemble and validate the complete v3 draft with `validate-audit-artifact.py` against that intended `--relative-path`, persist only through one full-content Write, then revalidate the target as required by the auditor runbook. Edit/shell/MCP mutations of the reserved sink are unsupported. Do not autonomously write hot cache, claims, candidates, or account state.
109+
110+
## Reference Materials
111+
112+
- [ROAS benchmark](../../../references/roas-benchmark.md)
113+
- [Measurement protocol](../../../references/measurement-protocol.md)
114+
- [Auditor runbook](../../../references/auditor-runbook.md)
115+
- [Scoring semantics](../../../references/scoring-semantics.md)
116+
117+
## Next Best Skill
118+
119+
- **Tracking:** [conversion-signal-qa](../conversion-signal-qa/SKILL.md)
120+
- **Claims/disclosures:** [offer-claims-registry](../../../protocol/offer-claims-registry/SKILL.md) — the approved claim/disclosure state behind `ROAS-O1`
121+
- **Attribution:** [attribution-reconciler](../../scale/attribution-reconciler/SKILL.md)
122+
- **Structure/audience:** [campaign-architect](../../research/campaign-architect/SKILL.md)
123+
- **Pacing:** [budget-pacing-monitor](../../scale/budget-pacing-monitor/SKILL.md)
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
<!-- GENERATED FILE: run `python3 scripts/generate-auditor-runtime.py --write`; do not edit. -->
2+
3+
# Standalone Auditor Runtime
4+
5+
- **Runtime version:** 3.0.0
6+
- **Catalog version:** 19.0.0
7+
- **Framework:** ROAS
8+
- **Auditor:** ad-account-auditor
9+
- **Source digest:** `sha256:feab7466c35ec4300764147dc87dc7a94f05314831b63e94ba19d33e0417f6e0`
10+
11+
This immutable bundle is the fail-closed standalone fallback for this auditor. It contains the exact typed framework slice needed to collect observations without inventing rules. Repository/plugin installs use the root policy, schemas, and deterministic scorer. A standalone one-folder install must not fetch mutable sources, compute a score, claim a gate verdict, or persist an audit artifact.
12+
13+
## Typed Framework Snapshot
14+
15+
```json
16+
{
17+
"catalog_version": "19.0.0",
18+
"frameworks": {
19+
"ROAS": {
20+
"construct": "incremental paid-media contribution and operating quality under declared business constraints",
21+
"dimensions": {
22+
"A": {
23+
"id_width": 1,
24+
"item_count": 5,
25+
"item_prefix": "A",
26+
"name": "Audience"
27+
},
28+
"O": {
29+
"id_width": 1,
30+
"item_count": 5,
31+
"item_prefix": "O",
32+
"name": "Offer"
33+
},
34+
"R": {
35+
"id_width": 1,
36+
"item_count": 5,
37+
"item_prefix": "R",
38+
"name": "Return"
39+
},
40+
"S": {
41+
"id_width": 1,
42+
"item_count": 5,
43+
"item_prefix": "S",
44+
"name": "Spend Efficiency"
45+
}
46+
},
47+
"item_definitions": {
48+
"A1": "brand and placement safety verified from the placement evidence",
49+
"A2": "targeting and query/audience intent fit",
50+
"A3": "negative keywords, exclusions, and suppression controls are maintained",
51+
"A4": "campaign/account structure supports the declared objective without avoidable overlap",
52+
"A5": "reach, overlap, and audience saturation are measured",
53+
"O1": "claims and required disclosures are substantiated",
54+
"O2": "platform policy and restricted-category requirements are satisfied",
55+
"O3": "offer economics, eligibility, terms, and availability are explicit",
56+
"O4": "ad-to-landing message and intent match",
57+
"O5": "creative hook, format, accessibility, and fatigue state fit the placement",
58+
"R1": "conversion instrumentation verified against an own-data truth set",
59+
"R2": "cross-platform attribution deduplicated and windows/currency normalized",
60+
"R3": "incremental contribution or profit measured against the declared target/control",
61+
"R4": "CAC/CPA and payback satisfy the declared business constraint",
62+
"R5": "marginal return is read after conversion lag with uncertainty stated",
63+
"S1": "budget pacing stays within the declared plan and constraints",
64+
"S2": "bid strategy and learning-state changes are governed",
65+
"S3": "marginal CPC/CPM/CTR/CVR efficiency is compared on a normalized window",
66+
"S4": "frequency and creative decay are separated from audience saturation",
67+
"S5": "paid/organic and cross-campaign cannibalization are assessed"
68+
},
69+
"item_policies": {
70+
"A1": {
71+
"unknown_policy": "needs-input",
72+
"veto": true
73+
},
74+
"O1": {
75+
"veto": true
76+
},
77+
"O2": {
78+
"veto": true
79+
},
80+
"R1": {
81+
"unknown_policy": "needs-input",
82+
"veto": true
83+
},
84+
"R2": {
85+
"unknown_policy": "needs-input",
86+
"veto": true
87+
}
88+
},
89+
"profiles": {
90+
"direct-response": {
91+
"context_equals": {
92+
"goal": "direct-response"
93+
},
94+
"dimensions": {
95+
"A": 0.15,
96+
"O": 0.2,
97+
"R": 0.4,
98+
"S": 0.25
99+
}
100+
},
101+
"incremental-profit": {
102+
"context_equals": {
103+
"goal": "incremental-profit"
104+
},
105+
"dimensions": {
106+
"A": 0.1,
107+
"O": 0.15,
108+
"R": 0.5,
109+
"S": 0.25
110+
}
111+
},
112+
"prospecting": {
113+
"context_equals": {
114+
"goal": "prospecting"
115+
},
116+
"dimensions": {
117+
"A": 0.3,
118+
"O": 0.3,
119+
"R": 0.15,
120+
"S": 0.25
121+
}
122+
}
123+
},
124+
"required_context": [
125+
"currency",
126+
"window",
127+
"conversion_lag",
128+
"business_constraint",
129+
"goal"
130+
],
131+
"source": "references/roas-benchmark.md",
132+
"unit_of_analysis": "one account/campaign portfolio, currency, attribution window, and observation period",
133+
"veto_items": [
134+
"R1",
135+
"R2",
136+
"O1",
137+
"O2",
138+
"A1"
139+
]
140+
}
141+
},
142+
"semantics": {
143+
"bands": [
144+
{
145+
"maximum": 100,
146+
"minimum": 90,
147+
"name": "Excellent"
148+
},
149+
{
150+
"maximum": 89,
151+
"minimum": 75,
152+
"name": "Good"
153+
},
154+
{
155+
"maximum": 74,
156+
"minimum": 60,
157+
"name": "Medium"
158+
},
159+
{
160+
"maximum": 59,
161+
"minimum": 40,
162+
"name": "Low"
163+
},
164+
{
165+
"maximum": 39,
166+
"minimum": 0,
167+
"name": "Poor"
168+
}
169+
],
170+
"confidence_factors": {
171+
"high": 1.0,
172+
"low": 0.5,
173+
"medium": 0.75
174+
},
175+
"evidence_types": {
176+
"calculated": 0.8,
177+
"estimated": 0.5,
178+
"measured": 1.0,
179+
"proxy": 0.4,
180+
"user-provided": 0.8
181+
},
182+
"external_validity": "advisory-until-outcome-calibrated",
183+
"item_points": {
184+
"fail": 0,
185+
"partial": 5,
186+
"pass": 10
187+
},
188+
"missingness": {
189+
"missing": "treated as unknown, never as partial or fail",
190+
"na": "genuinely inapplicable under an item policy; requires a reason and is excluded",
191+
"unknown": "applicable but not observed; prevents a comparable total score"
192+
},
193+
"multi_veto": {
194+
"emit_final_score": false,
195+
"minimum": 2,
196+
"verdict": "BLOCK"
197+
},
198+
"required_coverage": 100,
199+
"rounding": "floor",
200+
"score_states": [
201+
"pass",
202+
"partial",
203+
"fail",
204+
"unknown",
205+
"na"
206+
],
207+
"veto_ceiling": 59
208+
}
209+
}
210+
```
211+
212+
## Standalone Execution Policy
213+
214+
1. Select exactly one declared profile from the typed snapshot and record it with the catalog version and source digest above.
215+
2. Collect one state per applicable item using the run-schema vocabulary: `pass`, `partial`, `fail`, `na`, or `unknown` — the same states the root scorer replays later. Every non-unknown state needs evidence; never convert missing evidence into a pass.
216+
3. Record veto observations by their qualified framework item IDs, but do not calculate dimension, raw, capped, or final scores without the root deterministic scorer.
217+
4. Return `status: NEEDS_INPUT` or `status: BLOCKED` with `verdict: UNDECIDED`, `score_state: NOT_SCORED`, and `score_confidence: not_scored`. Clearly identify the unavailable root runtime as the reason.
218+
5. Do not write under `memory/audits/`, mutate registries, or claim a publish/ship decision. Offer the observation set for later execution in a full plugin or repository install.
219+
6. Do not search parent directories, accept an unverified runtime root, download repository files, or hand-calculate a substitute score.
220+
221+
The source digest binds this compact fallback to the authoritative runbook, scoring semantics, framework benchmark, run schema, and artifact schema without copying those maintenance sources into every standalone bundle.
222+
223+
---
224+
225+
End of generated standalone runtime.

0 commit comments

Comments
 (0)