skilldrop-cli 1.7.0 → 1.9.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 (59) hide show
  1. package/README.md +3 -1
  2. package/catalogue.json +16 -1
  3. package/model-routing.json +12 -0
  4. package/package.json +1 -1
  5. package/packs/event-planner/skills/run-of-show/SKILL.md +6 -3
  6. package/packs/event-planner/skills/run-of-show/manifest.json +1 -1
  7. package/packs/event-planner/skills/seating-plan/SKILL.md +6 -3
  8. package/packs/event-planner/skills/seating-plan/evals/evals.json +30 -0
  9. package/packs/event-planner/skills/seating-plan/evals/files/10/hall_notes.txt +13 -0
  10. package/packs/event-planner/skills/seating-plan/evals/files/10/quiz_night_registrations.csv +67 -0
  11. package/packs/event-planner/skills/seating-plan/evals/files/11/notes_for_the_plan.txt +21 -0
  12. package/packs/event-planner/skills/seating-plan/evals/files/11/rsvp_list.csv +77 -0
  13. package/packs/event-planner/skills/seating-plan/evals/files/11/table_plan_draft.csv +78 -0
  14. package/packs/event-planner/skills/seating-plan/manifest.json +1 -1
  15. package/packs/interior-designer/pack.json +60 -0
  16. package/packs/interior-designer/skills/furniture-layout/SKILL.md +182 -0
  17. package/packs/interior-designer/skills/furniture-layout/evals/eval_queries.json +11 -0
  18. package/packs/interior-designer/skills/furniture-layout/evals/evals.json +133 -0
  19. package/packs/interior-designer/skills/furniture-layout/evals/files/2/living-room-notes.md +24 -0
  20. package/packs/interior-designer/skills/furniture-layout/evals/files/3/office-brief.md +18 -0
  21. package/packs/interior-designer/skills/furniture-layout/evals/files/4/furniture_schedule.csv +15 -0
  22. package/packs/interior-designer/skills/furniture-layout/evals/files/4/site_survey.txt +22 -0
  23. package/packs/interior-designer/skills/furniture-layout/evals/files/5/layout_v2.csv +14 -0
  24. package/packs/interior-designer/skills/furniture-layout/evals/files/5/measurements.txt +16 -0
  25. package/packs/interior-designer/skills/furniture-layout/evals/files/6/access_consultant_email.txt +19 -0
  26. package/packs/interior-designer/skills/furniture-layout/evals/files/6/furniture_stock.csv +5 -0
  27. package/packs/interior-designer/skills/furniture-layout/evals/files/6/site_measurements.txt +14 -0
  28. package/packs/interior-designer/skills/furniture-layout/evals/files/7/room_214_layout.csv +11 -0
  29. package/packs/interior-designer/skills/furniture-layout/evals/files/7/room_and_brand_standard.txt +20 -0
  30. package/packs/interior-designer/skills/furniture-layout/evals/files/8/email_from_practice_manager.txt +44 -0
  31. package/packs/interior-designer/skills/furniture-layout/evals/files/8/furniture_we_are_keeping.csv +10 -0
  32. package/packs/interior-designer/skills/furniture-layout/evals/files/9/reading_room_schedule.csv +15 -0
  33. package/packs/interior-designer/skills/furniture-layout/evals/files/9/room_notes.txt +23 -0
  34. package/packs/interior-designer/skills/furniture-layout/examples/king-bed-bedroom.md +121 -0
  35. package/packs/interior-designer/skills/furniture-layout/examples/king-bed-bedroom.svg +57 -0
  36. package/packs/interior-designer/skills/furniture-layout/manifest.json +44 -0
  37. package/packs/interior-designer/skills/furniture-layout/scripts/layout_check.py +1130 -0
  38. package/packs/interior-designer/skills/furniture-layout/templates/layout.json +26 -0
  39. package/packs/operations-manager/skills/shift-roster/SKILL.md +6 -3
  40. package/packs/operations-manager/skills/shift-roster/manifest.json +1 -1
  41. package/packs/startup-legal/pack.json +58 -0
  42. package/packs/startup-legal/skills/cap-table/SKILL.md +131 -0
  43. package/packs/startup-legal/skills/cap-table/evals/eval_queries.json +30 -0
  44. package/packs/startup-legal/skills/cap-table/evals/evals.json +46 -0
  45. package/packs/startup-legal/skills/cap-table/examples/seed-to-series-a.md +81 -0
  46. package/packs/startup-legal/skills/cap-table/manifest.json +34 -0
  47. package/packs/startup-legal/skills/cap-table/scripts/cap_table.py +344 -0
  48. package/packs/startup-legal/skills/cap-table/templates/cap.json +23 -0
  49. package/packs/startup-legal/skills/contract-check/SKILL.md +118 -0
  50. package/packs/startup-legal/skills/contract-check/evals/eval_queries.json +30 -0
  51. package/packs/startup-legal/skills/contract-check/evals/evals.json +46 -0
  52. package/packs/startup-legal/skills/contract-check/evals/files/1/saas-agreement.md +68 -0
  53. package/packs/startup-legal/skills/contract-check/evals/files/2/consulting-agreement.md +64 -0
  54. package/packs/startup-legal/skills/contract-check/evals/files/3/reseller-agreement.md +69 -0
  55. package/packs/startup-legal/skills/contract-check/examples/inputs/saas-agreement.md +68 -0
  56. package/packs/startup-legal/skills/contract-check/examples/saas-agreement.md +72 -0
  57. package/packs/startup-legal/skills/contract-check/manifest.json +34 -0
  58. package/packs/startup-legal/skills/contract-check/reference.md +109 -0
  59. package/packs/startup-legal/skills/contract-check/scripts/contract_check.py +413 -0
