Make a company's published inbox the lead when its site names nobody - #71
Merged
Merged
Conversation
A crawl of a site that names no person recorded the company and its support@ address and then stopped: a recommendation only ever hangs off a person, so a family-run store with one shared mailbox ended as a company row and an empty queue. Vendor sites forwarded for outreach are usually exactly this shape (instantpeptides.com was the one that surfaced it, issue #70). The crawl now queues the inbox itself as a lead of a new kind, `company_inbox`, when and only when the page named nobody. It walks the same chain as a named person: site identity at 0.9 confidence, a signal that cites the published address and the company's own description, scoring, a `send_email` card, the policy engine and the approval queue. Nothing about the address changes hands: no email identity is written, so `pickEmailRecipient` still resolves the company inbox as shared and every shared-inbox limit applies as before. Where the row being an inbox rather than a person matters, the kind is read: `isLikelyRoleAccount` is bypassed for this one deliberate, typed row (scraped role words are still rejected); the composer writes to "the <company> team" about what the site says instead of greeting a first name and quoting nobody; `proposeAddresses` and the photo sweep leave it alone; the approval card labels it "Company inbox". Migration 0034 adds `people.kind` (default `person`). Also formats the OpenAccess descriptor that has had `main`'s format check red since #69. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W7ec4VgoKNWeoESuvtKK3i
ralyodio
marked this pull request as ready for review
September 13, 2026 00:00
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.
Closes #70 (the product half; the dead model chain in that issue is a keys problem, not a code one).
The gap
A crawl of a site that names nobody recorded the company and its
support@and then stopped. A recommendation only ever hangs off a person, so a family-run store with one shared mailbox ended as a company row and an empty queue. instantpeptides.com surfaced it; vendor sites forwarded to bot@ for outreach are usually this shape.What changes
people.kind(migration 0034, defaultperson). A new value,company_inbox, marks the row that stands in for a company's published inbox. It is set deliberately by the crawl, never inferred from a scraped name;isLikelyRoleAccountstill rejects "webmaster" and "admin".send_emailcard, policy, approval.pickEmailRecipientresolves the company inbox as shared and every shared-inbox limit applies unchanged.company_inboxprospect the prompt names "the <company> team", says nobody specific is named, and grounds in what the site says rather than what a person said.proposeAddresseswill not inventfirstname@from a company name; the photo sweep skips it.kindis on the people list, person detail and card rows.apps/web/public/.well-known/openaccess.json, which has hadmain's format check red since Serve an OpenAccess descriptor #69.Tests
company_inboxlead with no first name, no email identity, the company'scontact_email, a signal naming the address, and a pendingsend_emailcard; a second crawl of the same site finds the same lead, not a second one.bun run checkgreen locally: format, typecheck (root andapps/web), 1472 tests.Not verified in prod
Drafting still needs a working model key and every provider in the chain is dead as of 2026-09-12 (see #70). The crawl and the card do not need a model; the draft does.
🤖 Generated with Claude Code
https://claude.ai/code/session_01W7ec4VgoKNWeoESuvtKK3i