skilldrop-cli 1.8.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +2 -1
  2. package/catalogue.json +10 -1
  3. package/model-routing.json +12 -0
  4. package/package.json +1 -1
  5. package/packs/startup-legal/pack.json +66 -0
  6. package/packs/startup-legal/skills/cap-table/SKILL.md +131 -0
  7. package/packs/startup-legal/skills/cap-table/evals/eval_queries.json +30 -0
  8. package/packs/startup-legal/skills/cap-table/evals/evals.json +46 -0
  9. package/packs/startup-legal/skills/cap-table/examples/seed-to-series-a.md +81 -0
  10. package/packs/startup-legal/skills/cap-table/manifest.json +34 -0
  11. package/packs/startup-legal/skills/cap-table/scripts/cap_table.py +344 -0
  12. package/packs/startup-legal/skills/cap-table/templates/cap.json +23 -0
  13. package/packs/startup-legal/skills/contract-check/SKILL.md +118 -0
  14. package/packs/startup-legal/skills/contract-check/evals/eval_queries.json +30 -0
  15. package/packs/startup-legal/skills/contract-check/evals/evals.json +46 -0
  16. package/packs/startup-legal/skills/contract-check/evals/files/1/saas-agreement.md +68 -0
  17. package/packs/startup-legal/skills/contract-check/evals/files/2/consulting-agreement.md +64 -0
  18. package/packs/startup-legal/skills/contract-check/evals/files/3/reseller-agreement.md +69 -0
  19. package/packs/startup-legal/skills/contract-check/examples/inputs/saas-agreement.md +68 -0
  20. package/packs/startup-legal/skills/contract-check/examples/saas-agreement.md +72 -0
  21. package/packs/startup-legal/skills/contract-check/manifest.json +34 -0
  22. package/packs/startup-legal/skills/contract-check/reference.md +109 -0
  23. package/packs/startup-legal/skills/contract-check/scripts/contract_check.py +413 -0
  24. package/packs/startup-legal/skills/lease-check/SKILL.md +119 -0
  25. package/packs/startup-legal/skills/lease-check/evals/eval_queries.json +30 -0
  26. package/packs/startup-legal/skills/lease-check/evals/evals.json +45 -0
  27. package/packs/startup-legal/skills/lease-check/evals/files/1/heads-of-terms.md +15 -0
  28. package/packs/startup-legal/skills/lease-check/evals/files/2/heads-of-terms.md +32 -0
  29. package/packs/startup-legal/skills/lease-check/evals/files/3/heads-of-agreement.md +29 -0
  30. package/packs/startup-legal/skills/lease-check/examples/first-office.md +75 -0
  31. package/packs/startup-legal/skills/lease-check/examples/inputs/heads-of-terms.md +15 -0
  32. package/packs/startup-legal/skills/lease-check/manifest.json +33 -0
  33. package/packs/startup-legal/skills/lease-check/reference.md +70 -0
  34. package/packs/startup-legal/skills/lease-check/scripts/lease_terms.py +276 -0
  35. package/packs/startup-legal/skills/lease-check/templates/terms.json +15 -0
package/README.md CHANGED
@@ -51,7 +51,7 @@ A good result runs your lint, typecheck and tests through a gate script, then a
51
51
  In Claude Code you can use the plugin marketplace instead: run `/plugin marketplace add sananthanarayan/skilldrop`, then `/plugin install dev-team@skilldrop`. [Every install route](guides/how-to/install.md) covers single skills, other IDEs, loops, reviewer subagents, profiles and updates.
52
52
 
53
53
  <details>
54
- <summary><b>Choose your role:</b> 20 packs, from product management and architecture to SRE, GRC, job applications and building design</summary>
54
+ <summary><b>Choose your role:</b> 24 packs, from product management and architecture to SRE, GRC, job applications, building design and startup legal</summary>
55
55
 
56
56
  Install one pack. Every role pack also brings `core` (intake, critique, review council, output hygiene, and the decisions behind a codebase). Each pack page has a starter prompt to paste and says what a good result looks like.
57
57
 
@@ -77,6 +77,7 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
77
77
  - **Running a team on shifts:** `operations-manager` — a weekly rota checked for cover, hours, rest between shifts and days in a row, handed back in your own sheet. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/operations-manager/)
