Historical UI Systems: 40 Years of Invariants
What goldberry learns from windowing systems 1973-1995
Table of Contents
- Purpose
- Plan 9 / Rio / Acme (Bell Labs, 1987-2002)
- X11 ICCCM/EWMH (MIT, 1987-present)
- NeXTSTEP / Display PostScript (NeXT, 1988-1997)
- Xerox PARC (1973-1981)
- Motif / CDE / OPEN LOOK (1988-1996)
- Oberon / NeWS / Andrew (Roads Not Taken)
- Cross-System Invariant Comparison
- Implications for Goldberry's 10 Clusters
- Era Expansion Proposal
- Sources
- Verification Status
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.
Plan 9 / Rio / Acme (Bell Labs, 1987-2002)
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
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
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 |
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)
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
X11 ICCCM/EWMH (MIT, 1987-present)
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.
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 |
Window State Machine
┌─────────────┐
│ Withdrawn │ ← Client controls entry/exit
└──────┬──────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
┌────────┐ ┌─────────┐
│ Normal │ ◄──────► │ Iconic │
└────────┘ └─────────┘
WM controls transitions
Focus Management (WMTAKEFOCUS)
Critical invariant from ICCCM 2.0:
WM must NOT directly SetInputFocus if WMTAKEFOCUS advertised. Must send ClientMessage and wait for client to request focus.
Modern frameworks violate this constantly (focus stealing).
EWMH Extensions (Desktop Era)
| Addition | Invariant | Modern Web Status |
|---|---|---|
| _NETWMDESKTOP | Window occupies specific desktops | No equivalent |
| _NETWMSTATE | State atoms present=set, absent=unset | Partial (ARIA states) |
| Modal dialog | Blocks input to transient-for windows | focus trap (manual) |
Mapping to Goldberry Clusters
| ICCCM Violation | Goldberry Cluster | Bug Volume |
|---|---|---|
| Focus stealing | focusstate | VERY HIGH |
| Event ordering | eventgraph | HIGH |
| Timestamp races | temporality | VERY HIGH |
| Window state transitions | lifecycle | HIGH |
| Selection/clipboard | devicecontract | VERY HIGH |
| Transient stacking | layoutcontract | MEDIUM |
NeXTSTEP / Display PostScript (NeXT, 1988-1997)
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 |
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.
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
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.
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
Xerox PARC (1973-1981)
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 |
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?
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)
What Goldberry Learns
These are the ORIGINAL invariants. Many goldberry clusters trace back to PARC:
- focusstate: First responder concept
- devicecontract: Mouse/keyboard integration
- temporality: Universal undo as temporal invariant
- totality: Direct manipulation requires complete state visibility
Motif / CDE / OPEN LOOK (1988-1996)
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)
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 |
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.
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
Oberon / NeWS / Andrew (Roads Not Taken)
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.
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
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
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
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 |
Implications for Goldberry's 10 Clusters
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 |
| a11ycontract | Text-first UI (intrinsic a11y) | Acme |
| devicecontract | Perfect device abstraction | Plan 9 |
| layoutcontract | Monotonic z-order (no cycles) | Plan 9/Rio |
| eventgraph | Focus-before-event atomicity | Plan 9, NeXTSTEP |
| lifecycle | Design-time connection validation | Interface Builder |
| focusstate | Immutable focus during dispatch | NeXTSTEP |
| securitycontract | Protocol-boundary authentication | Plan 9, NeWS |
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.
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
Sources
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
X11
- Inter-Client Communication Conventions Manual (ICCCM)
- Extended Window Manager Hints (EWMH)
- X Window System Protocol Specification
NeXTSTEP
- NeXTSTEP AppKit Reference Manual (Apple, 1989)
- Display PostScript documentation
- Interface Builder User Manual
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)
Motif/CDE
- OSF/Motif Style Guide Revision 1.2 (1993)
- CDE Infrastructure documentation
- IEEE P1295 (Motif standard)
Alternative Systems
- Wirth, "The Oberon System" (1988)
- Sun NeWS documentation
- Andrew Project papers (CMU)
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.
