feat(review): match detail view — evidence for fit at review time

/matches/:matchId shows the org (location, NTEE + description, revenue,
profile mission w/ stub warning, ProPublica + web-search links), the
grant (award band, deadline, eligibility, source link), the full
subscore breakdown with embedding similarity + ignored-gate flags, the
grant synopsis, and — for 990-PF matches — the funder's actual giving
history table (recipient, city, amount, year, purpose; in-state first),
which is the concrete evidence behind the precedent score. Approve/
reject on the detail page redirects back to the queue; queue org names
link through.

Core: serverGetMatchDetail (match+org+grant join, profile, up to 40
funder-grant rows in-state-first).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Croissant Le Doux
2026-07-16 21:32:28 -04:00
parent 8f9c19a32c
commit d8ca133e95
5 changed files with 470 additions and 4 deletions

View File

@@ -2,7 +2,7 @@ import {
serverListPendingReviewMatches,
serverSetMatchReview,
} from '@novelpad/outreach-core/server';
import { Form } from 'react-router';
import { Form, Link } from 'react-router';
import { db } from '#~/db.server.js';
@@ -69,7 +69,14 @@ export default function ReviewQueue({ loaderData }: Route.ComponentProps) {
<tbody>
{matches.map((match) => (
<tr key={match.id} className="border-b">
<td className="p-2">{match.orgName}</td>
<td className="p-2">
<Link
to={`/matches/${match.id}`}
className="text-blue-700 underline"
>
{match.orgName}
</Link>
</td>
<td className="p-2">{match.grantTitle}</td>
<td className="p-2">{match.totalScore}</td>
<td className="p-2">{match.easyWin ? 'Yes' : 'No'}</td>