# AGI House applicant-scoring system — recovered method

**Lane:** METHOD-AGI · **Date:** 2026-08-04 · **Scope:** read-only archaeology inside
`~/LEGIONFARM-3.0/public/agi-house/` · **Companion machine-readable file:**
`05_graph/methods/weights_agihouse.json`

All paths below are relative to `~/LEGIONFARM-3.0/public/agi-house/` unless absolute.

---

## Executive summary

1. The core rubric is a **6-role weighted-sum score (0–100)** — founder, engineer, researcher,
   product_leader, investor, media — with **42 distinct numeric weights/thresholds** quoted verbatim
   from `8.2 detailed score prompt` §6 (23,461 bytes) and embedded unchanged in five later prompts.
2. Every role score rides on a shared **company-quality sub-score `C_Score` (0–20)** computed from
   funding stage, VC tier, a ×5.0 Tier1-lead boost, raised-amount buckets and headcount
   (`8.2` §6.1) — the single most consequential design decision, because it couples a person's
   score to their company's fundraising.
3. The system **OPERATED at scale**: **13,619** of 13,733 records in `Full-enriched-DB.json`
   (449,758,138 bytes) carry `step_8_2_detailed_score_prompt_completed: true` with real per-role
   comments in the mandated audit template (counted; commands below).
4. Operation is independently proven by money: **20 transactions totalling $1,861.47**
   (2025-10-26 → 2025-11-30) in `costs/transactions.csv` to exactly the prompted providers —
   OpenRouter ($728.20), Firecrawl ($466.12), Cursor ($260), Perplexity ($160), SerpAPI ($75),
   n8n Cloud ($60), Bright Data ($50), SearchAPI ($40), OpenAI ($22.15).
5. The circulating claim **"40+ research calls for each of the 13,733 records" merges two
   different things**: 13,733 is the streamed top-level record count of `Full-enriched-DB.json`
   (not a count of scored profiles — that number is 13,619); "40+ calls" is a
   *design quota* from `8.1 deep-profile-research` §4.3 that was **never persisted** —
   `run_stats_8_1` occurs **0** times in the 450 MB DB. Actual calls-per-profile is unrecorded.
6. The matching pass (8.3) and the extended-database writeback are **DESIGNED but barely operated**:
   `matching_v2` occurs **0** times in the big DB and **0** in `applicants.json` (312 records);
   the mandated extended DB holds only **20** ids (`extended database/all_ids.json`).
7. The founder-impact elevation pipeline (valuation/ARR deltas vs first AGI House event) produced
   **165** records (`impact/founders-impact.v1.json`), of which only **18** have a *verified*
   first-event valuation — the rest are stage-median or ARR-multiple estimates, exactly as the
   prompt's `verification_precedence` ladder allows.
8. Operated output drifted from design: `confidence_overall` was designed as `low|medium|high`
   but the 165-record file contains **13 distinct tokens** (`very_low`, `low-medium`, `N/A`,
   `low_for_founder_scoring`, …) — the model improvised past the enum in production.
9. The newest prompt generation (`impact/prompts/n8n 2 (inactive)/`, 4 nodes, 2025-11-19/20) is
   **DESIGNED-only** — its own `CHANGELOG.md` says "batch-local; not pushed to n8n yet".
10. Deployment is proven by git: **15 commits**, ten of them
    `Deploy Impact page to /agi-house/impact with data URL overrides; fix People link`
    (`git log --oneline` in the agi-house repo).

---

## The scoring rubric, reconstructed

The rubric exists in one canonical text — `8.2 detailed score prompt` §5–§6 (2025-10-27) — copied
**byte-identical** into `8 copy.2 detailed score prompt` (2025-11-04), `New1.3: Deep Research &
Scoring Orchestrator` §12 (2025-11-01), `n8n_agent_workflow.md` §12 (2025-12-18),
`n8n_agent_workflow_1.md` §11, and `impact/prompts/n8n 1/ Old: profile` §6. Quotes below are from
the canonical file.

### Pass 0 — C_Score, the shared company-quality sub-score (0–20)

> **6.1) Global company score C_Score (0–20)**
> - VC tier multiplier (highest appearing): Tier1=2.5, Tier2=1.75, Tier3=1.25, none=1.0.
> - Lead round boost: if any Tier1 VC led a round → multiply the VC tier term by 5.0 (cap C_Score later).
> - Series multiplier (highest round): Seed=1.0, A=1.5, B=2.0, C=2.5, D+=3.0.
> - Raised points: <5M=1, 5–20M=2, 20–50M=3, 50–100M=4, 100–250M=5, 250M+=6.
> - Bootstrapped ARR bonus: +2 if ARR>0.5M without funding (from press/site).
> - Employee size points: 1–100=1, 100–500=2, 500+=3.
> - Formula (cap and normalize):
>   - `C_raw = (Series_Multiplier × VC_Tier_Multiplier × Lead_Boost) + Raised_Points + ARR_Bonus + Employee_Points`
>   - `C_Score = min(20, round((C_raw / 15) × 20))`

The VC tier list is a curated mapping table, not model judgement (§5.1): "Tier1: Sequoia,
Andreessen Horowitz, Benchmark, Founders Fund, Khosla Ventures, Bessemer, Lightspeed, Greylock,
Accel, Index, NEA, YC, General Catalyst, Coatue, Tiger, DST." Unknown funds default to Tier3.

### Passes 1–6 — the six role scores (0–100 each)

**Founder** (§6.4):

> - Base: `F_base_100 = round( (0.25·Founder_Title + 0.15·CoFounder_Flag + 0.15·Prior_Exit + 0.20·Team_Size_Norm + 0.15·Revenue_Norm + 0.10·Press_Traction_Norm) × 100 )`
> - Final: `F_Score = clamp( F_base_100 + 3.0 × C_Score, 0, 100 )`, then apply Location boost.
> - Hard-zero: if no evidence of founder/cofounder roles across LinkedIn/press → F_base_100=0; still can get >0 via C_Score only if candidate is executive at high-C company.