78
78
  - **Running events:** `event-planner` — a seating plan where every together, keep-apart and access request holds, and a run of show with no room or person booked twice, both checked and drawn. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/event-planner/)
79
79
  - **Furnishing rooms:** `interior-designer` — a dimensioned furniture plan for one room, checked for door swings, bed and chair clearances, a clear route to everything and turning space where it's required. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/interior-designer/)
80
+ - **Startup founders:** `startup-legal` — an agreement checked before you sign it, with wording to push back on, your cap table through SAFEs and a priced round, and your first office lease's real cost and exit dates. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/startup-legal/)
80
81
  - **Everyone:** `core` on its own. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/core/)
81
82
 
82
83
  </details>
package/catalogue.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0034. The catalogue index: pack display order and the outcome browse axis (RFC-0026). Pack metadata lives in packs/<pack>/pack.json; membership is the folders — a skill is in a pack because it sits at packs/<pack>/skills/<name>/.",
3
3
  "version": "1.0.0",
4
- "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career", "civil-architect", "operations-manager", "event-planner", "interior-designer"],
4
+ "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career", "civil-architect", "operations-manager", "event-planner", "interior-designer", "startup-legal"],
5
5
  "outcomes": {
6
6
  "decide-what-to-build": {
7
7
  "for": "Product managers · founders · strategists",
@@ -235,6 +235,15 @@
235
235
  "skills": [
236
236
  "furniture-layout"
237
237
  ]
238
+ },
239
+ "handle-the-legal-basics": {
240
+ "for": "Founders without a lawyer on retainer",
241
+ "description": "Sign agreements you understand and know what a round does to your ownership, with a clear line on what is worth paying a lawyer for.",
242
+ "skills": [
243
+ "contract-check",
244
+ "cap-table",
245
+ "lease-check"
246
+ ]
238
247
  }
239
248
  },
240
249
  "retired": {
@@ -194,6 +194,10 @@
194
194
  "tier": "heavy",
195
195
  "rationale": "Weighted multi-option judgment with a committal recommendation — cheaper models mis-weight costs, inflate benefits, and miss the flip-assumption. Never downgrade."
196
196
  },
197
+ "cap-table": {
198
+ "tier": "standard",
199
+ "rationale": "Turning SAFEs, notes and a term sheet into the script's input and explaining the result is bounded; the script does the conversion math."
200
+ },
197
201
  "capacity-cost-model": {
198
202
  "tier": "standard",
199
203
  "rationale": "Quantitative projection from a demand model against a fixed cost catalog. Headroom and scaling-cliff judgment is bounded by the reference; escalate via ambiguous-input on novel architectures."
@@ -210,6 +214,10 @@
210
214
  "tier": "standard",
211
215
  "rationale": "Rewrites source text from user needs under fixed plain-language rules, with a script for the readability numbers. Prioritising questions needs judgment, but facts come from the source."
212
216
  },
217
+ "contract-check": {
218
+ "tier": "heavy",
219
+ "rationale": "The mechanical faults come from the script; reading every clause from the founder's side and writing the wording to ask for is legal judgment."
220
+ },
213
221
  "council-review": {
214
222
  "tier": "heavy",
215
223
  "rationale": "Multi-perspective deliberation + weighted reconciliation across distinct expert seats. Cheaper models collapse the seats into one voice and either manufacture or miss the real cruxes. Never downgrade."
@@ -343,6 +351,10 @@
343
351
  "tier": "standard",
344
352
  "rationale": "Checks evidence against a fixed checklist. Bounded synthesis, not adversarial review."
345
353
  },
