Skip to content

chore(readme): sync utm-links.csv and guard it in CI - #878

Open
oktaygoktas wants to merge 2 commits into
mainfrom
chore/utm-links-sync-and-guard
Open

chore(readme): sync utm-links.csv and guard it in CI#878
oktaygoktas wants to merge 2 commits into
mainfrom
chore/utm-links-sync-and-guard

Conversation

@oktaygoktas

Copy link
Copy Markdown
Collaborator

Stacked on #877 — base is docs/readme-pr-af-hero, so this diff shows only the manifest work. Merge #877 first; GitHub will retarget this to main automatically.

The gap

assets/utm-links.csv is the manifest of every UTM-tagged link in the README — marketing reads it to audit campaign coverage. Nothing enforced that it stayed in sync, so it drifted across successive README rewrites.

Measured on main:

Count
Unique utm_ids in README.md 45
Unique utm_ids in the CSV 37
Missing rows 9 (incl. pr-af, added in #877)
Stale rows 1

No row had wrong data — for all shared IDs the CSV target matched the README exactly. The problem was purely coverage.

Sync

8 rows added (the 9th, pr-af, lands in #877):

utm_id README Target
github-readme-harness-banner L22 /docs/build/intelligence/harness
github-readme-prompt-to-production L52 /docs/learn/build-with-claude-code
github-readme-full-features L263 /docs/learn/features
github-readme-explore-features L405 /docs/learn/features
github-readme-see-all-examples L500 /examples
github-readme-architecture L510 /docs/learn/architecture
github-readme-community-docs L597 /docs/learn
github-readme-community-examples L597 /docs/learn/examples

1 stale row droppedgithub-readme-blog-iam. The post is still live, but the link was removed from the README in 859174f4 ("scale-first README rewrite"); the row outlived it.

1 host normalizedwww.agentfield.ai/examplesagentfield.ai/examples. It was the only www. link among 61; the apex URL returns 200, so analytics stop splitting by host.

1 cosmetic fix — missing space in the cloudsecurity row name, so all six "Built with AF" rows read identically.

Guard

scripts/check-utm-links.py — stdlib only, no dependencies. Fails on:

  1. a README link whose utm_id has no CSV row
  2. a CSV row whose utm_id no longer appears in the README
  3. a CSV target that disagrees with the README's actual URL
  4. an agentfield.ai link carrying no UTM params (allowlisted: install.sh, which is piped into a shell)
  5. a link using the www. host

For anything missing it prints the exact CSV row to paste, so the fix is copy-paste.

.github/workflows/readme-links.yml runs it on PRs touching README.md, the manifest, or the checker. pull_request (not pull_request_target), contents: read, no untrusted input in any run: step.

Verification

Each failure mode was exercised against a sandbox copy:

  • against main's state → correctly reports all 9 missing + 1 stale
  • link deleted from README → flags the orphaned row
  • CSV target mutated → reports README vs CSV side by side
  • untagged link added → flags with file:line
  • www. link added → flags with file:line
  • this branchutm-links check passed — 45 tracked links, all present in utm-links.csv

Run locally: python3 scripts/check-utm-links.py

🤖 Generated with Claude Code

oktaygoktas and others added 2 commits August 4, 2026 23:54
Swap the pr-af card image for the repo's hero chart (#1 open-source on
Code-Review-Bench) and rewrite the caption to match. Normalize the link
to the /github/<slug>/ form used by every other card, and add the
missing pr-af row to assets/utm-links.csv.

The previous image is kept at assets/examples/agentic-pr-reviewer.png.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The CSV is the manifest of every UTM-tagged link in the README, but nothing
enforced that it stayed in sync, so it drifted across successive README
rewrites: 8 tracked links had no row, and one row pointed at a link deleted
in 859174f.

Sync:
- add the 8 missing rows (harness-banner, prompt-to-production, full-features,
  explore-features, see-all-examples, architecture, community-docs,
  community-examples)
- drop the stale blog-iam row
- normalize the one www.agentfield.ai link to the apex domain, so analytics
  don't fragment by host
- fix the missing space in the cloudsecurity row name

Guard:
- scripts/check-utm-links.py fails on a README link with no row, a stale row,
  a target that disagrees with the README, an untagged agentfield.ai link, or
  a www. host. Reports the exact row to paste. Stdlib only.
- .github/workflows/readme-links.yml runs it on PRs touching README.md,
  the manifest, or the checker.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@oktaygoktas
oktaygoktas requested review from a team and AbirAbbas as code owners August 5, 2026 04:27

@santoshkumarradha santoshkumarradha left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked the manifest sync plus the new guard script/workflow. The check is stdlib-only, the failure modes are concrete, and the README/CSV normalization is sensible. This looks good once the stack is on top of main.

Base automatically changed from docs/readme-pr-af-hero to main August 5, 2026 13:30
@santoshkumarradha
santoshkumarradha dismissed their stale review August 5, 2026 13:30

The base branch was changed.

@santoshkumarradha santoshkumarradha left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retargeted cleanly onto main after #877 landed. I rechecked the manifest sync and guard workflow on the new base, and this still looks good to merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants