Strategy Decisions β€” Locked 2026-04-17

Mark's Y/N answers on the 10 hardest unsolved problems. Each answer locks a design decision. No more debate on these β€” they are now engine rules.


1. Two-layer gate: Sell-intent Γ— Business-health β€” Y

Both layers must fire before a company reaches the shortlist. A healthy business whose owner isn't ready to sell is useless.

Engine build: separate scoring stacks. sell_intent_score and business_health_score each computed independently. Shortlist requires sell_intent_score > threshold_A AND business_health_score > threshold_B. No single-score blend.


2. No ZoomInfo-class revenue verification in v1 β€” Y

Accept we cannot reliably verify $15M–$50M revenue without paid data. Rank by probability-of-fit proxies: employees, locations, permits, certifications.

Engine build: revenue becomes a signal range, not a hard filter. Employee count Γ— state Γ— industry multiplier used as revenue proxy. No company hard-excluded for "unknown revenue."


3. Intuition weights Year 1, math after ~10 outcomes β€” Y

Ewing / CII / Mark judgment sets initial signal weights. Math takes over only after ~10 closed outcomes accumulate per signal. (Note: threshold lowered from 20 β†’ 10 in Mark's answer.)

Engine build: signal_registry.current_weight is editable by humans in Year 1. review_performance() is allowed to run but weight updates are gated behind observations_count >= 10. Before 10, it only reports β€” doesn't mutate.


4. Partial positive outcomes β€” Y

"Took our call" = 0.3 credit. "Opened response letter" = 0.1 credit. Real closes = 1.0. Gives the math real data faster than waiting 12+ months.

Engine build: outcome_type enum includes call_taken, letter_opened, meeting_held, loi_received, closed_won, closed_lost. Each carries a credit_weight. Point-biserial correlation computed on the weighted sum, not binary closes.


5. ONE master DNC list, cross-vertical, permanent β€” Y

Single global do-not-contact table. Applied to every search, every vertical, every partner. Permanent.

Engine build: dnc_list table, columns: company_name, domain, address_hash, phone_hash, added_at, added_by, reason. Every selection query does NOT IN (SELECT ... FROM dnc_list). No exceptions per vertical.


6. NC owns signal design centrally β€” N (partners do NOT own signal lists)

Mark overrode the audit question. Next Chapter owns all signal design; partners don't design lists for their own verticals.

Engine build: signal_registry.added_by stays limited to Ewing / Mark / Claude. Partners provide input (what matters in their vertical) but do not have write access. This simplifies the system β€” no per-partner forks of the signal set.


7. Owner-operator vs investor detection BEFORE letter drops β€” Y

Investor-owned companies auto-skipped. Only owner-operators get the letter.

Engine build: ownership_type is a required signal, gathered before letter generation. Values: owner_operator, family, investor, pe_backed, public, unknown. Letter pipeline skips any target where ownership_type IN ('investor', 'pe_backed', 'public'). unknown requires human review.


8. Multi-vertical fits get ONE outreach to best-fit partner β€” Y

Protects the seller experience. A precaster who also does structural doesn't get two letters.

Engine build: partner_assignment table stores company_key β†’ best_fit_partner_key with best_fit_score. Selection query dedupes across verticals. When a company qualifies for 2+ verticals, the highest best_fit_score wins.


9. PE-backed auto-excluded in v1 β€” Y

Even when signals are strong. V1 simplicity.

Engine build: identical to #7 β€” ownership_type = 'pe_backed' is a hard filter. Reconsider in v2 when we have data on PE responsiveness.


10. No auto-deprecation before N outcomes β€” Y

Engine cannot auto-deprecate any signal until it has seen at least N real outcomes tied to that signal. Protects against killing signals that haven't had a fair test.

Engine build: signal_registry.status transitions are gated. active β†’ deprecated requires observations_count >= N AND negative_correlation_months >= M. N defaults to 10 (matches #3). Humans can still deprecate manually.


Summary β€” the design rules these 10 answers lock in

#Rule
1Two-gate shortlist: intent AND health, both must fire
2Revenue is a proxy, not a filter
3Humans set weights in Year 1; math unlocks at 10 obs
4Partial outcomes count; correlate on weighted sum
5Global DNC, permanent, no exceptions
6NC owns signal design; partners advise only
7Owner-operator detection is pre-letter, not post-letter
8One company, one outreach, one partner β€” ever
9PE-backed = hard exclude in v1
10No auto-deprecate before 10 observations

What Mark still needs to answer (the 25 MC questions)

The 25 multiple-choice questions are published but not yet answered. Those lock the how of each signal β€” units, cadence, source preference. Once answered, the registry is fully specified and gatherer build can begin without further rules debate.

25 Signal Engine Questions β†’

Tasks from this artifact (6)

See all β†’