# Put every article on the site first (canonical home) The site is the canonical copy; every other platform points at it. This file is the exact checklist the agents follow. Paths are relative to your site source folder; the original uses a Python static build (build.py) deployed to Vercel. ## 0. Take the build lock Take `agents/locks/site-build.lock` before editing the catalog or building. If another agent holds it and it is under 20 minutes old, wait. Delete it after the deploy is verified. ## 1. Add it to the catalog Append one entry to `articles/catalog.py` (or your equivalent): - `slug`: short, keyword-first, lowercase-hyphens. Never change it after publishing. - `topics`: 1 to 3 topic slugs from a fixed list. Only add a new topic when 3+ articles would share it. Topics drive the index, search and the /articles/topic// hubs. - `kw`: one search phrase people really type. Check it with Google autocomplete: `https://suggestqueries.google.com/complete/search?client=firefox&q=`. No made-up search volumes. - `title` (about 60 chars, keyword near the front, still true) and `desc` (140 to 160 chars, true, no em dashes). - `offer`: the one call to action that matches the topic. `tools`: 1 to 3 internal links. ## 2. Import, back up, build ``` python articles/import_articles.py # images -> webp, og image, content json cp -r ../_deploy/site ../_deploy/site.bak-$(date +%m%d-%H%M) python build.py # must report the article count and pass the SEO check ``` If build.py changed since you last read it, re-read it first. Data files (data.csv) may need copying into the deploy folder by hand; check they return 200. ## 3. Deploy and verify ``` cd ../_deploy/site && vercel deploy --prod --yes curl -s -o /dev/null -w '%{http_code}' https:///articles// # expect 200 ``` Also check that /articles/ lists it first and that the feed and sitemap.xml contain it. ## 4. IndexNow (every deploy) Right after the deploy and the 200 check, submit only new or changed URLs to IndexNow (Bing, Yandex, Naver, Seznam). Diff the deployed sitemap's per-page lastmod against a saved state file; expect HTTP 202. Run it after the deploy, never before: it checks the live key file at `https:///.txt`. Google ignores IndexNow, so also do step 6. ## 5. Canonicals on copies - dev.to: PUT `https://dev.to/api/articles/` with `{"article":{"canonical_url":"https:///articles//"}}` and header `api-key: ` read from a local file (never print it). On a 401, stop and report. Do not look for other keys. - New dev.to posts: set canonical_url in the front matter at publish time. - Medium: import from the site URL (that sets the canonical). Substack has no canonical field, so its first line links the site copy. ## 6. Search Console In the signed-in browser, open your own tab, inspect the new URL and click Request indexing. Do not sign out, do not switch accounts, close only the tabs you opened. Rules: every number checked against a source, no em dashes, no fake reviews or ratings in schema.