Skip to content
Back to skills

Prototype

ASecurity

Objects clone from prototypes, not instances from classes

  • 56 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 6, 2026
developmentjavascriptgojavadebuggingdatabase

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned October 6, 2026

npx -y skills add SimHacker/moollm --skill prototype --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Prototype?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Prototype
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/simhacker-prototype/badge)](https://www.skillsdirectory.com/skills/simhacker-prototype)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: prototype
description: "Objects clone from prototypes, not instances from classes"
license: MIT
tier: 0
allowed-tools: []
related: [skill, room, container, character, card, simulation, constructionism, return-stack, debugging]
tags: [moollm, inheritance, self, javascript, clone, deoptimization]
protocol: PROTOTYPE
credits:
  - "David Ungar — Self language creator"
  - "Randall Smith — Self language co-creator"
  - "Brendan Eich — JavaScript (Self-influenced)"
---

# PROTOTYPE

> **"Objects all the way down."**

The philosophy of prototype-based inheritance: no classes, just concrete examples that you clone and modify.

## Lineage: Self, this skill, and multiple parents

This skill is **directly inspired by Self**. In MOOLLM, **Self is one of this skill’s prototypes**: the schemapedia **[`self` mechanism](../schema/schemas/mechanisms/self/README.md)** names that parent lineage (Ungar, Smith, and collaborators). The same **Delegation Object Protocol** applies to skills as to room instances: an ordered **`PROTOTYPES.yml`** can list **several** parent skills—Self is not the only possible parent. **Because prototype inherits from Self, it already follows the rules that let any MOOLLM object inherit from multiple prototypes** (local wins, then each parent in order, first match wins).

---

## The Problem with Classes

Classical inheritance says:
1. Define an abstract blueprint (class)
2. Instantiate it to create objects
3. Objects are "instances of" classes

But this creates problems:
- **Abstraction gap**: Classes describe things that don't exist
- **Rigidity**: Class hierarchies are hard to change
- **Ceremony**: Lots of boilerplate to create simple things

---

## The Prototype Solution

Prototype-based inheritance says:
1. Create a concrete example (prototype)
2. Clone it to make new objects
3. Modify the clone as needed
4. Clones delegate to prototypes for missing slots

**Everything is concrete. Everything exists.**

### Self as universal object machine

**Self** is a **universal object machine**: a minimal language of objects, slots, and delegation from which you can **implement or host** other object systems—**classes** (as conventions on top of prototypes), **CLOS**-style generic functions and method combination, **generic dispatch** lineages (**ScriptX**, **Dylan**, and related multimethod designs), **COM / OLE / ActiveX**-style component object models, **PostScript** Dictionary Stack NeWS "class.ps" Objects, **JSON** (maps of keys to values as object-shaped data), **YAML Jazz** (semantic comments beside the parsed tree in MOOLLM’s notation layer), and more. Those systems are **not** the same mechanism as Self; they are **targets** you model, embed, or bridge—Self and prototype delegation stay the bedrock.

---

## How Self Works

### Slots

Objects are collections of **slots**:

```
cat: (|
  name <- "Terpie".
  color <- "orange".
  meow = (| | "Meow!" |).
  parent* = catPrototype.
|)
```

- `name`, `color` — data slots
- `meow` — method slot
- `parent*` — parent slot (for delegation)

### Delegation

When you send a message to an object:
1. Look in the object's own slots
2. If not found, look in parent's slots
3. Continue up the chain
4. First match wins

### Cloning

To create a new cat:
```
newCat := cat clone.
newCat name: "Stroopwafel".
newCat color: "tabby".
```

The new cat:
- Has its own `name` and `color` slots
- Delegates `meow` to the prototype
- Can add new slots anytime

---

## MOOLLM Implementation

MOOLLM implements prototype inheritance via the **Delegation Object Protocol (DOP)**:

### PROTOTYPES.yml

```yaml
# In an instance directory
prototypes:
  - path: "skills/room"
  - path: "skills/adventure"
  
resolution:
  strategy: "first-match-wins"
```

### File Resolution

1. Check local directory
2. Check each prototype in order
3. First match wins
4. State never inherits (always local)

### Example: A Room Instance

```
examples/adventure-4/pub/
├── ROOM.yml           # Local override (shadows prototype)
├── PROTOTYPES.yml     # Points to skills/room
├── state/             # Local-only state
│   └── visitors.yml
└── (missing files delegate to skills/room/)
```

---

## Why Prototypes for LLMs?

LLMs don't compute inheritance algorithms. They navigate files.

Prototype-based inheritance is **LLM-friendly** because:
- **Explicit**: You can see the prototype chain
- **Navigable**: Just follow file paths
- **Concrete**: No abstract classes to imagine
- **Forgettable**: Each lookup is independent

---

## The Wisdom of Self

From the abstract of *Self: The Power of Simplicity* (Ungar & Smith, OOPSLA ’87):

> *Self is an object-oriented language for exploratory programming based on a small number of simple and concrete ideas: prototypes, slots, and behavior.*

Source: [Self bibliography](http://bibliography.selflanguage.org/self-power.html) · [PDF](http://bibliography.selflanguage.org/_static/self-power.pdf)

Self taught us that simplicity wins:
- One mechanism (slots) instead of many
- Objects are just dictionaries
- Methods are just slots that happen to be code
- Inheritance is just delegation

MOOLLM applies this: directories are objects, files are slots, resolution is delegation.

---

## Historical Context

| Year | Event |
|------|-------|
| 1986 | Ungar & Smith begin Self at Xerox PARC |
| 1987 | Self paper published |
| 1991 | Self 2.0 with compilation |
| 1995 | JavaScript created (heavily Self-influenced) |
| 2024 | MOOLLM applies Self to LLM filesystems |

---

## See Also

- **[../skill/delegation-object-protocol.md](../skill/delegation-object-protocol.md)** — The DOP specification
- **[../skill/skill-instantiation-protocol.md](../skill/skill-instantiation-protocol.md)** — How skills become instances
- **[../constructionism/](../constructionism/)** — Learning by building
- **[../character/](../character/)** — Characters as prototype instances

---

## Further Reading

- Ungar, D. & Smith, R. (1987). *Self: The Power of Simplicity* — [bibliography](http://bibliography.selflanguage.org/self-power.html), [PDF](http://bibliography.selflanguage.org/_static/self-power.pdf)
- Smith, R. B. & Ungar, D. (1995). *Programming as an Experience: The Inspiration for Self* — [bibliography](http://bibliography.selflanguage.org/programming-as-experience.html), [PDF](http://bibliography.selflanguage.org/_static/programming-as-experience.pdf)
- Ungar, D. (1995). *Organizing Programs Without Classes*
- [selflanguage.org](http://selflanguage.org/)
- Curtis, P. (1997). *LambdaMOO Programmer's Manual* — [HTML](https://www.hayseed.net/MOO/manuals/ProgrammersManual.html) (objects, verbs, and the virtual reality as a programmable database)

Files in this skill

  • CARD.yml3.2 KB
  • CHARACTER.yml5.5 KB
  • GLANCE.yml1.6 KB
  • README.md6.7 KB
  • SKILL.md6.6 KB
  • skill-snitch-report.md3.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…