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.

44 signals registered33 assigned to trades-15m8 clusters$3.1420 per company$314.20 per 100 batch

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.

44 signals Β· 44 probationary

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.

5 primitives Β· 1 CLI Β· psycopg2 direct

Deliverable 3

Review webpage

This site. Server-rendered from Supabase β€” projects, signals, costs, predictiveness all live. Zero redeploy to publish a new signal.

3 routes Β· Next.js 16 Β· Tailwind

Architecture β€” Five Primitives

1

Signal Registry

signal_registry

Rows, not code. Each signal: status, current_weight, data_type, source_vendor, fallback_rule, cost_per_observation_usd.

2

Signal Observations

signal_observations

Append-only log of every captured value per target. Polymorphic (any entity type). Records weight_at_time and scoring_event_id so history is reconstructable.

3

Outcome Observations

outcome_observations

Append-only log of ground truth: call_connected, meeting_booked, deal_closed_won, revenue_truth, etc. The other half of the feedback loop.

4

Signal-Outcome Pairs

v signal_outcome_pairs

View joining signals to subsequent outcomes for the same target. Feeds the nightly review job; also ad-hoc queries for 'does X predict Y?'.

5

Project Assignments

project_signals

Links signals to list-generator projects with project-specific weights. Same signal can serve many projects with different weightings.

6

Cost View

v v_project_signal_cost

Joins project + signal + cost math for the review webpage. Cost per observation Γ— batch size = cost per run.

Trades-15M Project β€” Live KPIs

Signals assigned
33
Cost per company
$3.1420
Cost per batch (100)
$314.20
Clusters
8

Cost breakdown by cluster

ClusterSignals$ / company$ / batch (100)% of total
Added by Claude7$0.8700$87.0027.7%
Social Media6$0.7600$76.0024.2%
Industry Involvement1$0.4000$40.0012.7%
Website Wealth4$0.3200$32.0010.2%
Business Maturity5$0.3050$30.509.7%
Paid Marketing3$0.2700$27.008.6%
Regulatory4$0.1500$15.004.8%
Reviews3$0.0670$6.702.1%
Total33$3.1420$314.20100%

Top-5 highest-cost signals

  • enrich.industry-involvement-score.composite
    Composite 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.social
    Count of posts in trailing 12 months classified by vision model as showing finished/completed work
    $0.3500
  • enrich.press-mentions-12mo.exa
    Count of news/press mentions in trailing 12 months
    $0.3000
  • enrich.monthly-ad-spend-estimate.sem
    Estimated monthly paid search spend in USD
    $0.2500
  • enrich.tech-stack-indicators.builtwith
    Count 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-15m

Pre-existing signals inherited from Hermes succession scoring and CRM buyer-fit research.

Mark

29 registry Β· 26 in trades-15m

Signals Mark named today across 7 clusters (Social Media, Website Wealth, Reviews, Paid Marketing, Business Maturity, Regulatory, Industry Involvement).

Claude

7 registry Β· 7 in trades-15m

Bias-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 obs
$0.3620
18 signals

Run 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.15
$1.0800
9 signals

Run 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.15
$1.7000
6 signals

Run 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 26

25 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 Claude

7 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 + rejected

3 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

Step 1

Probationary

Enters at weight 0. No contribution to score until enough outcome data.

Step 2

Active

Earned weight from outcomes. Point-biserial r > threshold across β‰₯10 pairs.

Step 3

Deprecated

Lost predictiveness or superseded. Weight drops but observations keep flowing for comparison.

Step 4

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)

  1. 1
    Wire Hermes score_and_rank.py to record_observation()
    Every scoring run starts writing append-only rows. Turns on the feedback-loop input side.
  2. 2
    Build gatherers β€” cheapest first
    whois, google-places, bbb-scrape, domain-age. Ship the free and near-free signals first so we generate volume for the review job.
  3. 3
    Deploy nightly review via scheduled-tasks MCP
    review_performance runs nightly; results flow into signal_registry; morning digest surfaces candidates for status transitions.
  4. 4
    First 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

backend/data/20-SIGNAL-REGISTRY.sql β€” registry + observations + outcomes + pairs view
backend/data/21-SIGNALS-TRADES-15M.sql β€” 34 INSERT statements for trades verticals
backend/data/22-SCORING-PROJECTS.sql β€” cost columns + projects + project_signals + cost view
backend/data/23-TRADES-15M-PROJECT-SEED.sql β€” cost estimates + project + 33 assignments
backend/lib/signal_engine.py β€” the 5 primitives + CLI
next-chapter-os/src/app/{projects,signals,report}/* β€” this site

Shared Supabase: dwrnfpjcvydhmhnvyzov Β· Generated live on each page load.

Built 2026-04-17 by Mark DeChant + Claude Code. All rules in this document are enforced by the database, not convention.