Replies: 4 comments
|
On questions:
|
Decisions on Open Questions1.
|
| Type | Records | Need for 30% | Already Have | Gap | Cost |
|---|---|---|---|---|---|
| funding-program | 61 | 19 | 0 | 19 | $0.19 |
| funding-round | 91 | 28 | 0 | 28 | $0.28 |
| equity-position | 13 | 4 | 0 | 4 | $0.04 |
| benchmark-result | ~200 | 60 | 0 | 60 | $0.60 |
| investment | 72 | 22 | 9 | 13 | $0.13 |
| grant | 5,904 | 1,772 | 261 | 1,511 | $15.11 |
Total to 30% on all types: ~$16. Grants dominate the cost (5,904 records).
Going further:
- 70% coverage on all types: ~$55-60 (grants = ~$41 of that)
- Full coverage on everything: ~$60 (grants 5,904 × $0.01 = $59 ceiling)
This is well within a $100 budget. The constraint isn't money — it's time (each verification involves an HTTP fetch of the source URL + LLM call) and source URL availability (records without a source/sourceUrl field can't be checked at all, which may cap actual achievable coverage below 100%).
Recommendation: Run pnpm crux source-check-orchestrate --budget=50 --type=record to check all record types. This would get small types to near-100% coverage and grants to ~30%+. Then evaluate whether the remaining unchecked grants simply lack source URLs.
4. Stale verdict display (>6 months) → Later phase
Makes sense. lastComputedAt is already in the RecordVerdict interface but never displayed. Options:
- Fade the dot opacity for verdicts older than 6 months
- Add a clock icon or "⏳" suffix to the tooltip
- Mark them
needsRecheck: truein the data layer (field already exists)
Not critical for initial rollout since the system is relatively new and most verdicts are recent. Build it when the first verdicts actually hit 6 months old.
Updated phasing with these decisions:
- Phase 1:
SourceCheckDot+VerificationSummaryBannercomponents, wire to high-coverage types (divisions, publications, personnel, policy-stakeholders) - Phase 2: Run orchestrator (~$50 budget) to build coverage on zero-coverage types
- Phase 3: Wire dots + banners to newly-covered types (grants, investments, funding-rounds, etc.)
- Phase 4 (later): Detail popover on dot click, entity-level aggregate indicator, stale verdict styling
|
Superseded by Discussion #3993 (Source-Check → Sourcing Rename — Implementation Plan). The architecture and naming decisions in this discussion have been consolidated into the 7-phase sourcing rename plan. Key changes: routes become |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Context
We have a mature source-check system (LLM-verified structured data against source URLs) with 2,439 verdicts in the DB. Currently, 9 UI locations show
SourceCheckBadgeindicators. The goal is to surface verification status across all TableBase tables — organization tabs, directory pages, detail pages.The naive plan ("add a Verified column to every table") has serious problems. This RFC lays out a revised approach based on red-teaming, UX analysis, coverage data, and architectural review.
Problem: Coverage Is Wildly Uneven
Before designing the UI, the actual verdict coverage must inform the approach:
FactBase facts: 1,444 verdicts across ~3,000+ facts (~48%).
Key insight: Adding a "Verified" column to a table where 95% of rows are blank is anti-information — it teaches users to ignore the column and implies everything is unverified. A dedicated column only makes sense at >50% coverage.
Rejected Approach: Per-Row Column Everywhere
The original plan proposed adding a
SourceCheckBadgecolumn to ~16 tables across 3 phases. Problems:Revised Approach: Three-Tier Display System
Tier 1: Inline Dots (Universal)
Replace the current text pill badge (
"Verified","Disputed") with a compact colored dot (4-6px circle) rendered inline next to the entity name in the first column of any table. Tooltip on hover shows the full verdict + confidence.Why this works:
Component: Create
SourceCheckDot(~15 lines) alongside existingSourceCheckBadge. Standardize all current inline usages to this pattern.Apply to: Every table, regardless of coverage level. Since unchecked rows show nothing, there's no "empty column" problem.
Tier 2: Section Summary Banner (High-Coverage Tables)
For tables with >30% verdict coverage, add a slim summary bar above the table:
Why this works:
getRecordVerdictStats()which already exists but has zero consumersComponent:
VerificationSummaryBanner(~30 lines). Server component that callsgetRecordVerdictStats(recordType).Apply to: divisions, publications, personnel, policy-stakeholders (>70% coverage), and eventually grants/investments as coverage grows.
Tier 3: Dedicated Column (Only for >70% Coverage)
Keep the existing dedicated "Verified" column pattern only for tables where most rows will show a badge. Currently that means: divisions, publications, personnel.
Tables that currently have a dedicated column but low coverage (funding-rounds at 0%) should remove the column and switch to Tier 1 dots.
Coverage-Gated Rollout
Instead of phasing by "how easy is it to wire up," phase by data readiness:
Phase 1: High-Coverage Types (divisions, publications, personnel, policy-stakeholders)
SourceCheckDotPhase 2: Run Source-Check Orchestrator for Uncovered Types
pnpm crux source-check-orchestratetargeting funding-programs, funding-rounds, equity-positions, benchmark-resultsPhase 3: Medium-Coverage Types (grants, investments, + newly checked types)
Phase 4: New Record Types (if warranted)
benchmark-resultrecord type for scores, but pricing verification needs a newai-modelrecord typeArchitecture: Keep It Simple
The four architectural approaches evaluated:
The real variation is in rendering, not data loading. Each table positions badges differently (inline, column, after source link). No abstraction can unify this. The
getRecordVerdict()call is one line — the per-table cost is ~15 lines of straightforward code.One small utility worth adding in
tablebase.ts:This standardizes the Pattern 2 (server-to-client) enrichment and prevents record type string typos.
Immediate Action Items
SourceCheckDotcomponent — compact dot variant ofSourceCheckBadgeVerificationSummaryBannercomponent — section-level coverage summaryenrichWithVerdicts()utility totablebase.tscollectionToRecordType(8 types) is missing 5 types fromVALID_RECORD_TYPES(publication, benchmark-result, entity-event, entity-assessment, secondary-market-price)getRecordVerdictStats()— it exists with zero consumers. Wire it to the summary banner.Open Questions
SourceCheckDothave an onClick that opens a detail popover (showing sources checked, last verified date, confidence)?lastComputedAtfield exists but is never displayed.All reactions