Creating Financial Models
Chen-zexi/open-ptc-agent
This skill provides an advanced financial modeling suite with DCF analysis, sensitivity testing, Monte Carlo simulations, and scenario planning for investment decisions
A skill your agent uses when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against…
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness unit-economics --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/unit-economics .claude/skills/unit-economics && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .claude/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economicsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness unit-economics --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/unit-economics .agents/skills/unit-economics && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .agents/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness unit-economics --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/unit-economics .cursor/skills/unit-economics && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .cursor/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ericrisco/rsc-harness.git --path skills/unit-economics--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness unit-economics --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/unit-economics .gemini/skills/unit-economics && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .gemini/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ericrisco/rsc-harness unit-economicsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/unit-economics .github/skills/unit-economics && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .github/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill unit-economics -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness unit-economics --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/unit-economics .opencode/skills/unit-economics && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "unit-economics" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/unit-economics into .opencode/skills/unit-economics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-economics", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
unit-economicsA skill your agent uses when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against…
Unit Economics is an agent skill from ericrisco/rsc-harness. Use when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against current norms, and naming the one lever that fixes the worst number. Covers a blended CAC that hides a bleeding channel, and a model that shows profit while each customer loses money. NOT the multi-year P&L or scenario projection (that is financial-model).
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/formulas.md`).
It sits in Business, Finance & HR, covering Financial modeling. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit e3d5b33. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Unit Economics loads about 3.2k tokens when it runs, and up to ~4.6k if it reads all its reference files. Until then it costs about 113 tokens; SKILL.md has 1,548 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 1,548 words, ~3,210 tokens.
.claude/skills/unit-economics/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Answer one question honestly: does one customer pay back more than it cost to win and serve them, and how fast? You compute four load-bearing numbers — CAC, contribution margin, LTV, CAC payback period — plus the two ratios operators and investors actually argue about (LTV:CAC, NRR). Then you diagnose why a number is where it is and name the single lever that moves it.
This is a measurement-and-diagnosis skill, not a projection skill. You do not build the multi-year model here (that is the financial-model sibling); you build the per-customer truth that the model's growth assumptions have to rest on.
A unit-economics worksheet (unit-economics.{yaml,csv,md}) where:
scripts/verify.sh re-derives the figures and fails if the arithmetic lies (see the last section). If you only hand back prose, you have not finished — emit the worksheet.
Each formula has one input that, done sloppily, silently invalidates everything downstream. Tag the input, not just the result.
| Number | Formula | The input people get wrong |
|---|---|---|
| CAC | fully-loaded S&M spend ÷ new customers (same period) | the numerator — ad-spend-only CAC understates true CAC ~3.5× |
| Contribution margin / customer | ARPA − variable cost to serve (COGS + variable support + payment fees) | confusing it with company-wide gross margin % |
| LTV | (ARPA × Gross Margin %) ÷ churn rate | using revenue instead of gross-margin dollars |
| CAC payback (months) | CAC ÷ (monthly ARPA × Gross Margin %) | leaving gross margin out of the denominator |
Worked Bad → Good — the revenue-LTV inflation. Same inputs: ARPA $400/mo, gross margin 75%, monthly churn 3%.
Bad (revenue LTV): 400 / 0.03 = $13,333 <- overstates by 33%
Good (gross-margin LTV): (400 * 0.75) / 0.03 = $10,000 <- what a customer is actually worthLTV must use gross-margin dollars because not all revenue is profit — hosting, support, and payment fees come out first. The revenue version flatters the LTV:CAC ratio and is the single most common dishonesty in a deck. (Beancount.io "2026 SaaS Metrics Stack" 2026-05-10; ChartMogul LTV guide; both accessed 2026-06-02.)
Full derivations, cohort-LTV vs formula-LTV, the Skok discounted model, and segment roll-up math live in references/formulas.md. Read it before you defend a number to an investor.
Run these in order — each step is an input to the next, so skipping one makes everything after it fiction.
cost-tracking) — you cannot compute LTV or payback on a guessed margin.CAC is fully loaded or it is a lie. Decide what goes in the numerator before you divide.
| In the CAC numerator | Out of the CAC numerator |
|---|---|
| Sales + marketing salaries & benefits | Customer-success / retention spend (that protects LTV, it doesn't acquire) |
| Sales commissions & SDR/AE comp | R&D / product engineering |
| Ad spend, content, events, agencies | Overhead/G&A not tied to acquisition |
| Marketing & sales tooling | (Denominator) returning / reactivated customers — only count new logos |
| Founder selling time (impute a salary) |
Three rules that catch most errors:
A single blended number hides the only insight that matters. Reporting one blended CAC of $1,200 when self-serve is $80 and field sales is $40,000 tells you nothing actionable — the channels have wildly different CAC, ARPA, and churn. (lucid.now LTV/CAC errors; andrewchen; accessed 2026-06-02.)
Blended CAC $1,200 = self-serve $80 + inside sales $900 + field $40,000
(lever: scale) (lever: AE ramp) (lever: ACV / cycle)Two more separations to keep clean:
A ratio is a conversation-starter, not a pass/fail grade. Read the whole row before you celebrate or panic.
| Metric | Elite / top quartile | Healthy / median | Concern |
|---|---|---|---|
| CAC payback | < 12 months | B2B SaaS median 12-18 mo | 24+ months = sustainability concern |
| Payback by ACV | ~9 mo at ACV ≤ $5K | — | ~24 mo at ACV > $100K (expected, not bad) |
| LTV:CAC | 3:1 to 5:1 | median B2B ≈ 3.2:1 | < 3:1 overspending; > 5:1 under-investing in growth |
| NRR | top quartile 115-125% | healthy 105-115% | < 100% net contraction |
| GRR | — | — | high NRR + low GRR = expansion masking churn |
(Beancount.io 2026-05-10; First Page Sage CAC Payback Benchmarks 2025; Optifai B2B LTV benchmark, 939 companies; cast.app NRR; all accessed 2026-06-02.)
The honest framing: a 2.5:1 with 9-month payback and 120% NRR beats a 4:1 with 36-month payback and 95% NRR. Payback and NRR decide whether you can survive the gap between spend and return; the ratio alone can't. Rule of 40 (ARR growth % + profit margin % ≥ 40%) is the company-level destination these feed — cite it, but compute it in financial-model, not here.
Find the worst number, then route to the lever — and to the sibling skill that owns that lever.
| Bad number | Likely cause | Lever (and owner) |
|---|---|---|
| CAC too high | wrong channel mix / paid-heavy | shift to founder-led & organic; cut the bleeding channel — diagnose by segment here, then pricing if the fix is monetization |
| Payback too long | low margin-dollar capture per month | move to annual prepay; shorten free trial; lift gross margin (cost-tracking for COGS) |
| LTV too low | dominant churn term | attack the biggest churn driver → retention; lift expansion to push NRR > 100% |
| Margin too low | COGS per unit too high | instrument per-unit COGS / inference cost → cost-tracking |
| LTV:CAC > 5:1 | under-investing in growth | spend more on acquisition — you're leaving money on the table, not winning |
| NRR ≫ GRR | expansion masking a churn problem | fix gross retention first → retention; don't let expansion hide the leak |
The skill stops at "here is the worst number and the lever." Executing the lever (set the price, design the save-play, project the new curve) belongs to the sibling, not here.
Small churn errors explode LTV because of the 1/churn term — at 1% monthly churn the formula implies a ~100-month (8+ year) lifetime, which no early-stage company has data to claim.
(Beancount.io 2026-05-10; metrickit LTV guide; forEntrepreneurs SaaS Metrics 2.0; all accessed 2026-06-02.) Worked discounted and cohort examples are in references/formulas.md.
| Anti-pattern | Why it's wrong | Do instead |
|---|---|---|
| Revenue LTV (ARPA ÷ churn) | overstates value; not all revenue is profit | gross-margin LTV: (ARPA × GM%) ÷ churn |
| Ad-spend-only CAC | understates true CAC ~3.5× | fully-loaded S&M ÷ new customers |
| Monthly ARPA with annual churn | silently 12×'s or ÷12's the LTV | match time units before dividing |
| Near-zero churn → 30-year lifetime | fantasy LTV no one can back with data | cap lifetime ≤ 48 mo or ×0.7 multiplier |
| One blended CAC/LTV | hides self-serve vs field; nothing actionable | segment by go-to-motion first |
| Counting CS/retention spend in CAC | inflates CAC; that spend protects LTV, doesn't acquire | keep CS out of the numerator |
| Reading only the LTV:CAC ratio | ignores payback & NRR that decide survivability | read payback + NRR alongside the ratio |
| Quoting NRR while GRR is weak | expansion masks a churn leak | report GRR floor too; fix retention first |
Emit this so the numbers are checkable, not just asserted:
# unit-economics.yaml
inputs:
period_sm_spend: 120000 # fully-loaded S&M, this period
new_customers: 80 # new logos only, same period
monthly_arpa: 400
gross_margin_pct: 0.75
monthly_churn: 0.03 # monthly, to match monthly_arpa
# lifetime_cap_override: 60 # only if you justify > 48 months
outputs:
cac: 1500 # 120000 / 80
contribution_margin: 300 # 400 * 0.75
ltv: 10000 # (400 * 0.75) / 0.03 (NOT 13333)
payback_months: 5 # 1500 / (400 * 0.75)
ltv_cac: 6.67 # 10000 / 1500 -> >5: under-investing
segments: # split when blended hides the truth
- name: self-serve
cac: 80
- name: field-sales
cac: 40000scripts/verify.sh parses this file and fails if: CAC ≠ spend ÷ new_customers; contribution_margin ≠ ARPA × GM%; payback ≠ CAC ÷ (ARPA × GM%); the stated LTV matches the revenue form instead of the gross-margin form; ltv_cac ≠ LTV ÷ CAC within 0.05; or implied lifetime (1/churn) > 48 months with no lifetime_cap_override. It is read-only and exits 0 on a clean worksheet (and on no worksheet at all).
financial-model.pricing.retention.cost-tracking.forecasting.investor-materials.dashboard.© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (scripts, references) in skills/unit-economics of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Unit Economics next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Unit Economics this skillericrisco/rsc-harness | 174 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Creating Financial ModelsChen-zexi/open-ptc-agent | 729 | 3 repos | ~1.3k | Automated safety check: Pass | MIT | |
| Equity ResearchrollingSirius/equity-research-skill | 453 | — | ~1.5k | Automated safety check: Pass | MIT | |
| SaaS Metrics Coachrongxinzy/RongxinAI | 154 | 2 repos | ~1.3k | Automated safety check: Pass | MIT | |
| Startup Financial Modelingnicepkg/auto-company | 194 | 11 repos | ~2.8k | Automated safety check: Pass | None | |
| Stock Value AnalyzerFunnyKun/stock-value-analyzer | 140 | — | ~3.3k | Automated safety check: Pass | None |
Chen-zexi/open-ptc-agent
This skill provides an advanced financial modeling suite with DCF analysis, sensitivity testing, Monte Carlo simulations, and scenario planning for investment decisions
rollingSirius/equity-research-skill
撰写机构级个股投资研究报告(二级市场深度研究)。Use whenever the user wants to research, analyze, or value a specific publicly-traded stock — e.g.
rongxinzy/RongxinAI
SaaS financial health advisor. An agent skill from rongxinzy/RongxinAI.
nicepkg/auto-company
This skill should be used when the user asks to "create financial projections", "build a financial model", "forecast revenue", "calculate burn rate", "estimate runway", "model cash flow", or…
FunnyKun/stock-value-analyzer
基于邱国鹭《投资中最简单的事》方法论的股票价值分析器(v2.0 双层架构)。通过"三好原则"(好行业、好公司、好价格)系统评估一只股票是否值得投资。v2.0 在原定性框架之上注入一套可量化、可复现的硬模型层——反向 DCF 反解市场隐含增速、情景概率加权估值、EPV 盈利能力价值、分行业估值路由、杜邦三/五因子分解、ROIC vs WACC、Piotroski F-Score、Beneish…
edinetdb/dexter-jp
Performs discounted cash flow (DCF) valuation analysis to estimate intrinsic value per share for Japanese listed companies.
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against…. Unit Economics is an agent skill from ericrisco/rsc-harness. Use when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against current norms, and naming the one lever that fixes the worst number.
Unit Economics fits situations like: improving the per-customer economics of a business — CAC; CAC payback period and contribution margin — judging whether the ratios are healthy against current norms; naming the one lever that fixes the worst number.
Run `npx skills add ericrisco/rsc-harness --skill unit-economics -a claude-code`. Or copy the skill folder (skills/unit-economics in ericrisco/rsc-harness) into .claude/skills/unit-economics in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill unit-economics -a codex`. Or copy the skill folder (skills/unit-economics in ericrisco/rsc-harness) into .agents/skills/unit-economics in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill unit-economics -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unit-economics, .gemini/skills/unit-economics, .github/skills/unit-economics and .opencode/skills/unit-economics in your project.
Going by SKILL.md and its folder, Unit Economics needs a shell for the scripts in its folder. Our summary lists: A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Unit Economics is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Unit Economics: Creating Financial Models (Chen-zexi/open-ptc-agent, 729 stars), Equity Research (rollingSirius/equity-research-skill, 453 stars), SaaS Metrics Coach (rongxinzy/RongxinAI, 154 stars) and Startup Financial Modeling (nicepkg/auto-company, 194 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 174 GitHub stars. The repository holds 233 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.