Business Report Β· 2026-04-17
Evolvable Signal Engine β V1 Shipped
A feedback-driven scoring system that replaces rigid, set-and-forget weights with evidence-based signal lifecycle management. Built end-to-end today for the Trades $15M+ revenue-prediction project.
Executive Summary
Prior scoring systems had a fatal flaw: weights were hardcoded in Python, locked on a date, and changed only by rewriting code. Signals never earned their place β they inherited it. There was no record of which signals actually predicted outcomes and no way to add or retire a signal without a rewrite.
V1 installs the foundation that makes scoring evidence-driven and self-evolving. Every signal is a row in a registry. Every captured value is appended to an observation log. Every ground-truth event (calls, meetings, deal outcomes) is appended to an outcome log. A review job joins the two and computes predictiveness. Weights change because data says so, not because anyone opined.
All 33 signals in the first list generator (trades-15m) enter as probationaryat weight 0. They earn weight by predicting outcomes; they lose weight β or get retired β when they don't.
What Shipped β Three Deliverables
Deliverable 1
Signal list of known signals
A Supabase-backed registry of every signal we measure. Each row: description, data type, status (probationary/active/deprecated/retired), cost per observation, fallback rule, source vendor.
Deliverable 2
Signal engine
Python module (backend/lib/signal_engine.py) with 5 primitives: select_signals, record_observation, record_outcome, score_target, review_performance. CLI + end-to-end smoke-tested.
Deliverable 3
Review webpage
This site. Server-rendered from Supabase β projects, signals, costs, predictiveness all live. Zero redeploy to publish a new signal.
Architecture β Five Primitives
Signal Registry
signal_registryRows, not code. Each signal: status, current_weight, data_type, source_vendor, fallback_rule, cost_per_observation_usd.
Signal Observations
signal_observationsAppend-only log of every captured value per target. Polymorphic (any entity type). Records weight_at_time and scoring_event_id so history is reconstructable.
Outcome Observations
outcome_observationsAppend-only log of ground truth: call_connected, meeting_booked, deal_closed_won, revenue_truth, etc. The other half of the feedback loop.
Signal-Outcome Pairs
v signal_outcome_pairsView joining signals to subsequent outcomes for the same target. Feeds the nightly review job; also ad-hoc queries for 'does X predict Y?'.
Project Assignments
project_signalsLinks signals to list-generator projects with project-specific weights. Same signal can serve many projects with different weightings.
Cost View
v v_project_signal_costJoins project + signal + cost math for the review webpage. Cost per observation Γ batch size = cost per run.
Trades-15M Project β Live KPIs
Cost breakdown by cluster
| Cluster | Signals | $ / company | $ / batch (100) | % of total |
|---|---|---|---|---|
| Added by Claude | 7 | $0.8700 | $87.00 | 27.7% |
| Social Media | 6 | $0.7600 | $76.00 | 24.2% |
| Industry Involvement | 1 | $0.4000 | $40.00 | 12.7% |
| Website Wealth | 4 | $0.3200 | $32.00 | 10.2% |
| Business Maturity | 5 | $0.3050 | $30.50 | 9.7% |
| Paid Marketing | 3 | $0.2700 | $27.00 | 8.6% |
| Regulatory | 4 | $0.1500 | $15.00 | 4.8% |
| Reviews | 3 | $0.0670 | $6.70 | 2.1% |
| Total | 33 | $3.1420 | $314.20 | 100% |
Top-5 highest-cost signals
- enrich.industry-involvement-score.compositeComposite 0-100 score based on presence of: conference sponsorship (0-12pts), chamber of commerce involvement (0-12), guest speaker appearances (0-12), chapter president history (0-12), BNI membership (0-12), industry awards received (0-13), industry orgs listed on own website (0-13), paid sponsorships of any kind (0-14)$0.4000
- enrich.instagram-project-posts.socialCount of posts in trailing 12 months classified by vision model as showing finished/completed work$0.3500
- enrich.press-mentions-12mo.exaCount of news/press mentions in trailing 12 months$0.3000
- enrich.monthly-ad-spend-estimate.semEstimated monthly paid search spend in USD$0.2500
- enrich.tech-stack-indicators.builtwithCount of enterprise-tier technologies detected on website (HubSpot Enterprise, Salesforce, Shopify Plus, etc.)$0.2000
Who authored each signal?
Every signal is tagged with its author. The registry has three: Ewing (pre-existing Hermes/CRM signals), Mark (named today 2026-04-17), and Claude (proposed independently). Authorship is stored on signal_registry.added_by and shown on every view.
Ewing
8 registry Β· 0 in trades-15mPre-existing signals inherited from Hermes succession scoring and CRM buyer-fit research.
Mark
29 registry Β· 26 in trades-15mSignals Mark named today across 7 clusters (Social Media, Website Wealth, Reviews, Paid Marketing, Business Maturity, Regulatory, Industry Involvement).
Claude
7 registry Β· 7 in trades-15mBias-breakers Claude proposed: tech stack, job postings, press mentions, customer logos, marketing staff, financing options, fleet visibility.
Cost reality β tiered funnel, not flat scan
The $3.14/company number is the naive upper boundβ running every signal on every company. That's never the real cost. Real cost uses a tiered funnel: cheap signals filter the population, then only survivors get expensive ones.
Tier 1 β disqualify first
β€ $0.05 per obsRun on full population. Cheap enough that false positives don't matter. Includes: whois, google-rating, team-page, BBB, yelp, ad-transparency.
Tier 2 β score survivors
$0.05β$0.15Run only on targets that pass tier-1 filters. Includes: instagram activity, facebook, linkedin employee count, state license, fleet street view.
Tier 3 β deep dive
> $0.15Run only on top-ranked survivors. Includes: IG project vision, SEMrush ad spend, BuiltWith, press mentions, industry-involvement composite.
Example: scoring 10,000 companies
| Tier 1 on full population (10,000 Γ $0.3620) | $3620 |
| Tier 2 on survivors (1,000 Γ $1.0800) | $1080 |
| Tier 3 on top ranked (200 Γ $1.7000) | $340 |
| Tiered total | $5040 |
| Naive (flat scan) | $31420 |
| Saved vs. naive | $26380 (84%) |
Assumes 10% pass Tier 1 and 20% of those pass Tier 2. Actual rates come from real outcome data after the first few runs.
Signal Library β 3 Final Lists
β USED
from Mark's 2625 signals Β· 7 clusters
- β’ Social Media (6)
- β’ Website Wealth (4)
- β’ Reviews & Reputation (3)
- β’ Paid Marketing (3) inc. revenue-floor
- β’ Business Maturity (5)
- β’ Regulatory (4)
- β’ Industry Involvement (1 composite)
+ ADDED
by Claude7 signals Β· bias-breakers
- β’ Tech stack (BuiltWith)
- β’ Active job postings (Indeed)
- β’ Press mentions 12-mo (Exa)
- β’ Named customer logos (site+vision)
- β’ Marketing staff on LinkedIn
- β’ Financing options offered
- β’ Fleet visible count (Street View)
βΈ / β NOT USED
deferred + rejected3 items Β· with reasons
- βΈ Permits pulled (county). High value, but 50-state coverage is multi-quarter. Pilot 1 county first.
- βΈ Equipment/truck photos. Vision cost + inconsistent sources. Revisit after M7 (fleet branding) proves worth.
- β Generic gov-website mentions. Signal-to-noise too low; subsumed by state license + permits.
The highest-value signal in the library is score.revenue-floor-from-adspend.derived β the only causal signal (ad spend Γ 12 Γ· 0.25 margin = revenue floor). Everything else is correlational.
How signals evolve β the lifecycle
Probationary
Enters at weight 0. No contribution to score until enough outcome data.
Active
Earned weight from outcomes. Point-biserial r > threshold across β₯10 pairs.
Deprecated
Lost predictiveness or superseded. Weight drops but observations keep flowing for comparison.
Retired
Permanently off. Historical observations preserved; no new ones captured.
Signal Engine β CLI
# list all list-generator projects python -m backend.lib.signal_engine list-projects # list the signals assigned to a project w/ cost + weight python -m backend.lib.signal_engine list-signals trades-15m # run the nightly performance review (point-biserial r per signal) python -m backend.lib.signal_engine review --window-days 30 # end-to-end smoke test (score demo target + outcome + review) python -m backend.lib.signal_engine demo
Review pages
What's next (ordered)
- 1Wire Hermes score_and_rank.py to record_observation()Every scoring run starts writing append-only rows. Turns on the feedback-loop input side.
- 2Build gatherers β cheapest firstwhois, google-places, bbb-scrape, domain-age. Ship the free and near-free signals first so we generate volume for the review job.
- 3Deploy nightly review via scheduled-tasks MCPreview_performance runs nightly; results flow into signal_registry; morning digest surfaces candidates for status transitions.
- 4First weight assignment (not opinion-based)After 2β4 weeks of data, move signals with r > 0.2 from probationary to active and assign a real weight. First time weights change from zero.
Code & commit references
Shared Supabase: dwrnfpjcvydhmhnvyzov Β· Generated live on each page load.