Deal Scoring Desk
Overview
Use this skill as a Busabase-backed review-queue desk for a generic SME
financing deal desk (private-credit / revenue-based-financing style). It
holds a mock queue of candidate businesses (name, category, city, monthly
revenue history, requested principal, red flags) and computes a deterministic
composite score (0-100) per candidate with a full, hand-recomputable
breakdown: each sub-factor's raw score, weight, and contribution, plus a
suggested revenue-share rate range. This is a generic, brand-free tool — it
does not reference any specific real company, lender, or fund.
The scoring rubric is plain arithmetic in content/kelly-deal-scorer-app/app/js/scorer-model.js, not
an LLM or API call. Every number the app shows can be recomputed with a
calculator from the candidate's raw fields and the rubric weights in the
settings Base.
Default behavior is AirApp-first. Unless the user explicitly asks only for
explanation, ensure the mock queue exists (run the seed script below if the
candidates Base is empty) and give the user the clickable AirApp URL (or
the local preview URL when local preview is explicitly requested). Use
chat-only mode only when the user says "纯聊天", "chat only", "不要打开 UI", or
similar.
App UI Screenshots
Mandatory Dependencies
- Read and follow
$kelly-app-skill-creator for product behavior, visual quality, responsive layout, and the complete canonical content/kelly-deal-scorer-app/ artifact.
- Read and follow
$busabase for connection, target Space, node discovery, ChangeRequests, review, and merge behavior.
- Read and follow
$busabase-app-creator for resource modeling, AirApp runtime limits, security, validation, and deployment.
If a dependency is unavailable, preserve this skill's local artifact and product contracts, stop before the unavailable Busabase operation, and report the exact missing dependency. Do not invent a second data backend.
Boundary
- Review-only. The skill scores a candidate queue and records human
decisions in Busabase; it never wires money, signs a term sheet, or
contacts a business.
- NEVER treat the composite score as legal or financial advice, and never
auto-approve: a human decision (
approve_term_sheet / send_back_for_data
/ reject) is always required before scripts/execute_decisions.mjs marks
a candidate done.
- The AirApp reads and writes its own two Busabase Bases only.
- Treat candidate financials as sensitive review data; the composite score
and every intermediate number are always recomputed client-side from the
candidate's raw fields, never fabricated.
Busabase Resources
Two Bases under one application Folder (kelly-deal-scorer), declared in
content/kelly-deal-scorer-app/app/js/config.js and the generated template sidecars under content/:
candidates: one row per candidate business — raw underwriting fields
(category, city, requested principal, monthly revenue history, red flags)
plus the reviewer's decision (decision-action/decision-comment/
decided-at) and workflow status, all written directly onto the same
row. The composite score breakdown is never stored — it is recomputed
client-side from the raw fields on every read.
settings: up to two rows, keyed by record-id/kind: config
(base currency + an optional rubric override for the fund's underwriting
policy) and run (the current queue's batch id + generated-at).
Resources provision lazily through an idempotent Busabase ChangeRequest the
first time the app runs in a Space; see references/scoring-schema.md for
exact field shapes.
First Run And Onboarding
On invocation, check the candidates Base. If it's empty, run the trusted
seed script to generate the fixed mock queue:
node skills/kelly-deal-scorer/scripts/generate_batch.mjs --apply
There are no credentials to collect beyond Busabase itself — onboarding is
just confirming the rubric weights and category risk tiers in the settings
Base's config row match the fund's underwriting policy (defaults apply if
omitted).
Local App
Default behavior is AirApp-first — give the user the clickable AirApp URL.
Start pnpm --dir content/kelly-deal-scorer-app dev only when local preview/debugging is explicitly
requested.
Required app views (hash routes):
#/overview: queue-level summary — score distribution (high-confidence /
needs review / low-confidence), workflow counts, and the candidate list.
#/candidates and #/candidates/<id>: the full queue, filterable by
status; detail shows revenue history, red flags, requested principal,
score breakdown, suggested revenue-share range, and the decision row.
Decisions write directly onto the candidate record through busabase-sdk.
#/settings: sanitized rubric summary (weights, thresholds), active data
provider, and onboarding state.
Demo Mode
?demo=1 opens a deterministic, fully offline mock queue (8 candidates
across F&B/Retail/Fitness/Education) for documentation and screenshots.
Demo mode never reads or writes Busabase.
lang=en or lang=zh forces UI chrome language for screenshots.
UI language: English and Chinese chrome with Auto default.
Workflow
node scripts/generate_batch.mjs --apply (dry run without --apply)
writes the fixed 8-candidate mock queue to the candidates Base
(resetting every candidate's decision fields to needs_review) and
refreshes the settings Base's run row — run it once at setup, and
again any time the demo queue needs resetting.
- Open the app. Overview shows the score distribution and workflow
counts; Candidates lists every candidate, filterable by status.
- For each candidate, open the detail view, review the revenue history
chart, red flags, and the full score breakdown (every sub-factor's raw
score/weight/contribution with an arithmetic trace), then record
Approve for term sheet / Send back for more data / Reject with an
optional note — written straight onto the candidate record.
node scripts/execute_decisions.mjs --apply (dry run without --apply)
re-reads Busabase and marks every approved candidate done, preparing
the local term-sheet-draft artifact at the suggested revenue-share rate.
It performs no external side effect — no wiring, no signing, no
contacting the business.
Read references/scoring-schema.md before editing the app, scripts, or
content/kelly-deal-scorer-app/app/js/scorer-model.js.
The Rubric (not a model)
content/kelly-deal-scorer-app/app/js/scorer-model.js documents and implements the entire scoring
rubric: five weighted 0-100 sub-factors (revenue stability, growth trend,
category risk tier, principal-to-revenue ratio, track record & scale), each
with a human-readable arithmetic trace in detail. computeScore() is a
pure function — same inputs always produce the same composite score and
suggested revenue-share range, so a human reviewer can check every number
with a calculator. It backs the trusted seed script
(scripts/generate_batch.mjs), the live Busabase read path
(content/kelly-deal-scorer-app/app/js/providers/busabase-provider.js), and the offline ?demo=
scenario (content/kelly-deal-scorer-app/app/js/providers/demo-provider.js), so all three always
agree on scoring.
Safety
- Deterministic scoring only: never call an LLM or external API to produce a
candidate's score —
content/kelly-deal-scorer-app/app/js/scorer-model.js is plain arithmetic so
every number is auditable.
- Never auto-execute a decision the human has not made.
- Do not invent candidates outside the fixed seed set; if the user wants a
different queue, add to
content/kelly-deal-scorer-app/app/js/scorer-model.js's CANDIDATE_SEEDS
and re-run the seed script.
Useful Commands
node skills/kelly-deal-scorer/scripts/generate_batch.mjs --apply
node skills/kelly-deal-scorer/scripts/execute_decisions.mjs --apply
pnpm --dir skills/kelly-deal-scorer/content/kelly-deal-scorer-app dev
1---2name: kelly-deal-scorer3description: Busabase App-in-Skill review queue that scores candidate SME financing deals (revenue-based/RBF-style credit) with a deterministic, fully auditable rule-based rubric — never an LLM or API call. Use when the user invokes $kelly-deal-scorer or /kelly-deal-scorer, wants to review a deal-underwriting queue, score financing candidates, compute a composite score breakdown, see a suggested revenue-share rate range, or record approve/send-back/reject decisions for a private-credit or RBF-style lending pipeline.4---56# Deal Scoring Desk78## Overview910Use this skill as a Busabase-backed review-queue desk for a generic SME11financing deal desk (private-credit / revenue-based-financing style). It12holds a mock queue of candidate businesses (name, category, city, monthly13revenue history, requested principal, red flags) and computes a deterministic14composite score (0-100) per candidate with a full, hand-recomputable15breakdown: each sub-factor's raw score, weight, and contribution, plus a16suggested revenue-share rate range. This is a generic, brand-free tool — it17does not reference any specific real company, lender, or fund.1819**The scoring rubric is plain arithmetic in `content/kelly-deal-scorer-app/app/js/scorer-model.js`, not20an LLM or API call.** Every number the app shows can be recomputed with a21calculator from the candidate's raw fields and the rubric weights in the22`settings` Base.2324Default behavior is AirApp-first. Unless the user explicitly asks only for25explanation, ensure the mock queue exists (run the seed script below if the26`candidates` Base is empty) and give the user the clickable AirApp URL (or27the local preview URL when local preview is explicitly requested). Use28chat-only mode only when the user says "纯聊天", "chat only", "不要打开 UI", or29similar.3031## App UI Screenshots3233<table>34 <tr>35 <td width="50%"><img src="assets/screenshots/overview.webp" alt="Deal Scoring Desk overview"></td>36 <td width="50%"><img src="assets/screenshots/candidate-detail.webp" alt="Deal Scoring Desk candidate detail"></td>37 </tr>38 <tr>39 <td><strong>Overview</strong><br>Queue-level summary header — score distribution, counts needing review vs. high-confidence — plus the candidate list.</td>40 <td><strong>Candidate detail</strong><br>Revenue history, red flags, requested principal, and the decision row (approve for term sheet / send back for more data / reject).</td>41 </tr>42 <tr>43 <td width="50%"><img src="assets/screenshots/score-breakdown.webp" alt="Deal Scoring Desk score breakdown"></td>44 <td width="50%"></td>45 </tr>46 <tr>47 <td><strong>Score breakdown</strong><br>Per-factor raw score, weight, and contribution with an arithmetic trace for every sub-factor, plus the suggested revenue-share rate range.</td>48 <td></td>49 </tr>50</table>5152## Mandatory Dependencies53541. Read and follow `$kelly-app-skill-creator` for product behavior, visual quality, responsive layout, and the complete canonical `content/kelly-deal-scorer-app/` artifact.552. Read and follow `$busabase` for connection, target Space, node discovery, ChangeRequests, review, and merge behavior.563. Read and follow `$busabase-app-creator` for resource modeling, AirApp runtime limits, security, validation, and deployment.5758If a dependency is unavailable, preserve this skill's local artifact and product contracts, stop before the unavailable Busabase operation, and report the exact missing dependency. Do not invent a second data backend.5960## Boundary6162- Review-only. The skill scores a candidate queue and records human63 decisions in Busabase; it never wires money, signs a term sheet, or64 contacts a business.65- NEVER treat the composite score as legal or financial advice, and never66 auto-approve: a human decision (`approve_term_sheet` / `send_back_for_data`67 / `reject`) is always required before `scripts/execute_decisions.mjs` marks68 a candidate `done`.69- The AirApp reads and writes its own two Busabase Bases only.70- Treat candidate financials as sensitive review data; the composite score71 and every intermediate number are always recomputed client-side from the72 candidate's raw fields, never fabricated.7374## Busabase Resources7576Two Bases under one application Folder (`kelly-deal-scorer`), declared in77`content/kelly-deal-scorer-app/app/js/config.js` and the generated template sidecars under `content/`:7879- `candidates`: one row per candidate business — raw underwriting fields80 (category, city, requested principal, monthly revenue history, red flags)81 plus the reviewer's decision (`decision-action`/`decision-comment`/82 `decided-at`) and workflow `status`, all written directly onto the same83 row. The composite score breakdown is never stored — it is recomputed84 client-side from the raw fields on every read.85- `settings`: up to two rows, keyed by `record-id`/`kind`: `config`86 (base currency + an optional rubric override for the fund's underwriting87 policy) and `run` (the current queue's batch id + generated-at).8889Resources provision lazily through an idempotent Busabase ChangeRequest the90first time the app runs in a Space; see `references/scoring-schema.md` for91exact field shapes.9293## First Run And Onboarding9495On invocation, check the `candidates` Base. If it's empty, run the trusted96seed script to generate the fixed mock queue:9798```bash99node skills/kelly-deal-scorer/scripts/generate_batch.mjs --apply100```101102There are no credentials to collect beyond Busabase itself — onboarding is103just confirming the rubric weights and category risk tiers in the `settings`104Base's `config` row match the fund's underwriting policy (defaults apply if105omitted).106107## Local App108109Default behavior is AirApp-first — give the user the clickable AirApp URL.110Start `pnpm --dir content/kelly-deal-scorer-app dev` only when local preview/debugging is explicitly111requested.112113Required app views (hash routes):114115- `#/overview`: queue-level summary — score distribution (high-confidence /116 needs review / low-confidence), workflow counts, and the candidate list.117- `#/candidates` and `#/candidates/<id>`: the full queue, filterable by118 status; detail shows revenue history, red flags, requested principal,119 score breakdown, suggested revenue-share range, and the decision row.120 Decisions write directly onto the candidate record through `busabase-sdk`.121- `#/settings`: sanitized rubric summary (weights, thresholds), active data122 provider, and onboarding state.123124## Demo Mode125126- `?demo=1` opens a deterministic, fully offline mock queue (8 candidates127 across F&B/Retail/Fitness/Education) for documentation and screenshots.128 Demo mode never reads or writes Busabase.129- `lang=en` or `lang=zh` forces UI chrome language for screenshots.130131UI language: English and Chinese chrome with `Auto` default.132133## Workflow1341351. `node scripts/generate_batch.mjs --apply` (dry run without `--apply`)136 writes the fixed 8-candidate mock queue to the `candidates` Base137 (resetting every candidate's decision fields to `needs_review`) and138 refreshes the `settings` Base's `run` row — run it once at setup, and139 again any time the demo queue needs resetting.1402. Open the app. **Overview** shows the score distribution and workflow141 counts; **Candidates** lists every candidate, filterable by status.1423. For each candidate, open the detail view, review the revenue history143 chart, red flags, and the full score breakdown (every sub-factor's raw144 score/weight/contribution with an arithmetic trace), then record145 `Approve for term sheet` / `Send back for more data` / `Reject` with an146 optional note — written straight onto the candidate record.1474. `node scripts/execute_decisions.mjs --apply` (dry run without `--apply`)148 re-reads Busabase and marks every `approved` candidate `done`, preparing149 the local term-sheet-draft artifact at the suggested revenue-share rate.150 It performs no external side effect — no wiring, no signing, no151 contacting the business.152153Read `references/scoring-schema.md` before editing the app, scripts, or154`content/kelly-deal-scorer-app/app/js/scorer-model.js`.155156## The Rubric (not a model)157158`content/kelly-deal-scorer-app/app/js/scorer-model.js` documents and implements the entire scoring159rubric: five weighted 0-100 sub-factors (revenue stability, growth trend,160category risk tier, principal-to-revenue ratio, track record & scale), each161with a human-readable arithmetic trace in `detail`. `computeScore()` is a162pure function — same inputs always produce the same composite score and163suggested revenue-share range, so a human reviewer can check every number164with a calculator. It backs the trusted seed script165(`scripts/generate_batch.mjs`), the live Busabase read path166(`content/kelly-deal-scorer-app/app/js/providers/busabase-provider.js`), and the offline `?demo=`167scenario (`content/kelly-deal-scorer-app/app/js/providers/demo-provider.js`), so all three always168agree on scoring.169170## Safety171172- Deterministic scoring only: never call an LLM or external API to produce a173 candidate's score — `content/kelly-deal-scorer-app/app/js/scorer-model.js` is plain arithmetic so174 every number is auditable.175- Never auto-execute a decision the human has not made.176- Do not invent candidates outside the fixed seed set; if the user wants a177 different queue, add to `content/kelly-deal-scorer-app/app/js/scorer-model.js`'s `CANDIDATE_SEEDS`178 and re-run the seed script.179180## Useful Commands181182```bash183node skills/kelly-deal-scorer/scripts/generate_batch.mjs --apply184node skills/kelly-deal-scorer/scripts/execute_decisions.mjs --apply185pnpm --dir skills/kelly-deal-scorer/content/kelly-deal-scorer-app dev186```