Historical UI Systems: 40 Years of Invariants
What goldberry learns from windowing systems 1973-1995
Table of Contents
- 1. Purpose
- 2. Plan 9 / Rio / Acme (Bell Labs, 1987-2002)
- 3. X11 ICCCM/EWMH (MIT, 1987-present)
- 4. NeXTSTEP / Display PostScript (NeXT, 1988-1997)
- 5. Xerox PARC (1973-1981)
- 6. Motif / CDE / OPEN LOOK (1988-1996)
- 7. Oberon / NeWS / Andrew (Roads Not Taken)
- 8. Cross-System Invariant Comparison
- 9. Implications for Goldberry's 10 Clusters
- 10. Era Expansion Proposal
- 11. Sources
- 12. Verification Status
1. Purpose
Goldberry's foundation.org traces web history from HTML 2.0 (1995) forward. But UI invariants predate the web by 20+ years. This document catalogs invariants from historical systems that:
- Were proven correct but not adopted (NeWS, Oberon)
- Codified invariants that the web later violated (X11 ICCCM, NeXTSTEP)
- Established patterns we take for granted (Xerox PARC, Motif)
- Attempted standardization and failed (CDE, 1990s formal methods)
The thesis: Many goldberry invariants were solved in the 1980s. The web re-introduced bugs that earlier systems had eliminated.
2. Plan 9 / Rio / Acme (Bell Labs, 1987-2002)
2.1. Core Innovation: Namespace Isolation
Plan 9's critical invariant: each process has its own namespace view.
Process A sees: /dev/draw -> rio window 1 Process B sees: /dev/draw -> rio window 2 Global /dev/draw does not exist
This eliminates an entire defect class:
- No global DOM pollution
- No "which window has focus" race conditions
- No iframe/shadow-DOM boundary confusion
2.2. 9P Protocol as Single Interface
Everything is a file: drawing, input, network, UI. One protocol enforces:
- Composability invariant: pipe any output to any input
- Auditability invariant: all operations are file operations (logged)
- Security invariant: authentication at protocol boundary, not per-app
2.3. Rio Window Manager Invariants
| Invariant | Enforcement | Web Equivalent | Status |
|---|---|---|---|
| Focus change precedes event dispatch | Button 2/3 clicks change focus BEFORE event | None | VIOLATED |
| Namespace isolation per window | Mount point per process | iframe (partial) | WEAK |
| Z-order is painter's algorithm | Back-to-front, no exceptions | CSS z-index + stacking context | VIOLATED |
| Device abstraction is perfect | /dev/mouse works local or remote | Touch vs mouse vs pointer | COMPLEX |
2.4. Acme Editor: Text-First UI
Acme proves accessibility can be intrinsic:
- Commands are always text-selectable
- Mouse chords are combinations, not sequences (eliminates timing bugs)
- Undo is compositionally independent (each action reversible without coupling)
2.5. What Goldberry Learns
New invariant candidates:
- Namespace isolation: Each interactive context must have its own namespace
- Protocol purity: Single protocol for all resource access
- Focus-before-event: Focus state and event delivery must be atomic
3. X11 ICCCM/EWMH (MIT, 1987-present)
3.1. The Closest Thing to Codified UI Invariants
ICCCM (Inter-Client Communication Conventions Manual) is one of the few systematic UI invariant specifications in computing history.
3.2. Selection Protocol Invariants
| Invariant | Description | Violation Consequence |
|---|---|---|
| Ownership uniqueness | Selection owned by exactly one client | Data corruption |
| Timestamp validity | Future/past timestamps fail silently | Silent ownership loss |
| Request ordering | Identical requests serviced in order | Race conditions |
| Property cleanup | Requestors must delete after retrieval | Memory leak |
3.3. Window State Machine
┌─────────────┐
│ Withdrawn │ ← Client controls entry/exit
└──────┬──────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
┌────────┐ ┌─────────┐
│ Normal │ ◄──────► │ Iconic │
└────────┘ └─────────┘
WM controls transitions
3.4. Focus Management (WM_TAKE_FOCUS)
Critical invariant from ICCCM 2.0:
WM must NOT directly SetInputFocus if
WM_TAKE_FOCUSadvertised. Must send ClientMessage and wait for client to request focus.
Modern frameworks violate this constantly (focus stealing).
3.5. EWMH Extensions (Desktop Era)
| Addition | Invariant | Modern Web Status |
|---|---|---|
_NET_WM_DESKTOP |
Window occupies specific desktops | No equivalent |
_NET_WM_STATE |
State atoms present=set, absent=unset | Partial (ARIA states) |
| Modal dialog | Blocks input to transient-for windows | focus trap (manual) |
3.6. Mapping to Goldberry Clusters
| ICCCM Violation | Goldberry Cluster | Bug Volume |
|---|---|---|
| Focus stealing | focus_state |
VERY HIGH |
| Event ordering | event_graph |
HIGH |
| Timestamp races | temporality | VERY HIGH |
| Window state transitions | lifecycle | HIGH |
| Selection/clipboard | device_contract |
VERY HIGH |
| Transient stacking | layout_contract |
MEDIUM |
4. NeXTSTEP / Display PostScript (NeXT, 1988-1997)
4.1. Display PostScript: Formal Graphics Model
DPS enforced invariants that CSS cannot:
| Contract | DPS | CSS | Gap |
|---|---|---|---|
| Device independence | PostScript as IR | Browser-specific computed values | MAJOR |
| Deterministic rendering | Same code -> same output | Varies by UA/device/extension | MAJOR |
| Typography | Font metrics as formal properties | Web fonts variable, fallbacks fail | MEDIUM |
| Composition | Transform operations well-defined | CSS Transform underspecified | MINOR |
4.2. Responder Chain as Event Graph
NeXTSTEP's event model was NOT like DOM:
NSApplication
└─ NSWindow (first responder context)
└─ NSView tree
└─ [First Responder] -> Super Chain -> App Delegate
Key difference: "Super" meant responder chain ancestor, not DOM parent. You could skip ancestors in the chain.
4.3. Immutable Focus During Dispatch
THE critical invariant NeXTSTEP enforced:
First responder state is immutable while any event is in dispatch.
Web violates this:
button.addEventListener('click', () => { input.focus(); // Changes focus mid-dispatch! }); // Later listeners see different focus context
4.4. Interface Builder: Design-Time Validation
IB enforced at compile time:
- Outlet/action typing (IBOutlet creates compile-time reference)
- Connection validation (signal must have receiver)
- Lifecycle contracts (outlets initialized before awakeFromNib)
Modern web has no equivalent - event listeners can target nonexistent elements.
4.5. What Goldberry Learns
New invariant candidates:
- Focus immutability during dispatch: Focus must not change mid-event
- Rendering determinism: CSS lacks portable IR; frameworks compensate
- Design-time connection validation: All handler connections must resolve at mount
5. Xerox PARC (1973-1981)
5.1. The Original GUI Invariants
Xerox Alto (1973) and Star (1981) established what we now take for granted:
| Invariant | Origin | Status Today |
|---|---|---|
| WIMP (Windows, Icons, Menus, Pointer) | Alto 1973 | Universal |
| Desktop metaphor | Star 1981 | Universal |
| Direct manipulation | Tesler/Star | Universal (but see below) |
| Cut/Copy/Paste universal | Tesler | Universal |
| Modeless interfaces | Tesler | VIOLATED |
| Universal undo | Star | LOST |
| Property sheets | Star | LOST |
5.2. Larry Tesler's "Modeless" Invariant
"Don't mode me in" - avoid modal state that hides available options.
Modern web has modal dialogs everywhere. Is "modeless" still enforceable?
5.3. What the Industry Lost
Star had features that didn't survive:
- Property sheets: Bounded invariant spaces (vs modern unbounded dialogs)
- Universal undo: Every action reversible (modern: app-specific, inconsistent)
- Document-centric: Files are first-class, not windows (modern: app-centric)
5.4. What Goldberry Learns
These are the ORIGINAL invariants. Many goldberry clusters trace back to PARC:
focus_state: First responder conceptdevice_contract: Mouse/keyboard integrationtemporality: Universal undo as temporal invarianttotality: Direct manipulation requires complete state visibility
6. Motif / CDE / OPEN LOOK (1988-1996)
6.1. The Standardization Attempt
OSF/Motif Style Guide (1993) was the first attempt to formally specify a complete GUI standard. It codified:
- Keyboard navigation model (fallback bindings required)
- Widget behavior specifications
- Dialog and window conventions
- Focus semantics (foundational to WCAG 2.1)
CDE (1993-1996) added:
- Session management (reproducible sessions)
- Drag-and-drop protocol (type-safe transfers)
- ToolTalk messaging (inter-app communication)
6.2. Why CDE Failed
| Factor | Impact |
|---|---|
| Licensing barrier | Linux couldn't ship it; two-tier ecosystem |
| Technology speed | Web emerged while CDE standardized |
| Vendor incentive mismatch | Each vendor shipped proprietary extensions |
| Governance collapse | Three reorgs in three years |
6.3. OPEN LOOK vs Motif: Competing Invariants
OPEN LOOK: "Menus are ephemeral by default; user can override with pushpin" Motif: "Menus follow keyboard & mouse conventions from other systems"
Neither was wrong. They encoded incompatible invariant claims. Sun abandoned OPEN LOOK because HP+IBM had more deployment reach.
6.4. Lessons
- Invariants are contestable: Two implementations can both claim correctness
- Ergonomics beats formalism: English + examples won over Z notation
- Licensing matters: CDE failed at licensing, not at specification
- Standards ossify: Living documents (WCAG updates) survive; frozen specs die
7. Oberon / NeWS / Andrew (Roads Not Taken)
7.1. Oberon System (Wirth, 1988)
Oberon forbade overlapping windows by construction:
- Tiled layout only
- No z-index, no stacking context, no depth sorting bugs
- Focus model simpler (no modal stacking pathology)
The invariant: "No two windows may overlap" eliminates an entire defect class.
7.2. NeWS (Sun, 1986)
PostScript-based window system (like DPS). Key difference from X11:
- Drawing commands sandboxed before transmission (security invariant)
- Richer protocol (not "dumb" like X11)
- Lost to X11 because X11 was simpler, not because invariants were wrong
7.3. Andrew Project (CMU, 1983+)
Document embedding precursor to OLE/COM/iframes:
- Compound documents with embedded interactive objects
- "Which component owns focus?" becomes hard question
- Modern web faces same problem: iframe/shadow-DOM boundaries
7.4. What Goldberry Learns
"Overlapping windows" is a CHOICE, not an invariant. Alternative models:
- Tiled (Oberon): simpler focus, guaranteed layout
- Document-embedded (Andrew): focus ownership complexity
- Network-transparent (NeWS, X11): security at protocol boundary
8. Cross-System Invariant Comparison
| System | Focus Model | Event Model | Layout Model | Security Model |
|---|---|---|---|---|
| Plan 9/Rio | Namespace-isolated | File-based | Painter's algorithm | 9P auth |
| X11 | Per-window (ICCCM) | Client-server | Reparenting WM | None (punted) |
| NeXTSTEP | Immutable during dispatch | Responder chain | DPS (formal) | Sandboxed PostScript |
| Xerox Star | First responder | Direct manipulation | Desktop metaphor | Single-user |
| Motif/CDE | Click-to-focus | X11 + extensions | Motif widgets | Session-based |
| Oberon | Tiled (simplified) | Integrated | Tiled (no overlap) | Single-user |
| Modern Web | Variable (a11y issues) | DOM capture/bubble | CSS cascade | Origin-based |
9. Implications for Goldberry's 10 Clusters
9.1. Cluster Gaps Identified
| Cluster | Historical Invariant Missing | Source System |
|---|---|---|
| temporality | Compositional undo independence | Acme |
| totality | Lifecycle transitions are terminal | Plan 9 (file open/close) |
| boundaries | Namespace isolation per context | Plan 9 |
a11y_contract |
Text-first UI (intrinsic a11y) | Acme |
device_contract |
Perfect device abstraction | Plan 9 |
layout_contract |
Monotonic z-order (no cycles) | Plan 9/Rio |
event_graph |
Focus-before-event atomicity | Plan 9, NeXTSTEP |
lifecycle |
Design-time connection validation | Interface Builder |
focus_state |
Immutable focus during dispatch | NeXTSTEP |
security_contract |
Protocol-boundary authentication | Plan 9, NeWS |
9.2. Candidate New Invariants
# From Plan 9 namespace-isolation: cluster: boundaries statement: > Each interactive context must have its own namespace. Global state visible to all contexts is a defect. falsifiable_by: > A web standard that provides per-tab/per-iframe namespace isolation. # From NeXTSTEP focus-immutability: cluster: focus_state statement: > Focus state must not change while an event is in capture/bubble phase. falsifiable_by: > A browser that prevents focus changes during event dispatch. # From Plan 9 monotonic-z-order: cluster: layout_contract statement: > Z-order must never form cycles. Painter's algorithm should be default. falsifiable_by: > CSS stacking context without z-index resets. # From Interface Builder mount-time-validation: cluster: lifecycle statement: > All event handler connections must be validated before first interaction. falsifiable_by: > Framework that errors on dangling event listener references.
10. Era Expansion Proposal
Current goldberry eras:
- E0: 1993-2008 (hand-coded HTML/CSS/JS)
- E1: 2008-now (framework-generated)
- E2: emerging (NL/design-tool generated)
- E3: hypothetical (formal spec generated)
Proposed expansion:
- E-1: 1973-1993 (graphical operating systems)
- Reference implementations: Alto, Star, Lisa, Macintosh, X11, NeXTSTEP
- Invariants established before web existed
- Many goldberry clusters trace back here
11. Sources
11.1. Plan 9
- Pike et al., "Plan 9 from Bell Labs" (1995)
- Pike, "8½, the Plan 9 Window System"
- Pike, "Acme: A User Interface for Programmers" (1994)
- 9P Protocol Documentation
11.2. X11
- Inter-Client Communication Conventions Manual (ICCCM)
- Extended Window Manager Hints (EWMH)
- X Window System Protocol Specification
11.3. NeXTSTEP
- NeXTSTEP AppKit Reference Manual (Apple, 1989)
- Display PostScript documentation
- Interface Builder User Manual
11.4. Xerox PARC
- "Designing the Star" (IEEE Computer, 1982)
- Tesler, "The Graphical User Interface" (1981)
- Kay & Goldberg, "A Personal Computer for Children of All Ages" (1972)
11.5. Motif/CDE
- OSF/Motif Style Guide Revision 1.2 (1993)
- CDE Infrastructure documentation
- IEEE P1295 (Motif standard)
11.6. Alternative Systems
- Wirth, "The Oberon System" (1988)
- Sun NeWS documentation
- Andrew Project papers (CMU)
12. Verification Status
This document synthesizes research from 6 independent agents examining:
- Plan 9 / Rio / Acme
- X11 ICCCM / EWMH
- NeXTSTEP / Display PostScript
- Xerox PARC / Alto / Star
- Motif / CDE / OPEN LOOK
- Oberon / NeWS / Andrew
All claims should be verified against primary sources before Phase 2 corpus entries.