@@ -0,0 +1,26 @@
1
+ {
2
+ "title": "Living room, 5.0 × 4.2 m",
3
+ "units": "m",
4
+ "size": [5.0, 4.2],
5
+ "north": 0,
6
+ "min_walkway": 0.9,
7
+ "accessible": false,
8
+ "max_coverage": 0.5,
9
+ "doors": [
10
+ {"name": "Hall door", "at": [0.8, 0], "width": 0.9, "hinge": "left", "swing": "in", "entrance": true}
11
+ ],
12
+ "windows": [
13
+ {"at": [2.5, 4.2], "width": 1.8, "sill": 0.9}
14
+ ],
15
+ "obstacles": [
16
+ {"name": "Radiator", "type": "radiator", "rect": [1.8, 4.1, 1.4, 0.1]}
17
+ ],
18
+ "furniture": [
19
+ {"name": "Sofa", "type": "sofa", "width": 2.2, "depth": 0.9, "at": [0, 1.6], "facing": "E"},
20
+ {"name": "Coffee table", "type": "coffee_table", "width": 1.2, "depth": 0.6, "at": [1.3, 2.1], "facing": "E"},
21
+ {"name": "Armchair", "type": "armchair", "width": 0.85, "depth": 0.85, "at": [3.4, 3.2], "facing": "S"},
22
+ {"name": "TV unit", "type": "tv_unit", "width": 1.6, "depth": 0.45, "at": [4.55, 1.8], "facing": "W"},
23
+ {"name": "Bookcase", "type": "bookcase", "width": 1.0, "depth": 0.35, "at": [3.6, 0], "facing": "N"},
24
+ {"name": "Rug", "type": "rug", "width": 2.0, "depth": 1.6, "at": [1.0, 1.9]}
25
+ ]
26
+ }
@@ -32,7 +32,7 @@ the team.
32
32
  days and change you write is read from the check's per-person summary and its comparison
33
33
  with their original, run on the final rota. Never from memory of an earlier draft.
34
34
  - **Working files stay out of sight.** The check's input and any intermediate file go in a
35
- temporary folder outside the working directory, or are deleted before you reply. Draw the
35
+ private temporary folder made for this run alone (`mktemp -d`, never a fixed path such as `/tmp/roster`, which another session can read or overwrite), and are deleted before you reply. Never overwrite a file the person gave you: write the corrected copy beside it under a plain name (`rota-fixed.csv`), and leave theirs as it was. Draw the
36
36
  week grid only when a drawing is asked for, or as the one extra file named in one line.
37
37
  Never leave anything running in the background; wait for it.
38
38
  - **Carry every field through.** Every column or note the person gave about a person or a
@@ -70,10 +70,11 @@ the team.
70
70
  4. **Check it, and fix every failure before showing anything.**
