The most useful contribution is a vertical guide for a category that has none.
- Copy
skills/apple-ads-strategy/references/verticals/_TEMPLATE.md. - Fill every section. Do not add the guide until no template slots, checklists, stubs, or
TODO(owner)markers remain. - Every number is sourced or given as a range to calibrate. When evidence is unavailable, state which first-party input must be measured and keep its value explicitly unknown. A fabricated CPI benchmark is worse than none, because the agent will act on it.
- Add a row to
skills/apple-ads-strategy/references/INDEX.md. A guide with no INDEX row is never opened. node scripts/lint-playbooks.mjsandnode scripts/lint-workflows.mjsmust pass.
verticals/utility-tv-remote.md is the worked example. Imitate its section order and its discipline
about numbers.
Same contract, in skills/apple-ads/references/playbooks/. Two rules that are not obvious:
- Command syntax never goes in a playbook. It lives in
references/asa-management.mdandreferences/asa-metrics.md, which are generated. A playbook carries decisions; the reference carries syntax. Duplicating syntax is how the library starts lying. uses:is checked. The linter fails if a playbook claims a command the synced reference does not document. That is deliberate — it is the mechanism that stops hallucinated flags.
Anything with a GENERATED header:
skills/apple-ads/references/asa-management.mdskills/apple-ads/references/asa-metrics.mdskills/adapty-cli-setup/SKILL.md
These are synced one-way from adaptyteam/adapty-cli
(docs/agent/). Edit them there; the next sync overwrites anything changed here.
README.md is canonical. After changing it, retranslate README.zh-CN.md and README.tr.md, then
run node scripts/lint-i18n.mjs --update. CI fails on a stale translation.
Skill and reference files are English only, by design — the agent reads English and answers in the user's language. Three translations of a safety rule is three chances for one of them to drift.