agentleFS
3metaJun3metaJun/mstack/skills/principle-type-system-discipline/SKILL.md

principle-type-system-discipline

Skill0 starsChanged 27 days agoMITView on GitHub

Use in statically typed code to make illegal states unrepresentable, distinguish semantic primitives, parse external data at boundaries, exhaust variants, and derive types from authoritative schemas.

We split this skill into the rules it gives an agent

4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 43 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use the type checker as a proof assistant.

    line 9
  2. Distinctive:

    Model variants explicitly: Prefer sum types, discriminated unions, sealed classes, or enums with payloads over bags of booleans and …

    line 14
  3. Distinctive:

    Distinguish semantic primitives: Use branded, opaque, newtype, value-class, or phantom types when two strings or numbers must not be …

    line 19
  4. Distinctive:

    Do same-primitive arguments represent different concepts?

    line 35

“Common” is measured: kept by at least 6 in 10 of the 43 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Type system discipline

Use the type checker as a proof assistant. Model invariants so invalid states cannot be constructed, rather than spreading runtime guards through the system.

Patterns

  • Model variants explicitly. Prefer sum types, discriminated unions, sealed classes, or enums with payloads over bags of booleans and optional fields.
  • Construct valid values. A non-empty list is a head plus a tail. A valid range is a start plus a validated non-negative duration. Use an opaque or branded duration so raw negative numbers cannot construct the illegal case.
  • Distinguish semantic primitives. Use branded, opaque, newtype, value-class, or phantom types when two strings or numbers must not be interchangeable.
  • Parse at boundaries. JSON, RPC, IPC, CLI args, configuration, environment values, and database rows are untyped until validated into the domain model.
  • Do not lie to the compiler. Replace casts and unchecked assertions with validation, narrowing, or a better model.
  • Exhaust every variant. Configure matching so a new case fails compilation at each incomplete consumer.
  • Derive from the authority. Generate or infer types from protocol, OpenAPI, GraphQL, database, and design-token schemas instead of duplicating shapes.
  • Strengthen only where partiality appears. Extra precision is valuable when it removes a crash or assertion, not when it only adds ceremony.

Review questions

  • Can contradictory field combinations compile?
  • Do same-primitive arguments represent different concepts?
  • Where did each cast, any, non-null assertion, or unsafe operation originate?
  • Will a newly added variant identify every unhandled match at compile time?
  • Is this type duplicating a shape another artifact owns?
  • Does the stronger type make an operation total, or only more elaborate?

Pair this with principle-boundary-discipline to place parsing and validation.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.