Component derivations (§6.4.1): Founder_Title "1.0 for CEO/Founder/Co-founder; 0.7 for CTO/CPO
with founding year match; 0.4 for VP-level at <50 employees at inception." Prior_Exit "1.0
acquired/IPO; 0.5 acqui-hire/undisclosed; 0 otherwise." Team_Size_Norm "1–10→0.2, 11–50→0.4,
51–200→0.6, 201–500→0.8, 500+→1.0." Revenue_Norm "ARR buckets: <1M=0.2, 1–5M=0.4, 5–20M=0.6,
20–50M=0.8, 50M+=1.0 (if credible)."

**Engineer** (§6.5):

> - Stars_Norm = min(1.0, log10(1 + github.stars_total)/3.0)
> - Top_Repos_Norm = min(1.0, sum(top_repos.stars buckets)/1000)
> - Contributions_Norm = min(1.0, contributions_year/1000) if available
> - Seniority_Norm = 1.0 for Staff+/Principal/Director; 0.7 Senior; 0.5 Mid; 0.3 Junior
> - Org_Tier_Norm = 1.0 Tier1 FAANG/MAANG/Top infra; 0.8 Tier2; 0.6 Tier3
> - Recency/Growth adjustments: if stars_total growth > 30% YoY or contributions_year increased ≥ 25% YoY, add up to +5 to base before multipliers.
> - Base: `E_base_100 = round(100 × (0.38·Stars_Norm + 0.20·Top_Repos_Norm + 0.15·Contributions_Norm + 0.17·Seniority_Norm + 0.10·Org_Tier_Norm))`
> - Final: `E_Score = clamp( 0.7 × E_base_100 + RoleMultiplier(Engineer) × C_Score, 0, 100 )`, then apply Location boost.
> - Hard-zero: if github absent AND no engineering titles in LinkedIn/press → E_Score=0.

**Researcher** (§6.6):

> - HIndex_Norm = min(1.0, h_index/40)
> - Citations_Norm = min(1.0, log10(1 + citations)/4)
> - Publications_Norm = min(1.0, publications_count/20)
> - Patents_Norm = min(1.0, patents_count/10)
> - Venue_Tier_Norm = 1.0 top-tier (NeurIPS/ICML/ACL/CVPR/IEEE TPAMI/etc.), 0.7 mid-tier, 0.4 others
> - Recency bonus: if ≥2 publications in last 24 months in Tier1 venues, +5; if patents in last 24 months, +3.
> - Base: `R_base_100 = round(100 × (0.33·HIndex_Norm + 0.25·Citations_Norm + 0.22·Publications_Norm + 0.10·Patents_Norm + 0.10·Venue_Tier_Norm))`
> - Final: `R_Score = clamp( 0.8 × R_base_100 + 0.5 × C_Score × Org_Research_Tier, 0, 100 )`, then apply Location boost.  (Org_Research_Tier = 1.5 Tier1, 1.2 Tier2, 1.0 Tier3)
> - Hard-zero: if no publications/citations/patents evidence → R_base_100=0 (may still get small boost from Org via C_Score).

**Product leader** (§6.7):

> - Base: `PL_base_100 = round(100 × (0.32·PM_Title_Norm + 0.38·Launches_Press_Norm + 0.20·KPI_Language_Norm + 0.10·CrossFunc_Norm))`
> - Final: `PL_Score = clamp( 0.6 × PL_base_100 + 2.0 × C_Score, 0, 100 )`, then apply Location boost.
> - Hard-zero: if no PM/Head of Product roles across LinkedIn/press → PL_base_100=0.