71
71
 
72
72
  ```bash
73
+ work=$(mktemp -d 2>/dev/null || mktemp -d ./.work.XXXXXX) # a private folder for this run only
73
74
  # Claude Code
74
- python3 "${CLAUDE_SKILL_DIR}/scripts/roster_check.py" "$TMPDIR/roster.json"
75
+ python3 "${CLAUDE_SKILL_DIR}/scripts/roster_check.py" "$work/roster.json"
75
76
  # Other IDEs (from the skill folder); add --svg only when a drawing is wanted
76
- python3 scripts/roster_check.py /tmp/rota/roster.json --svg rota-week-of-2026-11-09.svg
77
+ python3 scripts/roster_check.py "$work/roster.json" --svg rota-week-of-2026-11-09.svg
77
78
  ```
78
79
 
79
80
  Exit 0 means no failures, 1 means a failure, and 2 means the input can't be read. Fix only
@@ -162,5 +163,7 @@ flagged in the reply. With no staff or no shifts at all, emit
162
163
  - ❌ **Searching every arrangement by hand.** Build one, check, fix what fails, five rounds at most.
163
164
  - ❌ **Reshuffling their rota** to fix three problems. Fix the three, and list them.
164
165
  - ❌ **Ignoring "don't put her on more than she needs".** A note is a rule.
166
+ - ❌ **A fixed temporary path.** Two sessions at once share it, and one plan leaks into the other.
167
+ - ❌ **Overwriting the person's own file.** They lose the version they sent.
165
168
  - ❌ **A JSON file and a drawing nobody asked for** left beside their files.
166
169
  - ❌ **"The script says…"** The manager wants the rota and what's wrong with it, not how it was checked.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shift-roster",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Build a staff rota for a week or a fortnight from who is available, what each shift needs and the working-time rules, and check it with a script before anyone sees it — every shift covered with the right skills, nobody double-booked, over their hours, short of rest between shifts or past the consecutive-day limit — drawn as a week grid. Use when a manager asks to \"make the rota\", \"build next week's schedule\", \"who should work which shift\", \"check this rota\", \"fill these shifts\", or has staff availability and shift needs for a shop, restaurant, clinic, warehouse or call centre.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -0,0 +1,58 @@
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), and your cap table modelled through SAFEs, notes and a priced round. 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
+ ],
14
+ "links": {
15
+ "documentation": "https://sananthanarayan.github.io/skilldrop/packs/startup-legal/"
16
+ },
17
+ "maintainers": [
18
+ {
19
+ "name": "sananthanarayan"
20
+ }
21
+ ],
22
+ "first-value": {
23
+ "audience-posture": "non-technical",
24
+ "prerequisites": [
25
+ "The agreement you've been sent, as a Word, Markdown or text file",
26
+ "Python 3 on the machine, which the checks run on"
27
+ ],
28
+ "starter-task": "Check an agreement before you sign it",
29
+ "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?",
30
+ "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.",
31
+ "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."
32
+ },
33
+ "requires": [
34
+ "core"
35
+ ],
36
+ "journey": {
37
+ "when": "You're a founder without a lawyer on retainer, and an agreement, a round or a launch is coming.",
38
+ "you_bring": [
39
+ "the agreement you've been sent, or your own template",
40
+ "your cap table, SAFEs and any term sheet"
41
+ ],
42
+ "steps": [
43
+ {
44
+ "skill": "contract-check",
45
+ "you_do": "Give it the agreement and say which side you're on.",
46
+ "you_get": "A verdict, the fixes to ask for with wording, every mechanical fault with its clause, and the dates to diarise.",
47
+ "decide": "Sign, send the redline, or take the one flagged clause to a lawyer."
48
+ },
49
+ {
50
+ "skill": "cap-table",
51
+ "you_do": "Give it your shareholders, SAFEs, notes and the term sheet.",
52
+ "you_get": "What each founder and investor owns after the round, what each SAFE converted at, and what the pool top-up cost you.",
53
+ "decide": "Which valuation and pool terms to negotiate for."
54
+ }
55
+ ],
56
+ "you_end_with": "Agreements you understand before signing, and a cap table you can defend in a negotiation."
57
+ }
58
+ }
@@ -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
+ }