standing-rules
The owner's standing rules for sahin.io/angel-investments and how to record a new one. Use whenever the owner says "always", "never", "this is a rule", "from now on" or "every time", before editing CLAUDE.md, and when unsure whether an owner preference applies.
- Source file
.claude/skills/standing-rules/SKILL.md
Standing rules
Recording a new rule
When the owner says "always", "never" or "this is a rule", do this in the same turn. A rule that lives only in chat is lost.
- Write it into the skill that owns that work (create one if none fits), and list it below.
- If it needs a reviewer, add or update an agent in
.claude/agents/. - Enforce it some other way when you can: a test in
server/*.test.ts, a gate or validator step, or a hook (update-configskill; user-level~/.claude/settings.jsonwhen the rule is about more than this repo). - Manus reads
skills/. Point at the Claude skill there; don't copy it. - Save it to agent memory.
- Keep CLAUDE.md thin (owner, 2026-10-11): at most a one-line pointer.
server/claude-md-thin.test.tsfails when it grows past its limit.
The rules-keeper agent does steps 1–6 for you.
Rules
- Keep CLAUDE.md thin; rules live in skills, agents, tests and hooks (owner, 2026-10-11).
- Always keep
angel-investments-performance(owner, 2026-10-11), the private Angel Simulator: never delete, archive, history-rewrite or scrub it. Enforced by a user-level hook. Details:private-data-boundaryskill. - Private deal data and AngelList links never leave the Simulator
(owner, 2026-10-11):
private-data-boundaryskill,private-data-auditoragent,server/private-deal-data.test.ts,pnpm privacy:bundle. - Only one IRR, the general one (owner, 2026-10-11: "IRR is ok, general
IRR is ok, only one IRR is allowed, which is general"). The portfolio-wide
figure lives only in
data/portfolio-performance.yaml(generalIrr) viashared/portfolioPerformance.ts; copy uses{irr}. No per-company or per-deal IRR, no second IRR figure:private-data-boundaryskill,server/general-irr-single-source.test.ts. - Never show a VC firm's logo or brand mark in a theme (owner, 2026-10-11: "this is a rule"). VC-inspired themes copy a firm's layout, type, colors and image style only; where the firm's page shows its logo, use Sahin's
SahinMark(client/src/components/views/publicThemePrimitives.tsx). The theme gallery has no firm logo images. - No source notes or "(sourced)" labels on public pages (owner, 2026-10-11). Company values read "Market cap $2.21T" with the amount linking to its source (tooltip "Publisher, Mon YYYY") via
shared/publicCompanyValueFormat.ts/server/publicCompanyValue.ts; research text passes throughshared/sourceNotes.ts; never write "(Publisher, Month)" or "(sourced)" in copy. - Content lives in YAML + Markdown, not in code (owner, 2026-10-11: "no html code, yaml + markdown only"):
page-content-yamlskill;server/content-in-yaml.test.tsfails when a page file gains inline copy (baselinecontent/migration/inline-copy-baseline.json). - Short company names come from
data/company-display-names.yaml(e.g. Kraken). Runnode scripts/company-display-names.mjsafter editing it; the Airtable sync re-applies it. Slugs never change. - No accelerator cohort tags in company names (owner, 2026-10-12: "remove
them from their name, this should be a rule"). "Ressl AI (YC W26)" is shown
as "Ressl AI"; the slug stays.
scripts/company-display-names.mjsstrips(YC …)from every public data file, the Airtable plan reports the tagged Airtable name as kept, andserver/company-name-no-cohort-tag.test.tsfails the gate if one returns. - Counts come from one source of truth:
portfolio-counts-single-sourceskill,server/portfolio-status-single-source.test.ts. - Write public URLs in full (
sahin.io/angel-investments/anthropic/angel-investors):public-url-conventionsskill. - Airtable updates use the Manus view only:
airtable-manus-syncskill. - Auto-ship mode is ON:
ship-to-productionskill. "auto-ship off" pauses it. - Every change runs the deploy gate:
deploy-gateskill. - Every visible change shows before/after screenshots (desktop + mobile):
ui-before-afterskill.