(PM_Title_Norm: "1.0 for VP/Head of Product; 0.8 Group PM/Director; 0.6 Senior PM; 0.4 PM; 0.2
APM." Launches_Press_Norm: "sigmoid by count and quality; top-tier tech press > company blog >
personal blog." Recency bonus +3 for ≥2 credible launch mentions in 18 months.)

**Investor** (§6.8):

> - Final: `I_Score = clamp( round(100 × (0.35·Investment_Count_Norm + 0.25·Led_Round_Norm + 0.15·Largest_Check_Norm + 0.15·Portfolio_Tier_Norm + 0.10·Social_Proof_Norm)), 0, 100 )`, then apply Location boost.
> - Hard-zero: if no evidence of investments/funds/angel activity in Crunchbase/press → I_Score=0.

(Investment_Count_Norm = min(1.0, investments_count/20), "count distinct portfolio companies on
Crunchbase; dedupe press repeats". Led_Round_Norm = min(1.0, led_rounds_count/10).
Largest_Check_Norm: "Seed ≤ $500k = 0.2; Seed $500k–$2M = 0.4; A $2–10M = 0.6; B $10–30M = 0.8;
C+ >$30M = 1.0 (based on round totals if individual check unknown)." Portfolio_Tier_Norm: 1.0/0.7/0.4
by max portfolio tier, "+0.1 bonus (capped at 1.0)" for multiple Tier1 portfolio companies.)

**Media** (§6.9):

> - Twitter_Norm = min(1.0, log10(1 + followers)/4)
> - YouTube_Norm = min(1.0, log10(1 + subscribers_or_views)/5)
> - Talks_Norm = min(1.0, talks_count/10)
> - Podcasts_Norm = min(1.0, podcast_appearances/10)
> - Consistency bonus: +3 if consistent monthly output over last 12 months (talks/videos/posts ≥ 9 months), else +0.
> - Final: `M_Score = clamp( round(100 × (0.32·Twitter_Norm + 0.26·YouTube_Norm + 0.27·Talks_Norm + 0.15·Podcasts_Norm)) + Consistency_Bonus, 0, 100 )`, then apply Location boost.

("Twitter_Norm: treat 1k≈0.25, 10k≈0.5, 100k≈0.75, 1M≈1.0 (via log scaling as above)." "Podcasts_Norm:
count unique shows; deprioritize self-hosted.")

### Weights table (canonical)

| Pass | Component | Weight / rule | Range |
|---|---|---|---|
| C_Score | Series × VC-tier × Lead-boost, + raised pts + ARR bonus + employee pts | `min(20, round(C_raw/15×20))` | 0–20 |
| Founder | Title .25 · CoFounder .15 · PriorExit .15 · TeamSize .20 · Revenue .15 · Press .10 | `base + 3.0×C_Score`, clamp | 0–100 |
| Engineer | Stars .38 · TopRepos .20 · Contribs .15 · Seniority .17 · OrgTier .10 | `0.7·base + mult×C_Score` | 0–100 |
| Researcher | h-index .33 · Citations .25 · Pubs .22 · Patents .10 · Venue .10 | `0.8·base + 0.5·C_Score·OrgTier` | 0–100 |
| Product leader | PMTitle .32 · Launches .38 · KPI .20 · CrossFunc .10 | `0.6·base + 2.0×C_Score` | 0–100 |
| Investor | Count .35 · LedRounds .25 · CheckSize .15 · PortfolioTier .15 · SocialProof .10 | direct weighted sum | 0–100 |
| Media | Twitter .32 · YouTube .26 · Talks .27 · Podcasts .15 (+3 consistency) | direct weighted sum | 0–100 |
| Location | Bay Area ×1.10 · alt hubs ×1.05 · else ×1.00 | applied last, cap 100 | multiplier |
| Matching (8.3) | R .35 · D .35 · SV .15 · Q .10 · A .05 · C −.05 | `clamp(round(Σw·x))` | 0–100 |

### Banding, thresholds, tie-breakers

- **Score bands:** none for role scores — output is a raw integer 0–100 per role; "banding" lives
  in the component buckets (raised-amount buckets, ARR buckets, team-size buckets, seniority bins,
  check-size buckets) and in the tag thresholds (`fnd__arr_1m_plus`, `res__hindex_20_plus`,
  `med__twitter_100k_plus`, …). The founder-impact pass bands confidence as
  `verified|estimated|unknown` per metric and `low|medium|high` overall.
- **Tie-breakers:** company selection — "prefer those founded on/before and nearest to
  `first_agi_event.date`; if any are founded after the event, prefer those. If tied, pick the
  earlier stage (Pre-Seed/Seed) at first event; if still tied, choose the one with highest evidence
  confidence and clearer fundraising signals" (`prompt for gemini` 0.2.c). Event precedence:
  "Choose earliest event by date; if same date pick status attended > approved > applied"
  (frameworks.event_precedence). Investor tier: highest observed across rounds. Tag ranking:
  catalog `weights` (default 1.0; NeurIPS/ICML/ICLR 1.3; CUDA/vLLM/TensorRT-LLM/led_rounds/tier1
  1.2) used "for downstream prioritization/tie-breaking" (`n8n_agent_workflow.md` §11).
- **Hybrid roles (§6.11):** "If roles overlap (e.g., Founder-Engineer), compute both role scores
  independently. UI option: average vs. max multipliers. Default: average the C_Score-derived
  multiplier terms; do not double-add the same C_Score."

### Missing data, confidence, penalties, bias corrections

> **6.12) Penalties and confidence**
> - Data quality penalty: if a key metric is supported by a single low-fidelity source, reduce that component's weight by 50% and include "low-confidence" note in the comment.
> - Negative signals (apply small deductions, total deductions ≤ 10 points): controversies with credible press, obvious bot-like social spikes, unverifiable claims contradicted by reputable sources.
> - Missing-evidence hard-zeros supersede deductions where specified in role sections.

- **Missing data:** per-role hard-zeros (above); otherwise "If insufficient evidence and no
  hard-zero condition applies, use a conservative non-zero score and state limitations in `comment`"
  (§7.2). The founder-impact pass is stricter — estimation is *mandatory* when any later funding
  stage is known: "There is no way not to generate estimations when later stages exist"
  (`prompt for gemini` objective 7); `value=null, confidence='unknown'` is allowed "only when no
  later stage exists AND signals are insufficient or contradictory after all required deep research
  attempts" (frameworks.verification_precedence step 6).
- **Confidence representation:** per-metric `confidence: verified|estimated|unknown` + `method`
  (e.g. `media_report`, `stage_median`, `arr_multiple_estimation`); per-role
  `Confidence = { level: high|medium|low, missing_signals?, low_fidelity_sources? }` (§7.1);
  per-record `confidence_overall`.
- **Bias corrections:** the location multiplier is a *deliberate* bias (Bay Area ×1.10), applied
  last and disclosed in the comment as `Loc=`. Counter-biases: log-scaled count norms (celebrity
  damping), "Avoid double counting across components; prefer primary sources per metric" (§6.10),
  repost metrics excluded from X engagement, self-hosted podcasts deprioritised, press repeats
  deduped, bot-spike penalty.
- **Audit template (mandatory, §7.3):** every role comment must be machine-readable:
  `Base=<base>; C=<c_score>; Mult=<role_mult>; Adj={<bonuses>/<penalties>}; Loc=<loc_mult>; Final=<score>. Signals: <facts>`
  — e.g. the shipped example `Base=74; C=12; Mult=×3.0; Adj=+5 recency,-2 penalty; Loc=1.10; Final=92.`

### The founder-impact elevation framework (the second scoring family)

`impact/prompt for gemini` §12 frameworks (also `estimates.config.json`, 551 bytes):

> - "valuation_medians_usd": pre_seed 10,000,000 · seed 20,000,000 · series_a 60,000,000 · series_b 200,000,000 · series_c 600,000,000 · series_d 1,200,000,000
> - "valuation_estimation": "If no verified valuation, use frameworks.valuation_medians_usd[stage_key] … mark confidence='estimated' and set method='stage_median'."
> - "arr_policy": "Prefer verified ARR… If unavailable, estimate ARR by: (a) identifying company type…; (b) collecting triangulatable signals (pricing pages, customer logos/case studies, press with customer counts, public dashboards, app store metrics, web traffic…); (c) deriving a defensible range and a point estimate consistent with the snapshot date… Always link evidence in 'provenance' and explain method and assumptions in 'speculations'… do not mix MRR and ARR."
> - "elevations": "Compute deltas only when both endpoints exist; otherwise leave null."
> - "stage_inference": "Use last definitional stage (Pre‑Seed/Seed/Series A/B/...) on/before event; otherwise infer by proximity to founded_year (≤24 months → Pre‑Seed/Seed)."

### The human judging pass (do not confuse with the AI rubric)

`AGI_House_Judge_Sheet__11_1_1.json`: humans scored hackathon *projects* 1–10 per judge ("Scoring
Range is 1 - 10" is a literal row in the sheet), `Overall` = arithmetic mean of present judges.
Counted: 34 rows, 27 with numeric Overall, min 0, max 8.92, mean 6.57. No written rubric exists
for this pass.

---

## Rubric evolution across versions

Ordered by file mtime; "same rubric" = byte-identical §6/§12 text.

| Generation | File(s) | Date | What changed | What it implies broke |
|---|---|---|---|---|
| G1 8.x spec family | `8.0` (9,178 B), `8.1` (22,709 B), `8.2` (23,461 B), `8.3` (10,511 B) | 2025-10-27 → 10-30 | Canonical split: orchestrator → research → score → match. 8.1 mandates "Minimum total tool calls per run: 40" and a `run_stats_8_1` return block | — (baseline design) |
| G2 Google-Sheets chain | `New 1. Google Doc identifier` (3,881 B), `New1.1: Linked&Perpl` (9,802 B), `New1.2: prompt example` (4,787 B), `New1.3: Deep Research & Scoring Orchestrator` (38,188 B) | 2025-11-01 | 4-step chain writing Google Sheets columns H/I/J; New1.2 adds Perplexity as a synthesis layer; New1.3 (the Query Refiner) is split from New1.4 (Deep Research & Scoring, the file's actual Role name). Rubric identical, restated as §12 | Single-agent runs were too long/unreliable → decomposition; sheet columns become the state machine |
| G3 rubric module | `8 copy.2 detailed score prompt` (16,997 B) | 2025-11-04 | The scoring sections (###11 + §6 + §7 + §13) extracted *without* the 8.2 workflow boilerplate | The rubric was being pasted into other prompts (the Gemini/n8n-agent family) — they needed a portable module |
| G4 founder-impact monoliths | `impact/n8n agent - Final agent` (26,715 B), `impact/n8n agent - Last version` (46,263 B), `impact/prompt for gemini` (57,185 B) | 2025-11-11 → 11-18 | New target output: "Founder's company elevation impact scoring" (valuation/ARR deltas vs first event). Adds verification_precedence ladder, valuation medians, ARR policy, tag catalog, adaptive `research_state`, provider ratio "Firecrawl:Bright Data ≥ 2:1", schema-first retry rules, "exactly 1 Bright Data LinkedIn person profile call AND exactly 1 Firecrawl scrape" | Bright Data instability ("MCP error -32000: Connection closed" is named), tool-schema 400s, and LinkedIn call duplication all happened in production — each has a dedicated rule |
| G5 3-agent Gemini chain | `impact/prompt for gemini 1` (8,426 B), `… 2` (8,978 B), `… 3` (8,548 B) | 2025-11-17 → 11-19 | The monolith is split into Agent 1 (identity+LinkedIn, max 5 calls, 2 cycles) → Agent 2 (funding research, max 5 calls) → Agent 3 (gap-fill + strict JSON). "Exactly two tool-call initiations ('Model Call Cycles')" per agent | The monolith over-ran context/iterations; hard call budgets replace the 5–15-call advisory. n8n memory becomes the handoff bus |
| G6 unified workflow docs | `n8n_agent_workflow_1.md` (49,636 B), `n8n_agent_workflow.md` (41,172 B) | 2025-11-18 → 12-18 | 8.1+8.2 fused into one prompt with a fully worked real example (a Stanford postdoc's record, scores computed with the audit template) | The example record is real output — by Dec the doc was teaching from production data |
| G7 n8n-1 OLD prompts | `impact/prompts/n8n 1/ Old: profile` (52,552 B), `OLD: Company analysis ` (64,444 B), `OLD: Company analysis (checker)` (62,172 B) | 2025-11-18 → 11-19 | Adds a Supervisor/Finalizer node ("verify whether Node #1 produced a correct, contract-compliant JSON; if not, generate the correct JSON yourself"). `OLD: Company analysis` embeds a **real agent transcript** (an investor-profile run with `call_human` marker) | Unsupervised single-pass output was not contract-compliant often enough to need a checker node |
| G8 n8n-2 (inactive) | `impact/prompts/n8n 2 (inactive)/Node #1, #1.1, #2, #3` + README + CHANGELOG | 2025-11-19 → 11-20 | Firecrawl-only; Iterate/Finish lifecycle gate; hard cap 5 iterations; **minimum 2 Firecrawl batches before finishing**; Node #3 is a no-tools finalizer; "treat all webhook fields as potentially stale" | CHANGELOG: agents were finishing after one batch on stale DB data. **This generation was never pushed** ("batch-local; not pushed to n8n yet") — DESIGNED only |

Net evolution in one line: the *rubric* never changed after 2025-10-27; everything that changed
was **orchestration** — call budgets, provider ratios, retry rules, node decomposition, and
checker nodes — i.e. every diff encodes an orchestration failure, not a scoring disagreement.

---

## Orchestration, end to end

**Trigger.** Two generations: (a) n8n Webhook node receiving one applicant JSON
(`{{ $('Webhook').item.json.body.toJsonString() }}` — G1/G4/G5/G7/G8); (b) a Google-Sheets poller
(G2): "Scan the rows sequentially… Identify the first row where Column I ('Sheet-research-started')
is blank or FALSE… set the value in Column I… to 'TRUE'" (`New 1. Google Doc identifier`).

**Sources pulled.** LinkedIn (Bright Data `web_data_linkedin_person_profile` + Firecrawl scrape —
exactly once each, a hard rule), GitHub (Firecrawl scrape/map), Twitter/X (Bright Data
`web_data_x_posts` for the last 20 posts), Google Scholar/DBLP, Crunchbase (Bright Data
`web_data_crunchbase_company` with scrape fallback), AngelList, press (TechCrunch/PR Newswire/
Business Wire/CB Insights), personal sites, YouTube, Instagram, Reddit — plus SearchAPI/SerpAPI
and Perplexity Deep Research in the G2 generation.

**Research/scoring separation.** Strict: "No scoring or predictions in 8.1. Summarize evidence
only. 8.2/8.3 will score/match." (`8.1` §3). 8.2 may run a *supplemental* research flow (§13) only
for missing scoring signals, and writes only `scores_v2` — it may not touch `enriched`.

**Retry/validation.** Schema-first hygiene: validate args before calling; on schema error "fix
parameters… and retry up to 3–5 times"; on `-32000: Connection closed` "retry with incremental
backoff (e.g., 1s, 2s, 4s), up to 3 attempts… switch to an alternative tool/provider". Provider
ratio "Firecrawl:Bright Data ≥ 2:1"; "If Bright Data returns repeated MCP errors in a step (≥2
failures of the same category), downgrade further Bright Data usage". G8 adds the Iterate/Finish
gate: "Do NOT exceed 5 iterations… If `iteration_number == 5`, you MUST finish with the best
possible JSON using estimation policies."

**Human touchpoints.** (1) Event curation and the Google Sheet itself; (2) the judge sheet
(humans score hackathon projects 1–10); (3) the `call_human` marker inside the embedded transcript
in `OLD: Company analysis` — the n8n chain had a human-escalation path; (4) the UI what-if sandbox
(`script.js`) lets a sponsor/admin move weight sliders over the scored data. No human reviewed
individual AI scores before write — the checker nodes (G7/G8) are AI.

**Persistence.** `applicants.json` (working set), `Full-enriched-DB.json` (bulk DB), Google Sheets
columns H/J (G2), `extended database/*.json` role files + `all_ids.json` index (mandated but
toy-scale), `impact/founders-impact.v1.json` (elevation output), static sites (`index.html`,
`people.html`, `impact/index.html` + `agi-h-impact.js`).

---

## Output schema

Two families.

**A. Applicant record** (`8.0` §4.3, `schema.v1.json` is the elevation sibling): original DB
record untouched + `agi_house_new_db_data` = { `id-new`, four `step_8_*` completion flags,
`events_new_db[]`, `organizations[]`, `ui{avatar_url, short_description, tags[]}`,
`enriched{linkedin, github, twitter, scholar, publications[], patents[], talks[], web_search[],
tags[], tags_line}`, `scores_v2{role_scores{founder…media:{score, comment, rationale?,
confidence?}}, short_conclusion, meta?}`, `matching_v2{events{…}}` }. The `Rationale` sub-object
carries `base_components, c_score, role_multiplier_used, location_multiplier_used,
adjustments{recency_bonus, consistency_bonus, penalties_total}, final_before_location,
final_after_location` — a full audit trail per score.

**B. Founder-impact record** (`impact/schema.v1.json`, draft-07): `person`, `company` (+tags,
filters, investors_canonical), `founder_role`, `first_agi_event`, `stage_at_first_event`,
`metrics_at_first_event{valuation_usd, arr_usd}` and `current_metrics` — each metric
`{value, confidence: verified|estimated|unknown, method, estimation_comment, evidence[]}` —
`elevations` (USD deltas), `rounds_all[]`, `timeline[]`, `derived{months_…, total_raised_…}`,
`provenance[]` (field → sources with URLs), `estimation_note_html`, `speculations[]`,
`confidence_overall`.

---

## Quality assessment — real research or thin enrichment?

**Verdict: real research at the median, with a long hollow tail — and the hollowness is
*labeled*, which is what makes the system usable as prior art.** Evidence: 18/165 elevation
records have a verified first-event valuation; the confidence field honestly spreads across 13
tokens; the best records show multi-source triangulation with equations; the worst records are
emitted anyway but say so.

### Strong example (anonymised skeleton of the highest-strength record in `founders-impact.v1.json`)

Selection rule: `confidence_overall == "high"` + verified first-event valuation + elevations
present + most provenance/rounds. All identifiers removed; `[…]` marks my substitutions.

```json
{
  "confidence_overall": "high",
  "stage_at_first_event": "Series B",
  "metrics_at_first_event": {
    "valuation_usd": {"confidence": "verified", "method": "media_report"},
    "arr_usd": {"confidence": "unknown", "value": null}
  },
  "current_metrics": {
    "as_of": "2025-11-11", "stage": "Series C",
    "valuation_usd": {"confidence": "verified", "method": "media_report"},
    "arr_usd": {"confidence": "verified"}
  },
  "elevations": {"valuation_usd": "<present>", "fundraise_usd_since_first_event": "<present>", "arr_usd": null},
  "rounds_all": "<8 rounds, pre-seed through Series B extension>",
  "provenance": "<5 field-level entries, each with source URLs>",
  "speculations": "<3 entries>"
}
```

Its `estimation_note_html` (identifiers scrubbed) shows the behavior the rubric was designed to
produce — including *declining to apply a multiplier it could not re-verify*:

> "We use [Company]'s 2025 press release to set current valuation ($3B) and ARR ($150M,
> annualized). [Finance outlet] corroborates prior valuation 'just over $1B' following the $97.4M
> 2023 raise. Lead investor for 2023 is widely reported as [Tier1 VC] but not re-scraped
> here—hence no Tier1-lead multiplier in scoring. Founding date approximated (2016) from public
> records; exact month not material to elevations."

Honest flaw even here: a `speculations[]` entry estimates total-raised-to-first-event at $202.5M
while `derived.total_raised_to_first_event_usd` says $97.4M — the record is internally
inconsistent and no checker caught it.

### Weak example (anonymised skeleton of a `very_low` record)

```json
{
  "confidence_overall": "very_low",
  "stage_at_first_event": "Acquired",
  "metrics_at_first_event": {"valuation_usd": null, "arr_usd": null},
  "current_metrics": {"as_of": "2025-11-12", "stage": null, "valuation_usd": null, "arr_usd": null},
  "elevations": {"valuation_usd": null, "fundraise_usd_since_first_event": null, "arr_usd": null},
  "rounds_all": [],
  "provenance": [],
  "speculations": "<2 entries>"
}
```

Its estimation note (identifiers scrubbed) admits the hollowness instead of hiding it:

> "[Company B] is the likely active founder-led company for elevation scoring, as it was founded
> after the [Company A] acquisition. The source document indicates that all key information
> (founding date, funding, valuation, ARR) is currently unknown and requires additional research."

This is the designed "no way not to generate estimations" rule producing a structurally valid but
empty record — the pipeline preferred a labeled-empty output over no output. For our purposes that
is a *feature to keep* (the label exists) and a *failure to note* (the deep-research retry the
prompt mandates evidently did not happen or did not succeed).

---

## Volume, counted

Every number below was produced by the command shown, run 2026-08-04 against the listed file.
"Record" = one top-level JSON array element unless stated otherwise.

| # | What | Count | File | Command (exact) |
|---|---|---|---|---|
| 1 | Applicants in the working set | **312** | `applicants.json` | `python3 -c "import json;print(len(json.load(open('applicants.json'))))"` |
| 2 | …of which carry `agi_house_new_db_data` | 225 | same | per-record key check (python loop over the loaded array) |
| 3 | …8.1 enriched / 8.2 scored / 8.3 matched | 202 / 202 / **0** | same | same loop on the `step_8_*` flags |
| 4 | …founder score present / >0 / max | 200 / 87 / 89 | same | same loop on `scores_v2.role_scores.founder.score` |
| 5 | Bulk enriched DB, top-level records | **13,733** | `Full-enriched-DB.json` (449,758,138 B) | streaming brace-depth counter over `open(path,'rb')` chunks (counts objects at array depth 1; string-aware) |
| 6 | …records with 8.2 completed `true` | **13,619** | same | `python3 re.findall(rb'"step_8_2_detailed_score_prompt_completed":\s*true', data)` |
| 7 | …records with 8.1 completed `true` / 8.0 added | 13,608 / 13,640 | same | same pattern for the other two flags |
| 8 | …`scores_v2` occurrences (lines / total) | 14,543 / 14,544 | same | `grep -c 'scores_v2'` vs `python3 re.findall(rb'scores_v2', data)` — >1 per record: multiple workflow generations wrote into the same DB |
| 9 | …numeric founder score fields / >0 | 18,478 / 8,765 | same | `re.findall(rb'"founder":\s*\{[^{}]*?"score":\s*(\d+)', data)` |
| 10 | …`hackaton_analysis` (sic) blocks / "All information and reasoning" logs | 13,706 / 12,528 | same | `re.findall` on the two literals — the Google-Sheets generation's fingerprints |
| 11 | …`matching_v2` / `run_stats_8_1` occurrences | **0 / 0** | same | same method — 8.3 and the 40-call audit block never persisted here |
| 12 | …`step_8_3` completed `true` | 59 | same | same pattern as #6 |
| 13 | …date range of `$date` fields | 2025-06-24 → 2025-11-21 (18,077 fields) | same | `re.findall(rb'"\$date":\s*"(202[0-9]-[0-9]{2}-[0-9]{2})', data)` |
| 14 | Raw 2023 hackathon DB records | **2,391** | `impact/Final_2023-hack-DB.json` (136,844,951 B) | same streaming brace-depth counter; `grep -c 'scores_v2'` = 1 → unscored |
| 15 | Founder-impact elevation records | **165** | `impact/founders-impact.v1.json` (775,914 B) | `len(json.load(...))` |
| 16 | …verified first-event valuation / confidence tokens | 18 / 13 distinct | same | python loop over `metrics_at_first_event.valuation_usd.confidence` and `confidence_overall` |
| 17 | Dinner-guest input blobs | 186 | `dinner-guests.json` | `re.findall(r'^\"\{', raw, flags=re.M)` — stringified per-person JSON blobs, concatenated |
| 18 | Dinner-guest enriched objects | 341 unique `_id` | `impact/all_dinner_guests-analysis.json` | `re.findall(r'^\{\s*\"_id\":\s*\"([^\"]+)\"', raw, flags=re.M)` — bracket-less concatenated objects |
| 19 | Dinner initial-analysis blob | 1 blob, 566 `name` fields | `impact/dinner-initial-analysis.json` | same regex family; double-quote-serialized |
| 20 | Old applicants | 142 | `Old_applicants.json` | `len(json.load(...))` |
| 21 | Events (current / index) | 20 / 17 | `events.json`, `impact/events-index.json` | `len(json.load(...))`; index spans 2023-03-09 → 2025-11-01 |
| 22 | Companies (legacy / new format) | 151 / parse-fails | `companies.json`, `companies-new-format.json` | `len(json.load(...))`; new-format file is double-quote-serialized (`""id-new""`) |
| 23 | Projects / judges-speakers / outreach candidates | 25 / 10 / 3 | `projects.json`, `judges-speakers-20251101.json`, `candidates-outreach.json` | `len(json.load(...))` |
| 24 | Initial approved dump (2025-10-27 event) | 132 | `initial data dump/27Oct-self-evolv_approved.json` | `len(json.load(...))` |
| 25 | v2 additional applicants base | 111 `name` fields | `v2.additional_applicants_base` | `re.findall(r'""name"":\s*""([^"]+)""', raw)` — double-quote-serialized |
| 26 | Extended DB role files | Companies 8 · Founders 3 · Engineers 8 · Researchers 2 · Investors 0 · Product-leaders 0 · Media 0 · all_ids 20 | `extended database/*.json` | `len(json.load(...))` per file |
| 27 | Judge sheet rows / scored / range / mean | 34 / 27 / 0–8.92 / 6.57 | `AGI_House_Judge_Sheet__11_1_1.json` | python loop over `['Combined']` |
| 28 | Provider spend | **20 tx, $1,861.47**, 2025-10-26 → 2025-11-30 | `costs/transactions.csv` | summed by merchant: OpenRouter 728.20 · Firecrawl 466.12 · Cursor 260.00 · Perplexity 160.00 · SerpAPI 75.00 · n8n Cloud 60.00 · Bright Data 50.00 · SearchAPI 40.00 · OpenAI 22.15 |

**On the "40+ calls for each of the 13,733 records" claim:** #5 confirms 13,733 as the top-level record
count of `Full-enriched-DB.json` — those records are LinkedIn-schema profiles (Proxycurl-style
fields: `accomplishment_*`, `experiences`, `connections`) with AI enrichment attached. The "40+
calls" half is the *design quota* in `8.1` §4.3 ("Minimum total tool calls per run: 40. Maintain a
running counter."); #11 shows the mandated audit block `run_stats_8_1` was never written, so no
per-profile call count exists anywhere. Note also that the G5 Gemini chain caps at **5 calls per
agent** — a different workflow with a different number. The two halves come from different
generations and must not be multiplied.

**Empty/artifact files (counted as 0-byte by `ls -la`):** `applicants-full.json`,
`impact/Hackathon-DB-4.json`, `impact/hh`. `stats.json` is a 73-byte empty shell
(`"generatedAt": ""`, `"events": {}`).

---

## OPERATED vs DESIGNED

**OPERATED — the 8.0/8.1/8.2 pipeline and the founder-impact elevation chain.** Evidence:

1. **13,619 records** carry `step_8_2_detailed_score_prompt_completed: true` with real comments in
   the mandated audit template — e.g. a real record reads "Strong practical skills from multiple
   hackathon wins… though score is formula-constrained by low GitHub stars (32). Base=53; C=0;
   Loc=1.10; Final=41." (#6, #9 above; comment quoted from `Full-enriched-DB.json` with the
   person's identifiers removed).
2. **Money:** $1,861.47 of provider spend on exactly the prompted tools, dated within the build
   window (#28).
3. **Deploys:** `git log --oneline` in the agi-house repo shows 15 commits, ten of them
   `Deploy Impact page to /agi-house/impact with data URL overrides; fix People link` — the impact
   interface shipped.
4. **A real run transcript** is embedded in `impact/prompts/n8n 1/OLD: Company analysis ` (an
   investor-profile research plan with a `call_human` marker) — prompt authors were pasting from
   live executions.
5. The worked example in `n8n_agent_workflow.md` is a real, identifiable Stanford postdoc with
   real metrics — production output, anonymised here.

**DESIGNED-only (or negligible operation):**

1. **8.3 matching** — 0 `matching_v2` in either DB; 59 `step_8_3` flags in 13,733 records (#11, #12).
2. **The n8n-2 generation** — its own CHANGELOG: "batch-local; not pushed to n8n yet".
3. **`run_stats_8_1`** — mandated, never persisted (0 occurrences).
4. **Extended-database writeback** — mandated "REQUIRED" in 8.1 §13/8.2 §14; operated at toy scale
   (20 ids, #26).
5. **The UI sandbox score** (`script.js`) — ships with five mock profiles; a demo surface.
6. **`stats.json`** — empty shell.

**Drift marker (designed vs operated vocabulary):** `confidence_overall` designed as
`low|medium|high`; operated output uses 13 tokens including `very_low`, `medium-high`,
`low_for_founder_scoring`, `N/A` (#16). The enum was not checked at write time.

---

## What transfers to the Claim Confidence Score (CONTRACT.md §3.2)

Three concrete proposals, each tied to prior-art evidence. A fourth, schema-level adoption is
listed separately because it is not a range change.

**P1 — `penalties`: current −25–0 → proposed −30–0; add a named trigger
`single_low_fidelity_source −5` (stackable to −10).**
Prior art: 8.2 §6.12's most-applied rule — "if a key metric is supported by a single low-fidelity
source, reduce that component's weight by 50%". A 50% haircut has no direct equivalent in an
additive score; −5 per flagged component is the calibrated approximation (it roughly halves a
mid-range component). The operated corpus shows the common case *is* single-source — only 18/165
elevation records reached a verified first-event valuation — so the penalty must exist at that
everyday granularity, not only as the four catastrophic triggers (hoax/financial-incentive/
retraction/custody) the CCS has now.

**P2 — `track_record`: current −5–10 → proposed −10–10.**
Prior art: the hard-zero family plus the negative-signal rule ("unverifiable claims contradicted
by reputable sources"). In the AGI-H system a contradicted claim did not get a small deduction —
it *zeroed the dependent component* ("Missing-evidence hard-zeros supersede deductions"). The CCS
currently treats "previously found unreliable" (−5) as milder than "contradicted elsewhere in
corpus" (−10 in `corpus_consistency`), although the first is the stronger signal about the
*speaker*. Widening the floor to −10 aligns the two and matches the prior art's asymmetry:
contradiction beats bonus.

**P3 — `corpus_consistency`: current −10–10 → proposed −15–10, with the −15 arm conditional on
`contradicted_by[]` naming an independent source.**
Prior art: "dedupe press repeats" (8.2 §6.8.1, §13.4) and "Same person repeating it in another
episode is not corroboration" (already in CCS) both encode that *independent* contradiction is
rarer and stronger than independent repetition. The AGI-H rubric consistently weighted
disconfirming evidence above confirming evidence (hard-zeros beat every bonus; the elevation
framework's `verification_precedence` ranks structured contradiction-checks before estimation).
A symmetric ±10 under-prices the falsification arm; −15 keeps the bonus side unchanged.

**Schema-level adoption (not a range change):** adopt the audit-template comment. Every AGI-H role
score had to carry `Base=…; C=…; Mult=…; Adj=…; Loc=…; Final=…` plus a `Rationale` object with
`adjustments{bonuses, penalties}` split out — the reader can recompute the score from the comment
alone. CCS §3.2 already rejects "a total without its components"; the prior art extends this one
step: a component without its *method* is also rejected. Recommend: claims carry a
`scores_rationale` string in that template shape, and `corroborating_sources[]` entries declare
`method` (retrieved-document vs testimony-vs-testimony) the way the elevation records declare
`method: media_report|stage_median|arr_multiple_estimation`.

**What does *not* transfer:** the location boost (a deliberate business bias, not an
epistemic one); the C_Score coupling (a person's score riding on their company's funding is a
sales tool, not a truth tool); and the log-scaled count norms (CCS has no count-shaped components
that need celebrity damping — its corroboration step function is already sublinear).

---

## Publishable vs private

**Publishable (system description, no PII):** the full rubric text and weights; the orchestration
architecture; the generation table; the operated-vs-designed analysis; the volume table; the
anonymised strong/weak skeletons above; the spend aggregates by merchant. This is the portfolio
evidence for "fluency with AI-assisted research tools" — and its honesty (designed vs operated,
the 40-call correction, the 13-token drift) is the part that survives scrutiny.

**Private (never republish):** `applicants.json`, `Full-enriched-DB.json`,
`impact/Final_2023-hack-DB.json`, `dinner-guests.json`, `impact/all_dinner_guests-analysis.json`,
`impact/dinner-initial-analysis.json`, `Old_applicants.json`, `v2.additional_applicants_base`,
`initial data dump/27Oct-self-evolv_approved.json`, `judges-speakers-20251101.json`,
`founders-impact.v1.json` and its backups — all contain named individuals' emails, LinkedIn URLs,
handles and employer+role pairs. The worked example inside `n8n_agent_workflow.md` names a real
person; quote it only anonymised. `costs/transactions.csv` contains partial payment-method and
cardholder details — report merchant/amount/date only, as done here.

**Credential notice (path-and-kind only, per instructions):** `langchain_testing/.env`
(787 bytes) exists and was not opened. `initial data dump/27Oct-self-evolv_approved.json` is
mode `-rw-------` — permission-restricted personal data.

---

## Method log

1. `ls -la` on `agi-house/` and `agi-house/impact/` — full inventory with byte sizes and mtimes.
2. Read in full: `8.0`, `8.1`, `8.2`, `8.3`, `8 copy.2`, `impact/prompt for gemini`,
   `impact/prompt for gemini 1|2|3`, `impact/n8n agent - Final agent`, `impact/n8n agent - Last
   version` (first 200 lines + structure), `New 1. Google Doc identifier`, `New1.1`, `New1.2`,
   `New1.3`, `n8n_agent_workflow.md`, `n8n_agent_workflow_1.md` (structure + scoring sections),
   `impact/prompts/n8n 2 (inactive)/Node #1, #2, #3, README, CHANGELOG`, `impact/prompts/n8n 1/
   Old: profile` (scoring sections via grep), `OLD: Company analysis ` (structure + embedded
   transcript), `OLD: Company analysis (checker)` (head).
3. Read in full (small files): `impact/schema.v1.json`, `impact/founders-impact.template.v1.json`,
   `impact/estimates.config.json`, `golden-tags.json`, `AGI_House_Judge_Sheet__11_1_1.json`,
   `dashboard-config.json`, `stats.json`, `candidates-outreach.json`, `costs/transactions.csv`.
4. Counted every data file with the commands in the Volume table; big files via a streaming,
   string-aware brace-depth counter (no full loads of the 137 MB / 450 MB files).
5. `git log --oneline` in the agi-house repo for deploy evidence.
6. `impact/agi-h-impact.js` and `script.js` via grep/sed for the shipped scoring/display logic.
7. Strong/weak examples extracted from `founders-impact.v1.json` by a deterministic strength
   function (verified metrics + confidence + provenance/rounds counts), then stripped of all
   identifiers; quotes scrubbed with `[…]` substitutions.
8. Read `05_graph/CONTRACT.md` in full for §3.2 before writing
   the transfer proposals.

## Gaps

1. **No per-profile tool-call counts exist anywhere** — the `run_stats_8_1` audit block was
   mandated but never persisted, so actual research depth per profile is unmeasurable from this
   folder. The n8n execution logs (not in this folder) are the only place that could hold them.
2. **The 8.3 matching weights were never exercised at scale** — their calibration is untested by
   production data (0 persisted outputs in both DBs).
3. **`companies-new-format.json`, `dinner-guests.json`, `impact/dinner-initial-analysis.json` and
   `v2.additional_applicants_base` are double-quote-serialized or bracket-less** — counts for them
   are regex-based (stated per-row above), not parser-based.
4. **The `impact/prompts/n8n 1/OLD: Hackathon` directory is empty** (64 bytes, 0 files) — one
   generation's prompt is lost.
5. **`Archive.zip` (7.5 MB) was listed, not extracted** — it contains Oct-26→30 snapshots of the
   same prompt family plus early data; treated as duplicates of what was read directly.
6. **Which n8n workflow IDs ran which generation** is not recoverable from this folder; the
   `n8n 2 (inactive)` README maps files to node names but not to workflow IDs.
7. The `langchain_testing/langchain_test.py` prototype (gpt-4o-mini default) shows an OpenAI-based
   local test path existed, but no outputs from it were found — likely a dev spike.