354
+ "lease-check": {
355
+ "tier": "standard",
356
+ "rationale": "Extracting lease terms and reading clauses from the tenant's side is bounded; the script does the dates and sums."
357
+ },
346
358
  "llm-eval-harness": {
347
359
  "tier": "light",
348
360
  "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 71% and 71% of checks in two tier trials, against standard's 71% and heavy's 71% and 71%, within 5 points of the best both times."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -0,0 +1,66 @@
1
+ {
2
+ "description": "Legal groundwork for a startup that can't yet pay a lawyer for everything: an agreement checked before you sign it (blanks, broken cross-references, mismatched amounts, the renewal date, and the clauses that hurt a small company, with wording to ask for), your cap table modelled through SAFEs, notes and a priced round, and your first office lease turned into its real commitment and exit dates. Each says what is worth a lawyer's hour.",
3
+ "display_name": "Startup legal",
4
+ "keywords": [
5
+ "legal",
6
+ "startup",
7
+ "founder",
8
+ "contract review",
9
+ "NDA",
10
+ "SAFE",
11
+ "cap table",
12
+ "dilution",
13
+ "lease"
14
+ ],
15
+ "links": {
16
+ "documentation": "https://sananthanarayan.github.io/skilldrop/packs/startup-legal/"
17
+ },
18
+ "maintainers": [
19
+ {
20
+ "name": "sananthanarayan"
21
+ }
22
+ ],
23
+ "first-value": {
24
+ "audience-posture": "non-technical",
25
+ "prerequisites": [
26
+ "The agreement you've been sent, as a Word, Markdown or text file",
27
+ "Python 3 on the machine, which the checks run on"
28
+ ],
29
+ "starter-task": "Check an agreement before you sign it",
30
+ "starter-prompt": "We're the customer in this SaaS agreement (agreement.docx), and the first year ends on 1 July 2027. Review it before I sign: what's broken, what should I push back on, and when do we have to give notice if we don't want it to renew?",
31
+ "verification": "contract-check opens with a verdict and the three things that matter most, lists each mechanical fault with its clause number (blanks, references to clauses or exhibits that don't exist, amounts whose words and figures disagree), gives wording to ask for on each clause that hurts you, and gives the renewal notice deadline as a date.",
32
+ "recovery": "If contract-check does not activate, ask for it by name (\"use contract-check\"). If your agreement is a PDF, save it as Word or text first."
33
+ },
34
+ "requires": [
35
+ "core"
36
+ ],
37
+ "journey": {
38
+ "when": "You're a founder without a lawyer on retainer, and an agreement, a round or a launch is coming.",
39
+ "you_bring": [
40
+ "the agreement you've been sent, or your own template",
41
+ "your cap table, SAFEs and any term sheet",
42
+ "the heads of terms or draft lease for an office"
43
+ ],
44
+ "steps": [
45
+ {
46
+ "skill": "contract-check",
47
+ "you_do": "Give it the agreement and say which side you're on.",
48
+ "you_get": "A verdict, the fixes to ask for with wording, every mechanical fault with its clause, and the dates to diarise.",
49
+ "decide": "Sign, send the redline, or take the one flagged clause to a lawyer."
50
+ },
51
+ {
52
+ "skill": "cap-table",
53
+ "you_do": "Give it your shareholders, SAFEs, notes and the term sheet.",
54
+ "you_get": "What each founder and investor owns after the round, what each SAFE converted at, and what the pool top-up cost you.",
55
+ "decide": "Which valuation and pool terms to negotiate for."
56
+ },
57
+ {
58
+ "skill": "lease-check",
59
+ "you_do": "Give it the heads of terms or the draft lease.",
60
+ "you_get": "What signing commits you to up to each break and to the end, every notice deadline as a date, and the clauses to push back on with wording.",
61
+ "decide": "Sign, negotiate, or take the guarantee or break clause to a lawyer."
62
+ }
63
+ ],
64
+ "you_end_with": "Agreements you understand before signing, a cap table you can defend, and an office lease whose cost and exits you know."
65
+ }
66
+ }
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: cap-table
3
+ description: Work out who owns what in a startup through its SAFEs, convertible notes and a priced round — each SAFE's and note's conversion price and whether its cap or discount applied, the price per share, the option-pool top-up and who it dilutes, the fully diluted cap table before and after, and founder ownership at other valuations — computed by a script that checks the post-money and the 100 % total. Use when a founder asks "how much of my company will I own after this round", "model our SAFEs converting", "what does this term sheet do to our cap table", "how much have I given away in SAFEs", or "compare a $12M and a $16M pre-money".
4
+ ---
5
+
6
+ # cap-table
7
+
8
+ The numbers a founder needs before signing a term sheet or another SAFE: what each investor
9
+ ends up with, what the option pool top-up really costs, and how much of the company the
10
+ founders keep. A capable agent gets the simple case right and the real one wrong: a stack of
11
+ post-money SAFEs at different caps, a pre-money SAFE beside them, a note accruing interest,
12
+ and a pool top-up the lead investor wants in the pre-money. A script solves the round exactly,
13
+ including the circularity where the SAFEs' shares depend on the price and the price on the
14
+ SAFEs, and checks that the post-money equals price × shares and ownership sums to 100 %.
15
+
16
+ ## How to respond
17
+
18
+ **These rules come before the steps and outrank them:**
19
+
20
+ - **Answer the founder first, in a founder's words.** Lead with the number they asked for:
21
+ ✅ *"After the round you each own 28.3 %, down from 45 % today. The pool top-up costs you
22
+ about $1.1M of the headline $16M."* Never mention a script, a JSON file, this skill's name
23
+ or a path inside its folder, never call your work "the check" or "a tool", and never show
24
+ a temporary path.
25
+ - **Every number in the reply comes from the computed cap table,** run on the final inputs.
26
+ Never do conversion arithmetic in your head, and never round a percentage the table didn't.
27
+ - **Say which terms you assumed, and which way each one cuts.** A SAFE's type (post-money or
28
+ pre-money), whether the pool top-up sits in the pre-money, and when interest stops are the
29
+ terms that move founder ownership the most. When the founder didn't say, use the default
30
+ below, tag it `[assumption]`, and give the figure under the other reading when it changes
31
+ the founder's stake by more than half a point.
32
+ - **Name what is worth a lawyer's hour, and only that.** One or two lines, specific to this
33
+ round: ✅ *"Before you sign: have counsel confirm whether the 10 % pool is pre- or
34
+ post-money in the term sheet — it moves you by 2.4 points."* Never refuse, never open with
35
+ a disclaimer, never pad with "this is not legal advice".
36
+ - **Working files stay out of sight.** Write the input to a private folder made for this run
37
+ (`mktemp -d`, never a fixed path) and delete it before replying. A spreadsheet the founder
38
+ asked for goes in their working directory under a plain name. Never overwrite a file they
39
+ gave you.
40
+ - **Their cap table comes back in its own shape.** Given a spreadsheet or table, return the
41
+ after-round table with the same columns and holder order, with new rows added at the end.
42
+
43
+ 1. **Gather the inputs.** From the conversation or the files named (a cap table export, a
44
+ SAFE, a term sheet):
45
+ - **Shareholders:** each holder's shares today (founders, employees, early common).
46
+ - **Options:** granted and outstanding, and the unissued pool.
47
+ - **Each SAFE:** amount, valuation cap, discount, post-money or pre-money, MFN.
48
+ - **Each note:** principal, interest rate, issue date, cap, discount.
49
+ - **The round,** if there is one: pre-money valuation, each new investor's amount, the
50
+ option pool target after the round, the closing date.
51
+
52
+ Defaults when unsaid: a SAFE signed from 2018 on is post-money (YC's current form); a SAFE
53
+ with only a cap converts at the cap; the pool target is in the pre-money (the usual term
54
+ sheet); note interest is simple and runs to closing. Ask at most two questions, and only
55
+ for a missing share count or SAFE amount, which no default can stand in for.
56
+
57
+ 2. **Write the input** in the shape of [`templates/cap.json`](templates/cap.json): `holders`,
58
+ `options`, `safes` (with `type`: `post` or `pre`), `notes`, and `round`. Discounts and the
59
+ pool target are fractions (`0.2`) or percents (`20`).
60
+
61
+ 3. **Run it.**
62
+
63
+ ```bash
64
+ work=$(mktemp -d 2>/dev/null || mktemp -d ./.work.XXXXXX) # a private folder for this run only
65
+ # Claude Code
66
+ python3 "${CLAUDE_SKILL_DIR}/scripts/cap_table.py" "$work/cap.json" --scenarios 12m,16m,20m
67
+ # Other IDEs (from the skill folder); --csv writes the after-round table for a spreadsheet
68
+ python3 scripts/cap_table.py "$work/cap.json" --csv cap-table-after-series-a.csv
69
+ ```
70
+
71
+ Exit 0 means computed, 1 means a check failed or the round can't settle (the SAFEs' caps
72
+ leave no room at that valuation, which is itself the answer), and 2 means the input can't
73
+ be read. Read every `WARN`: an MFN SAFE with no terms of its own, interest left out for a
74
+ missing date.
75
+
76
+ 4. **Run it again for each assumption that matters.** Flip the SAFE type, or move the pool
77
+ to post-money, and keep the figures from both runs for the reply.
78
+
79
+ 5. **Reply in this order:**
80
+ 1. **The answer** to what they asked, in one or two sentences, with each founder's stake
81
+ before and after.
82
+ 2. **The cap table after the round** as a table: holder, shares, percent.
83
+ 3. **What each SAFE and note converted at,** and whether its cap or its discount set the price.
84
+ 4. **What the pool top-up costs the existing holders:** the headline pre-money against the
85
+ effective one.
86
+ 5. **Other valuations,** when they asked or when the round is being negotiated.
87
+ 6. **Assumptions,** one line each, with what changes under the other reading.
88
+ 7. **What to have a lawyer confirm,** one or two lines.
89
+
90
+ **Non-interactive runs** (subagent, CI, headless): unsaid terms take the defaults above, each
91
+ tagged `[assumption]`. With no share counts at all, emit `BLOCKED: need each shareholder's
92
+ shares (or the cap table export) and each SAFE's amount and cap`.
93
+
94
+ ## Useful references in this skill
95
+
96
+ - [`templates/cap.json`](templates/cap.json) — the input: two founders, a pool, three SAFEs of mixed types, a note and a Series A
97
+ - [`scripts/cap_table.py`](scripts/cap_table.py) — solves the round, conversion by cap or discount, pool top-up, scenarios, and checks the totals
98
+ - [`examples/seed-to-series-a.md`](examples/seed-to-series-a.md) — worked example: three SAFEs and a note into a Series A, and what the pool top-up really cost
99
+
100
+ ## Quality bar
101
+
102
+ - **Every figure comes from the computed table,** and the post-money equals price × fully diluted shares.
103
+ - **Each SAFE and note shows its conversion price and what set it,** cap or discount.
104
+ - **The pool top-up's cost is stated in money,** not only in shares.
105
+ - **Every unsaid term is a stated assumption,** with the other reading's figure when it moves the founders by more than half a point.
106
+ - **The reply leads with the founders' ownership,** in plain words, with no mention of scripts or files.
107
+ - **At most two lawyer lines,** each specific to this round.
108
+
109
+ ## When to use this skill
110
+
111
+ - ✅ A term sheet arrived and the founders want to know what they keep
112
+ - ✅ Raising another SAFE and checking what the stack already gives away
113
+ - ✅ Comparing two offers, or two valuations, on founder ownership
114
+ - ✅ Explaining to a co-founder or an early employee what the round does to their stake
115
+
116
+ ## When NOT to use this skill
117
+
118
+ - ❌ Valuing the company: this takes the valuation as given
119
+ - ❌ Tax on options or shares (83(b) elections, ISOs, EMI schemes): ask a tax adviser
120
+ - ❌ Liquidation waterfalls on an exit: this models ownership, not who is paid first in a sale
121
+ - ❌ Drafting the SAFE or the term sheet itself
122
+
123
+ ## Anti-patterns to avoid
124
+
125
+ - ❌ **Treating a post-money SAFE like a pre-money one.** A $500k post-money SAFE at an $8M cap is 6.25 % before the round; under the old pre-money form it is less, and founders bear the difference.
126
+ - ❌ **Forgetting the pool top-up comes out of the founders.** A 10 % post-money pool in the pre-money turns a $16M headline into about $14.9M for the existing holders.
127
+ - ❌ **Converting a note on its principal.** Eighteen months at 6 % is 9 % more shares.
128
+ - ❌ **Applying the discount and the cap together.** The SAFE takes whichever gives the lower price, not both.
129
+ - ❌ **A percentage table that sums to 99.7 %.** The check catches it; a hand-built one doesn't.
130
+ - ❌ **"This is not legal advice" as an opening line.** Say what to have checked, specifically, at the end.
131
+ - ❌ **"The script shows…"** The founder wants their percentage.
@@ -0,0 +1,30 @@
1
+ [
2
+ {
3
+ "query": "How much of my company will I own after this Series A?",
4
+ "should_trigger": true
5
+ },
6
+ {
7
+ "query": "Model our three SAFEs converting into the seed round",
8
+ "should_trigger": true
9
+ },
10
+ {
11
+ "query": "Compare founder dilution at a $12M and a $16M pre-money",
12
+ "should_trigger": true
13
+ },
14
+ {
15
+ "query": "How much have we given away in SAFEs so far?",
16
+ "should_trigger": true
17
+ },
18
+ {
19
+ "query": "Review this SAFE agreement before I sign it",
20
+ "should_trigger": false
21
+ },
22
+ {
23
+ "query": "Build a three-statement financial model for our seed deck",
24
+ "should_trigger": false
25
+ },
26
+ {
27
+ "query": "Write the business case for hiring two engineers",
28
+ "should_trigger": false
29
+ }
30
+ ]
@@ -0,0 +1,46 @@
1
+ {
2
+ "skill_name": "cap-table",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Two founders, 4.5M shares each. 250k options granted, 750k unissued in the pool. SAFEs: $500k post-money at $8M cap; $125k post-money at $6M cap with 20% discount; $100k pre-money SAFE at $5M cap, 20% discount. Plus a $50k note at 6% from 2025-06-01, $5M cap, 20% discount. Term sheet: $16M pre, $4M lead + $1M follow-on, 10% pool post-money, closing 2026-12-15. What do we each own after?",
7
+ "assertions": [
8
+ "States each founder owns about 28.3 % after the round, down from 45 % today",
9
+ "Shows each SAFE and the note converting at its cap, with prices of about 0.7095, 0.5322, 0.4613 and 0.4613",
10
+ "Counts the note's interest: about $54,619 converts, not $50,000",
11
+ "Says the pool top-up (about 840,000 shares) comes out of the pre-money and gives its cost in money (about $1.1M, an effective pre-money near $14.9M)",
12
+ "The after-round table sums to 100 %",
13
+ "Does not mention a script, a JSON file or the skill's name in the reply",
14
+ "Does not invent a liquidation preference, vesting term or investor not in the prompt"
15
+ ]
16
+ },
17
+ {
18
+ "id": 2,
19
+ "held_out": "2026-11-06",
20
+ "prompt": "Raising a $4M seed at $16M pre. Investors want a 10% unallocated option pool after close. Right now me and my cofounder have 4,000,000 shares each, the option pool is 1,000,000 with 600,000 granted, and there's one post-money SAFE: $1M at a $10M cap. How much will I own after the round?",
21
+ "assertions": [
22
+ "The $1M post-money SAFE converts at its cap: $10M ÷ 10,000,000 shares (the capitalization before the new money, including the SAFE itself) gives $1.00 per share and about 1,000,000 shares (±1%), which is 10% before the round",
23
+ "The seed price is about $1.458 per share (±$0.01), calculated on a pre-money fully diluted count of about 10.97M shares that includes the converted SAFE and the pool top-up",
24
+ "The option pool grows by about 971,000 new options (±1%), so that 1,371,429 unallocated options are 10% after the round. It says the top-up comes out of the pre-money and so dilutes the founders, the SAFE holder and existing option holders, not the new investor",
25
+ "The seed investor gets about 2.74M shares (±1%), which is 20% of the company. The post-money valuation is $20M on about 13.71M fully diluted shares, and the after-round table adds up to 100%",
26
+ "The founder owns about 29.2% (±0.3 points) fully diluted after the round (the two founders together about 58.3%). It compares this with 40% before the round counting the SAFE as converted (or 44.4% leaving the SAFE out)",
27
+ "It shows the cap table before and after the round, one row per holder: each founder, granted options, unallocated pool, the SAFE and the seed investor",
28
+ "It does not invent investors, discounts, interest, vesting terms or other securities that are not in the prompt"
29
+ ]
30
+ },
31
+ {
32
+ "id": 3,
33
+ "held_out": "2026-11-06",
34
+ "prompt": "We're Tamarack Health in Toronto. Our Series A term sheet says CA$5M at a CA$20M pre-money, and the lead wants a 12% unallocated option pool after the round, counted in the pre-money. Closing is set for 15 March 2027. Current cap table: Priya Venn (me) 5,000,000 common, Owen Laska 3,000,000 common; the option plan has 1,500,000 reserved with 900,000 granted. What converts: (a) a CA$500,000 post-money SAFE from March 2023 with a CA$8M valuation cap and no discount; (b) a CA$1,000,000 YC SAFE from June 2024 with a CA$12M cap and no discount (I honestly can't remember if it's the pre- or post-money version); (c) a CA$300,000 convertible note issued 15 March 2025 at 6% simple interest, with a 15% discount and a CA$30M cap, converting in this round with accrued interest. Owen thinks we each keep what we have now minus the investor's 20%, which would put me at about 42%. What will I actually own? And what if the lead drops to CA$16M pre?",
35
+ "assertions": [
36
+ "It says the June 2024 SAFE's type is unknown, treats it as post-money (the YC post-money SAFE has been the standard form since 2018) and asks Priya to check the document. On that basis it converts at the cap: about CA$1.05–1.08 per share and about 927,000–952,000 shares",
37
+ "The March 2023 SAFE converts at its CA$8M cap: about CA$0.70–0.72 per share and about 695,000–714,000 shares",
38
+ "The note converts CA$336,000 (CA$300,000 principal plus exactly two years of 6% simple interest, CA$36,000). It says the 15% discount beats the CA$30M cap, so the note converts at 85% of the Series A price, about CA$1.336 (±1%), into about 250,000–252,000 shares, and that the cap did not apply",
39
+ "At CA$20M pre: the Series A price is about CA$1.57–1.58 per share and the pool top-up is about 1.30–1.31M new options, counted in the pre-money. The investor gets about 3.17–3.18M shares (20%), the post-money valuation is CA$25M on about 15.8–15.9M fully diluted shares, and the table adds up to 100%",
40
+ "Priya owns about 31.5% (±0.5 points) fully diluted after the round. It tells her Owen's 42% is wrong because it leaves out the two SAFEs, the note and the pool top-up, all of which come out of the pre-money before the investor's 20%",
41
+ "At CA$16M pre: the Series A price is about CA$1.24 (±1%), the investor owns about 23.8%, and Priya about 29.5% (±0.5 points). Both SAFEs still convert at their caps, and the note still converts at the discount (about CA$1.05)",
42
+ "It does not invent shareholders, warrants, preferred-stock terms, legal advice on Canadian securities rules or securities that are not in the prompt"
43
+ ]
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,81 @@
1
+ # Worked example: three SAFEs and a note into a Series A
2
+
3
+ ## Input
4
+
5
+ > *"We're two founders with 4.5M shares each, 250k options granted and 750k left in the pool.
6
+ > We raised $500k on a post-money SAFE at an $8M cap, $125k from an accelerator (post-money,
7
+ > $6M cap, 20 % discount), $100k from an early angel on the old pre-money SAFE ($5M cap, 20 %
8
+ > discount), and a $50k friends-and-family note at 6 % from June 2025 ($5M cap, 20 %). The
9
+ > term sheet: $16M pre, $4M from the lead and $1M follow-on, 10 % option pool post-money,
10
+ > closing mid-December. What do we each end up with?"*
11
+
12
+ ## Input written (in a private temporary folder)
13
+
14
+ ```json
15
+ {
16
+ "company": "Example Labs, Inc.",
17
+ "currency": "USD",
18
+ "holders": [
19
+ {"name": "Founder A", "class": "common", "shares": 4500000},
20
+ {"name": "Founder B", "class": "common", "shares": 4500000}
21
+ ],
22
+ "options": {"granted": 250000, "pool_unissued": 750000},
23
+ "safes": [
24
+ {"holder": "Angel syndicate", "amount": 500000, "type": "post", "cap": 8000000},
25
+ {"holder": "Accelerator", "amount": 125000, "type": "post", "cap": 6000000, "discount": 0.2},
26
+ {"holder": "Early angel", "amount": 100000, "type": "pre", "cap": 5000000, "discount": 0.2}
27
+ ],
28
+ "notes": [
29
+ {"holder": "Friends and family note", "principal": 50000, "rate": 0.06, "issued": "2025-06-01", "cap": 5000000, "discount": 0.2}
30
+ ],
31
+ "round": {
32
+ "pre_money": 16000000,
33
+ "investors": [{"name": "Series A lead", "amount": 4000000}, {"name": "Series A follow-on", "amount": 1000000}],
34
+ "pool_target": 0.10,
35
+ "close": "2026-12-15"
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Reply
41
+
42
+ **After the Series A you each own 28.3 %, down from 45 % today.** The new investors take
43
+ 23.8 %, the SAFEs and note 8.0 % together, and the option pool 11.6 %.
44
+
45
+ | Holder | Class | Shares | % |
46
+ |---|---|---:|---:|
47
+ | Founder A | common | 4,500,000 | 28.30 |
48
+ | Founder B | common | 4,500,000 | 28.30 |
49
+ | Angel syndicate | preferred (safe) | 704,673 | 4.43 |
50
+ | Accelerator | preferred (safe) | 234,891 | 1.48 |
51
+ | Early angel | preferred (safe) | 216,801 | 1.36 |
52
+ | Friends and family note | preferred (note) | 118,415 | 0.74 |
53
+ | Series A lead | preferred (round) | 3,028,714 | 19.05 |
54
+ | Series A follow-on | preferred (round) | 757,178 | 4.76 |
55
+ | Options granted | options | 250,000 | 1.57 |
56
+ | Option pool, unissued | options | 1,590,074 | 10.00 |
57
+ | **Total** | | **15,900,746** | **100.00** |
58
+
59
+ **What each SAFE and note converted at.** All four convert at their caps; none of the
60
+ discounts gives a lower price at $1.3207 a share.
61
+
62
+ | SAFE or note | Invested (with interest) | Converts at | By | Shares |
63
+ |---|---:|---:|---|---:|
64
+ | Angel syndicate (post-money safe) | $500,000 | 0.7095 | cap | 704,673 |
65
+ | Accelerator (post-money safe) | $125,000 | 0.5322 | cap | 234,891 |
66
+ | Early angel (pre-money safe) | $100,000 | 0.4613 | cap | 216,801 |
67
+ | Friends and family note (pre-money note) | $54,619 | 0.4613 | cap | 118,415 |
68
+
69
+ **What the pool top-up costs you.** The term sheet's 10 % pool has to be topped up by 840,074
70
+ shares, and they come out of the pre-money. That makes the $16M headline worth $14.9M to the
71
+ existing holders: about $1.1M of the valuation goes to future hires before you've hired them.
72
+ If the lead agreed to top up the pool after the round instead, you'd each hold 28.8 %, half a
73
+ point more.
74
+
75
+ **Assumptions**
76
+ - `[assumption]` The pool is in the pre-money, the usual term. Moved after the round, you each hold 28.83 % instead of 28.30 %.
77
+ - `[assumption]` The note's interest runs to 15 December 2026: $54,619 converts, not $50,000.
78
+
79
+ **Before you sign:** have your lawyer confirm whether the term sheet's 10 % pool is pre- or
80
+ post-money, and that the early angel's SAFE really is the pre-money form; that is what
81
+ converts it at $0.46 rather than at its post-money equivalent.
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "cap-table",
3
+ "version": "0.1.0",
4
+ "description": "Work out who owns what in a startup through its SAFEs, convertible notes and a priced round — each SAFE's and note's conversion price and whether its cap or discount applied, the price per share, the option-pool top-up and who it dilutes, the fully diluted cap table before and after, and founder ownership at other valuations — computed by a script that checks the post-money and the 100 % total. Use when a founder asks \"how much of my company will I own after this round\", \"model our SAFEs converting\", \"what does this term sheet do to our cap table\", \"how much have I given away in SAFEs\", or \"compare a $12M and a $16M pre-money\".",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": []
13
+ },
14
+ "related": [],
15
+ "tags": [
16
+ "cap-table",
17
+ "safe",
18
+ "convertible-note",
19
+ "fundraising",
20
+ "dilution",
21
+ "option-pool",
22
+ "startup"
23
+ ],
24
+ "permissions": {
25
+ "network": [],
26
+ "commands": [],
27
+ "files": "named-paths",
28
+ "notes": "Reads the cap.json it is given and writes a CSV only to the path passed with --csv."
29
+ },
30
+ "model": {
31
+ "tier": "standard",
32
+ "rationale": "Turning SAFEs, notes and a term sheet into the script's input and explaining the result is bounded; the script does the conversion math."
33
+ }
34
+ }