Send past the held cards, say what holds them, and put a face on each lead - #68
Merged
Merged
Conversation
… lead Autopilot sent six messages a day against a queue of 597 and a cap of 200. The candidate window was `cap - sent today` rows in priority order, and the top of that order was a hundred and twenty prospects who all resolve to a handful of shared company inboxes already inside their weekly limit. Every tick read the same window, held every card in it, and stopped, while 172 cards with a personal address sat just past it and were never looked at. - The window is now a ceiling that only keeps a run finite; the loop stops at the cap, not at the window. Address gates run from a per-run memo before the per-person query and before any model draft, so a held card costs a comparison rather than a query and a draft nobody will send. - A hold is written to the live feed when it is new or changes, not every tick: one day produced 18,532 identical rows for 120 people, enough to make the day's events unreadable. `HoldLedger` remembers, and feeds the digest. - The digest splits "Awaiting approval: 1117" into what autopilot will send (and how many of those a limit is holding, and why) and what only a person can act on, by network. - An address given in a consented import is the person's own. The sender, the approve path, the queue badge and the recommender all read only `social_identities`; 15,917 imported contacts were invisible to all four. - An active campaign whose seed has not been read in a week is asked again when it has no work outstanding. Every campaign was seeded exactly once, and the digest had read "sites read 0" for ten days. - A picture for each lead: Gravatar's avatar is kept instead of dropped, and a ValueSERP image search accepts a result only when its page is the person's LinkedIn profile or their company's own domain, titled with their name. The profile URL is recorded as research. Shown in the digest, the prospect pages and the approval card; capped per tick and per day. Migration 0033 adds `people.avatar_url`, `avatar_source`, `photo_looked_up_at` and `campaigns.reseeded_at`. New env: `VALUESERP_API_KEY`, `PHOTO_LOOKUPS_PER_DAY`. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01234vh2fZQDqyXTEY8XBi4S
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why six a day
The digest said "0 new leads, 6 sent, Awaiting approval 1117". Prod had 597 pending email cards, every campaign on autopilot, a 200/day cap. None of the caps were binding.
runAutopilotread candidatesORDER BY priority LIMIT (cap - sentToday). The top 194 all resolved to a handful of sharedsupport@inboxes already inside the 2/week address limit or the 48h cooldown. Every tick read the same 194, held them all, stopped. 172 cards with a personal address sat at rank 195+ and were never looked at.What changed
person_emailswere invisible to the sender, the approve path, the queue badge and the recommender's reachability check. All four now fall back to the imported address. Nothing enrolls them into a campaign automatically.ValueSerpClientdoes one image search per person and accepts a result only when its page is alinkedin.com/in/profile or the company's own domain, titled with the person's name; the profile URL is recorded as a research identity at 0.6. Sweep is 20/tick andPHOTO_LOOKUPS_PER_DAY(default 300) per workspace. Avatars show in the digest,/prospects,/prospects/[id]and the approval card.Migration
0033_avatars_and_reseed.sql. New env:VALUESERP_API_KEY(unset means Gravatar only),PHOTO_LOOKUPS_PER_DAY.Verified
bun run check: 1468 tests pass, typecheck clean, format clean.apps/webbuild passes.🤖 Generated with Claude Code
https://claude.ai/code/session_01234vh2fZQDqyXTEY8XBi4S