Skip to content

feat(outreach): move distribution tracking to Airtable#22

Open
Ducksss wants to merge 1 commit into
mainfrom
claude/pedantic-moore-e4e7f4
Open

feat(outreach): move distribution tracking to Airtable#22
Ducksss wants to merge 1 commit into
mainfrom
claude/pedantic-moore-e4e7f4

Conversation

@Ducksss

@Ducksss Ducksss commented Jul 1, 2026

Copy link
Copy Markdown
Owner

What & why

Outreach/distribution tracking lived in LAUNCH.md as hand-edited Markdown tables that the agent.md outreach agent committed to git. To run several outreach agents in parallel, that model breaks — parallel runs collide on the shared branch and on LAUNCH.md (merge conflicts, lost updates, duplicate submissions to the same target). This moves tracking to an Airtable base with atomic upserts and a claim protocol, and slims LAUNCH.md to the parts that are actually doctrine.

Changes

  • scripts/outreach-tracker.mjs (new): zero-dependency Node helper (list / get / claim / release / upsert / set-status / log) with upsert-on-Key dedup, a 15-minute claim protocol, and 429 back-off. Kept out of the npm package via the files whitelist (npm pack contains 0 scripts/ entries).
  • agent.md: reads and writes the tracker instead of LAUNCH.md; adds Concurrency (claim-before-act) and Owned Listings On Release sections; drops the LAUNCH.md commit step from Durable State (a normal run now makes no repo commit).
  • LAUNCH.md: slimmed to positioning, channel copy, launch order, policy gates, and metrics, with a pointer to the Airtable base. No more per-target tables.
  • archive/launch-ledger-history.md: marked frozen (pre-Airtable record).
  • .gitignore: token guards. Makefile: make outreach helper target.

The 80 existing outreach rows were migrated into the base separately; this PR is the code/docs cutover.

Verification

  • make lint and make test pass.
  • Concurrency proven against the live base: simultaneous claim from two workers — exactly one succeeds, the other exits non-zero; release clears it; an idempotent no-op upsert keeps exactly one row.

Follow-ups (manual, not in this PR)

  • Airtable UI cleanup (the API cannot delete tables or select options): remove the builder-generated Merge Queue table and trim the junk select-field options.
  • Rotate the Airtable personal access token.

🤖 Generated with Claude Code

Replace the hand-edited LAUNCH.md ledger with an Airtable base so multiple
outreach agents can run in parallel without racing on a shared file.

- Add scripts/outreach-tracker.mjs: zero-dependency Node helper
  (list/get/claim/release/upsert/set-status/log) with upsert-on-Key dedup, a
  15-minute claim protocol, and 429 backoff. Kept out of the npm package.
- Redirect agent.md to read and write the tracker instead of LAUNCH.md; add
  Concurrency and Owned-Listings-On-Release sections; drop the LAUNCH.md commit
  step from Durable State.
- Slim LAUNCH.md to positioning, channel copy, launch order, policy gates, and
  metrics, with a pointer to the Airtable base.
- Freeze archive/launch-ledger-history.md as the pre-Airtable record.
- Add token guards to .gitignore and a `make outreach` helper target.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 1, 2026 18:01

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

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