MIT CADR and LM-3 TV window system reimplementation specification
Status and reconstruction claim
This document specifies enough of the TV window system to build a new, implementation-independent system with the same architecture and externally visible behavior as the preserved Lisp Machine software. The primary compatibility target is the runnable LM-3 System 303-0 environment. MIT System 46 is a separately identified historical profile, not an interchangeable source tree. A conforming implementation can choose either profile or implement both.
The target through T4 is semantic and behavioral compatibility, not a bit-identical world image or drop-in compatibility with every historical Lisp caller. The specification covers the object model, state transitions, coordinate and raster rules, locking, stream behavior, exposure and saved-bit algorithms, input routing, mouse ownership, menus, scroll windows, frames, constraints, the System Menu, and conformance tests. It does not require CADR microcode, 36-bit object representation, Flavors internals, or the original compiled instruction sequences. Those can be replaced if the normative behavior remains the same. Exact historical package, symbol, lambda-list, multiple-value, condition, method-combination, and load-order compatibility is reserved as T5 and is not claimed by this document.
Three boundaries remain important:
- Public System 46 source establishes source-visible behavior. Preserved QFASLs corroborate compiled module and symbol surfaces only; they neither prove method bodies nor necessarily match the highest readable source generation beside them. Neither witness proves the contents of the later System 303 band.
- The maintained LM-3 source and the
System 303-0band are independently identified. A source result is not labeled as observed band behavior unless the harness exercised it or the live image was introspected. - A requirement marked
TODO-RUNTIMEis sufficiently specified from source or a manual to implement, but has not yet been compared with the preserved running band. It must not be used as evidence of pixel-perfect compatibility.
Normative language and evidence codes
The words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are normative. “Historical implementation” describes the inspected software without requiring a new implementation to use the same technique. Exact Lisp symbols are written in code font; a new implementation may expose idiomatic aliases while retaining them in a compatibility layer.
Every substantial requirement has one or more evidence codes:
| Code | Meaning |
|---|---|
S46-SRC |
Direct inspection of the pinned public System 46 source |
S46-QF |
A public System 46 QFASL survives for the named module; this is compiled-artifact corroboration, not proof that it matches the latest readable revision |
303-SRC |
Direct inspection of the pinned maintained LM-3 System 303 source |
303-RUN |
Direct behavior in the preserved System 303-0 band through the Xvfb harness |
MIT-MAN |
Contemporary MIT Lisp Machine or window-system manual material |
MIT-WP209 |
Moon and Wechsler's user-level operations paper, explicitly accurate as of System 67; corroboration of the visible model, not System 46 or System 303 implementation evidence |
INFERRED |
An implementation-independent rule synthesized from the sources; the synthesis is identified rather than presented as original terminology |
TODO-RUNTIME |
Implemented or documented in a primary source, but not yet exercised in the preserved band |
The evidence code describes support, not priority. When source, compiled inventory, manual, and runtime differ, the release-specific runtime wins for that observed band; the disagreement remains in the record.
Compatibility profiles and levels
Release profiles
| Profile | Required target | Deliberate boundary |
|---|---|---|
TV-46 |
MIT System 46 source behavior at Git revision 8e978d7d1704096a63edd4386a3b8326a2e584af |
No live compatible System 46 band has yet been exercised; visible claims remain source/manual based |
TV-303 |
LM-3 system-303 source at Fossil check-in 4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91 and the System 303-0 band |
The Fossil branch is a maintained restoration; its modern check-in date is not a historical authorship date |
TV-DUAL |
Both profiles behind explicit feature/version selection | Must not silently average different menus, confirmation policy, selection registries, or attribute protocols |
The TV-46 source profile and the preserved System 46 compiled surface are not identical labels. In particular, stream.qfasl has a stream.10-level definition surface while the highest readable file is stream.14; the exact boundary is recorded under Compiled-artifact method and source skew.
Conformance levels
| Level | Name | Required facilities |
|---|---|---|
| T0 | Raster substrate | Screen arrays, coordinate rules, clipping, Boolean ALU operations, BITBLT, rectangles, lines, and bitmap-font drawing |
| T1 | Sheet and stream core | Sheet tree, geometry and margins, cursors, blinkers, text output, input buffer, locking, activation, exposure, deexposure, refresh, and saved bits |
| T2 | Interactive windows | Selection, processes, keyboard focus and typeahead, mouse routing and ownership, who-line state and pointer documentation, labels, borders, and typeout behavior |
| T3 | Reusable UI families | Menus, multiple choice, temporary/typeout windows, scroll windows and bars, item sensitivity, frames, panes, and constraint layout |
| T4 | Environment integration | System Menu, System-key registry, recent-window selection, Screen Editor hooks, screen manager, multiple screens, and boot ordering |
| T5 | Historical source compatibility (reserved) | Exhaustive public package/symbol inventory, exact lambda lists and defaults, multiple values, conditions, Flavors method combinations, compatibility aliases, and module/load contracts sufficient to run unmodified historical clients; not claimable from this revision |
A product may claim a lower level without implementing the higher ones. It MUST state its release profile and level together, such as TV-303/T3. T0 through T4 are enough to recreate the architecture and tested user-visible behavior described here; they do not by themselves promise that arbitrary System 46 or System 303 application source will compile unchanged.
Evidence ledger
| Subsystem | Readable implementation | Compiled or band evidence | Observed behavior | Contemporary description |
|---|---|---|---|---|
| Raster, fonts, and sheets | tvdefs, sheet, stream, shwarm, graphics in both public source lines |
System 46 QFASLs corroborate module/symbol surfaces with an exact stream version skew; the System 303 band draws the observed desktop and applications |
Integrated applications exercise raster output; a focused listener probe confirms exact negative-origin inside clipping and reversible XOR | MIT Lisp Machine Manual, “The TV Display” and “The Window System” |
| Exposure, priority, and screen management | sheet, baswin, scrman |
Corresponding System 46 QFASLs; resident System 303 windows render overlapping menu/sheet states | System Menu appeared and disappeared over the Listener; no before/after restoration-region hash yet exists | MIT operations and window documentation |
| Keyboard, mouse, and selection | stream, basstr, mouse, proces |
System 46 compiled modules; active System 303 input and selection registries | Right click opens System Menu, pointer hover changes documentation, System selection and typed Listener input work | MIT keyboard, mouse, and window chapters |
| Typeout and notifications | typwin, basstr, selection/process mixins |
System 46 typwin, basstr, and proces QFASLs |
Integrated typeout/error windows are visible in applications, but the overlay and interesting-window state machines have not been isolated | MIT window selection and notification material |
| Menus, scroll, choices | menu, scroll, tscrol, choice, typwin |
System 46 QFASLs for all five families | Three-column System Menu, menu highlighting, ZWEI Help menus, and application choices | MIT menu and window documentation |
| Frames and constraints | frame |
System 46 frame.qfasl; frame objects are resident in the running System 303 environment |
ZWEI, Inspector, Peek, Zmail, and Screen Editor show pane/frame composition | MIT frame and constraint documentation plus application manuals |
| Who line and color | shwarm, tvdefs, color |
Corresponding System 46 QFASLs; live band has a monochrome who line | Item-dependent mouse documentation is observed; process/file transitions and all color behavior remain unexercised | MIT who-line and color-screen material |
| Environment integration | sysmen, scred, wholin, system declarations |
Corresponding compiled modules where preserved; System 303-0 is the live artifact |
Exact System Menu, live System Help registry, Screen Editor menu, and who line captured | MIT operations manual |
The runtime column establishes representative integration, not every destructive or timing-sensitive branch. The test suite below identifies the remaining probes.
Release-bounded operations-paper corroboration
Moon and Wechsler's April 1981 MIT AI Laboratory Working Paper 209, Operating the Lisp Machine (stable MIT record), materially corroborates the user-visible model: bit-raster screens allocated among programs and menus, windows as independent subdisplays and streams, selection as keyboard focus, exposed/deexposed states, rectangular cursor blinkers, popup menus, Output Hold, notification for deexposed output, and selection causing exposure (especially §§2.1-2.3). The examined 2,586,142-byte PDF has SHA-256 a16d45f5d425e05c6df7c67a5d785c3dd62424a37bed5be8575b7ebbf1e8ff23.
The paper explicitly says that it is a draft accurate as of System 67 and is not guaranteed to remain fully accurate. It therefore supplies MIT-WP209 corroboration for concepts and visible interaction only. It is not evidence for System 46 or System 303 array redirection, coordinates, clipping, ALUs, saved-bit algorithms, lock ordering, API names, or release deltas. Any claim derived from it MUST retain the System 67 qualifier beside the claim; source and runtime evidence govern the two profiles specified here.
Architectural decomposition
The TV system is a hierarchy of active display objects rather than a compositor of independent top-level pixel buffers. The following ordering is normative even when a new implementation uses different modules:
- A raster device supplies one or more addressable planes and Boolean block transfer.
- A
SCREENis the rootSHEETfor one display and supplies its pixel storage and device properties. - A
SHEETowns a rectangular coordinate space, output state, optional off-screen saved bits, inferiors, exposed inferiors, and synchronization state. - Stream mixins make a sheet accept character and keyboard operations.
- Window mixins add activation, selection, process, label, border, mouse, typeout, and screen-management policy.
- Menus, scroll windows, choices, and frames are composed from those protocols.
- The screen manager, System Menu, and selection registries coordinate the complete tree.
This order matters. A frame pane is still a sheet and stream; a menu is not a second host toolkit; a temporary menu protects and restores ordinary TV pixels; and the who line participates in the same input and selection environment.
Coordinate, rectangle, and raster model
Coordinate system
- The origin MUST be the top-left of a screen or sheet. X increases right and Y increases down. (
S46-SRC,303-SRC,MIT-MAN) - Rectangles MUST use half-open edges
[left,right) × [top,bottom). Width isright-left; height isbottom-top. High-level clipped rectangle operations may accept a negative origin and discard the portion before the clip edge; they issue no raster primitive when the post-clip width or height is nonpositive. Negative requested dimensions are not a general high-level drawing feature. Signed dimensions at the lower-level historical BITBLT boundary are different: internal move code uses their signs to select overlap-safe traversal. (S46-SRC,303-SRC,303-RUN) - A sheet's
x-offsetandy-offsetare relative to its superior. Drawing coordinates and cursor positions are local to the sheet. Device coordinates are obtained by summing offsets through the superior chain. (S46-SRC,303-SRC) - An inferior MUST remain entirely within its superior before it becomes exposed and while an exposed move or reshape commits. An attempted violating visible operation MUST fail before changing visible geometry. Activation establishes membership and ordering but is not, by itself, evidence that every inactive construction path performed the same containment check. (
S46-SRC,303-SRC) - Margins are local nonnegative widths. The inside rectangle is
[left-margin,width-right-margin) × [top-margin,height-bottom-margin). (S46-SRC,303-SRC)
Screen pixel storage
A screen implementation MUST expose these logical properties even if the host GPU or framebuffer differs:
Screen {
name
width, height
bits_per_pixel
raster_storage
locations_per_line
default_font
device_properties
root_sheet_state
}
TV-46 MUST support the historical one-bit monochrome path. Multi-plane or indexed color MAY be supplied through the screen's depth and properties; it MUST NOT change the sheet coordinate or hierarchy rules. The compatibility layer SHOULD expose a pixel array and the coarser backing-word view expected by diagnostic software.
Boolean raster operations
The compatibility raster substrate MUST implement the ALU selectors directly established by the manuals and inspected source. A backend MAY implement all 16 Boolean functions of source bit S and destination bit D, but this audit has not established stable public names or identical multi-plane semantics for that complete truth-table set. The required compatibility names are:
| Name | Result | Typical use |
|---|---|---|
ALU-SETA |
S |
copy source; save or restore bits |
ALU-IOR |
S OR D |
draw set source bits |
ALU-XOR |
S XOR D |
reversible blinkers and highlights |
ALU-ANDCA |
D AND NOT S |
erase through a one-bit mask |
ALU-SETZ |
0 |
clear destination |
BITBLT(alu,width,height,source,sx,sy,destination,dx,dy) MUST combine the corresponding pixels over the requested rectangle. It MUST produce memmove-like results for overlapping source and destination regions: traversal direction or an equivalent temporary representation MUST prevent source pixels from being destroyed before use. It MUST preserve pixels outside the destination rectangle. (S46-SRC, 303-SRC, MIT-MAN)
Clipping is operation- and release-specific:
- In System 46,
:DRAW-RECTANGLEtranslates inside-relative coordinates and clips on all four inside edges. Its stream:BITBLTonly limits destination width and height at the right and bottom; negative origins are not repaired. The:BITBLT-FROM-SHEET,:PIXEL, and:SET-PIXELmethods add no explicit clipping. A safe implementation MAY add checked variants, but MUST NOT label that extension exactTV-46behavior. (stream.14:L133-L172;S46-SRC) - System 303 adds
BITBLT-CLIPPED, which clips both source and destination against all four array edges, and its sheet methods use inside-aware clipping. Its source contract says negative dimensions are not allowed; the readable body clamps the resulting extents to zero and omits the primitive BITBLT when either extent is zero, but does not visibly establish that a negative argument signals a condition. Negative dimensions are therefore outside the publicBITBLT-CLIPPEDcontract, not a required error result. (window/sheet.lisp:L33-L57,window/shwarm.lisp:L94-L201;303-SRC) - The low-level BITBLT used for margin and overlap moves still permits signed dimensions as a traversal-direction convention. A host backend may normalize the operation through an immutable temporary copy, but MUST preserve the same final pixels. (
sheet.383:L758-L782;S46-SRC,303-SRC)
Lines, rectangles, and text
- Axis-aligned fills MUST reduce to a clipped rectangle operation.
- System 46
:DRAW-LINEaccepts aDRAW-END-POINTargument whose default is true; after inside-coordinate translation and clipping it passes that flag to the%DRAW-LINEmicrocoded primitive.:DRAW-LINESdeliberately passes false for every segment, which makes it suitable for closed polygons without drawing shared terminal points twice. A reconstruction MUST preserve that endpoint-control contract. The inspected public tree declares but does not contain a readable body for%DRAW-LINE; exact tie breaking, octant pixel sets, and reversal invariance remainTODO-RUNTIME, not normative claims. (stream.14:L508-L573;S46-SRC) - A font is a fixed-height collection of bitmap glyphs with baseline, default width, optional per-character widths, optional left kern, optional indexing for wide glyphs, and an optional character-existence table. Wide glyphs occupy the indexing-table interval between a character entry and the following terminal entry. A NIL existence table means every character code is assumed to exist, not that none do. (
tvdefs.181:L342-L385;sheet.383:L507-L545;S46-SRC) - A sheet font map MUST normalize to 26 entries. A shorter nonempty map repeats its last font through entry 25. Entry zero supplies the initial current font and default character width. The common baseline is the maximum mapped-font baseline; line height is the maximum mapped character-cell height plus vertical spacing (
VSP, initially 2 inTV-46). Each glyph is vertically adjusted to that common baseline. (sheet.383:L507-L545;S46-SRC) - Raster extent and cursor advance are distinct. Drawing applies left kern, draws every indexed raster segment, and advances by a per-character width when present or the font default otherwise; italic or kerned pixels may extend beyond the nominal advance. A character is positioned by aligning its baseline with the sheet baseline.
- Character drawing MUST use the sheet's character ALU; erasing and blank areas MUST use its erase ALU. Reverse video is expressed by changing those logical operations, not by changing character codes.
- If a glyph is missing according to a font's existence table, the compatibility layer SHOULD fall back according to the target profile rather than reading uninitialized raster data.
The font source and recovery and font-use audit specify the public font representation and release-bounded uses. Font bytes are inputs to this window specification, not redefined here.
Core object and state model
SHEET
A conforming sheet MUST retain the following logical state:
Sheet {
name
superior: Sheet | null
inferiors: ordered list<Sheet>
exposed_inferiors: ordered subset of inferiors
active: boolean derived from membership in superior.inferiors
exposed: boolean
x_offset, y_offset, width, height
margins: {left, top, right, bottom}
screen_array: visible or saved raster mapping | null
old_screen_array: mapping used when direct visible storage is unavailable
bit_array: optional persistent off-screen backing
temporary_bit_array: optional underlay saved by a temporary window
locked_temporary_windows: list<Sheet>
cursor_x, cursor_y, more_vpos
font_map, current_font, baseline, baseline_adjustment, line_height, char_width
char_alu, erase_alu
flags
blinkers: list<Blinker>
deexposed_typeout_action
lock_owner_or_temporary_owners, recursive_lock_count
invisible_to_mouse
screen_manager_metadata
}
An implementation MAY derive fields or store them in components. It MUST preserve the following distinct predicates:
| Predicate | Meaning |
|---|---|
| Active | The sheet is a current inferior of its superior and participates in management |
| Exposed | The sheet is in the superior's exposed set and has completed the logical expose transition |
| Device-visible | The sheet and every ancestor map ultimately to an exposed physical screen |
| Selected | The global keyboard-selection target is this window or a selecting alias resolves to it |
| Mouse owner | The mouse overseer currently dispatches to it, or it has explicitly seized ownership |
Conflating these states breaks saved bits, frames, and temporary menus. An exposed inferior of a deexposed saved-bits parent can be logically exposed without appearing on the physical display.
SCREEN
A screen MUST be a sheet with no superior, fixed zero-relative origin, physical storage, device depth, default font, and a mouse-blinker collection. It MUST reject an attempt to expose it at a different origin. Multiple screens MUST form independent root trees, while selection and mouse-screen policy MAY span them. (S46-SRC, 303-SRC)
BLINKER
Blinker {
sheet
position or follows_sheet_cursor
visibility: hidden | solid | blink | selected-only-on | selected-only-off
deselected_visibility
phase
half_period
time_until_toggle
renderer_and_arguments
geometry
}
A blinker renderer MUST be reversible. The rectangular and character blinkers use XOR-like complementing so the same operation removes the mark. Before any output can touch a blinker rectangle, the sheet MUST “open” that blinker by removing its visible phase. A later clock opportunity restores the phase appropriate to visibility and selection. This prevents typeout from baking a cursor into the backing pixels.
Changing a blinker's position, size, renderer, sheet, or visibility MUST first remove its old visible effect. A cursor-following blinker derives its position from the sheet; a roving mouse blinker does not need a text cursor owner.
Input buffer
The input system has both a global hardware/software keyboard queue and private per-stream I/O buffers. The selected window caches one selected I/O buffer. A reader first drains its private buffer; only a reader whose private buffer is the selected I/O buffer may then drain global typeahead. An unselected reader waits even if the global queue is nonempty. The historical manuals do not promise deterministic arbitration between two readers of one shared stream, so a compatibility layer MUST NOT invent such a guarantee. (S46-SRC, 303-SRC, MIT-MAN)
Each I/O buffer is a circular queue with an input pointer, output pointer, capacity, optional input/output and interrupt hooks, state, and property list. One slot is reserved so equal pointers unambiguously mean empty; (input+1) mod capacity == output means full. Pointer updates MUST be atomic relative to keyboard and mouse producers. (S46-SRC, 303-SRC)
The state controls whether data can be inserted or removed. A producer MUST NOT overwrite unread input. In the inspected System 46 ingress path, a full buffer simply does not receive the additional key; no source branch establishes a beep or blocking write. The compatibility profile MUST preserve that drop behavior unless a later runtime probe establishes a different TV-303 path. TYI-NO-HANG returns immediately when empty; LISTEN reports availability without consuming; UNTYI makes one item available again according to the stream contract; forced input enters the target buffer or structured-blip path rather than pretending to be a physical device transition.
Construction, sizing, and decoration grammar
Creation transaction and initial state
TV-46 WINDOW-CREATE is an ordered construction sequence under delayed screen management, not allocation followed by unrelated public mutations. A compatible implementation MUST preserve this observable order:
allocate the requested flavor in sheet storage
enter delayed screen management
invoke :INIT with a private copy of the option list
if saved backing exists, force access and perform a complete refresh
if :ACTIVATE-P, activate
if :EXPOSE-P, expose with the supplied or default exposure arguments
leave delayed screen management; if its queue is nonempty, flush/reconcile it once as a batch
return the initialized object
:INIT is recursively sheet-locked. A queued screen-management pass cannot run between initialization steps, and the object does not enter the superior's active inferior traversal until activation. Arbitrary flavor initialization methods may still have side effects; the source does not promise global rollback or isolation if one of them fails. TV-303 retains this construction model while treating the older MAKE-WINDOW name as a compatibility entry and changing the Flavors initialization method combination; an adapter MAY accept both names but MUST keep profile-specific warnings and argument behavior separate. (sheet.383:L371-L387, tvdefs.181:L585-L606, window/sheet.lisp:L671-L691; S46-SRC, 303-SRC)
The TV-46 sheet initializer accepts at least these option families:
- outer geometry:
:LEFT/:X,:TOP/:Y,:RIGHT,:BOTTOM, and:EDGES; - pixel, inside, or character-based width and height;
- font map and vertical spacing;
- blinker creation, renderer, and deselected visibility;
- reverse video, More processing, integral sizing, and saved bits; and
- right-margin marker, line truncation, and backspace policy.
Its defaults include vertical spacing 2, More enabled, a rectangular following blinker whose deselected visibility is :ON, and output initially held while the sheet is not displayable. Normal video uses ALU-IOR for glyphs and ALU-ANDCA for erase; reverse video exchanges those roles. An implementation MUST install all derived font, margin, ALU, cursor, blinker, and exception state before activation. (sheet.383:L397-L456; S46-SRC)
Size deduction precedence
Construction MUST solve size options by the historical precedence rather than by host-widget defaults:
- Compute fonts, line height, and decoration margins before interpreting character sizes.
- Numeric character width means
count * default-character-width + left-margin + right-margin. For string width,TV-46uses the final X advance returned bySHEET-STRING-LENGTH, whileTV-303uses its maximum-X result; each then adds the horizontal margins. - Numeric character height means
count * line-height + top-margin + bottom-margin. InTV-46, string height is(1 + number-of-CR-characters) * line-heightplus vertical margins. InTV-303, string height is the vertical result ofSHEET-COMPUTE-MOTIONplus margins. TV-303clamps decoded character width and height to the superior's inside width and height. The inspectedTV-46decoder does not perform those clamps.- If an origin is absent but the opposite edge and an explicit size exist, derive the origin from them.
- Otherwise an absent left/top defaults to the superior's inside left/top. If width or height remains absent, subtract that chosen origin from the explicitly supplied right/bottom edge; use the superior's inside right/bottom only when the corresponding opposite edge is also absent.
- Integral sizing adjusts the bottom margin so the inside height contains a whole number of text lines.
- Set the initial cursor to the inside top-left in whole-sheet coordinates.
Redundant fields follow that precedence; they do not generically signal a conflict. For example, an already bound origin and explicit size can make a supplied right/bottom redundant. In TV-303, processing :EDGES clears any width/height already accumulated from defaults so the supplied edges control deduction, and it explicitly rejects nonpositive edge width or height. Other invalid results MUST NOT be assigned a historically invented error condition: reproduce the selected source path or declare a safety-corrected validation extension. (sheet.383:L507-L591, shwarm.162:L730-L785, window/sheet.lisp:L704-L789; S46-SRC, 303-SRC)
Resize and margin transaction
On its successful path, changing size, margins, borders, or a label MUST preserve this operation order:
- erase obsolete margin pixels while the old geometry is still valid;
- preserve the cursor relative to the old inside origin;
- parse options, update margin fields, and derive offsets and outer dimensions;
- deexpose children that no longer fit;
- remove blinkers, recompute font/integral sizing, and clamp cursor and blinker positions;
- grow backing arrays when necessary without discarding retained pixels;
- redirect the stable screen-array view to the new storage, offset, and stride;
- move surviving inside pixels with overlap-safe signed BITBLT and clear newly uncovered or unreachable storage; and
- erase/refresh the new margin regions and hand any queued damage to screen management.
The readable TV-46 method is not atomic on failure: it erases old margins before option parsing, mutates recognized margin fields as it walks the option list, and sets geometry before later raster work. A strict historical-failure profile MAY reproduce those partial effects. The recommended safety-corrected rule is INFERRED: validate and stage the mutation, then commit atomically or restore the old geometry and pixels. An implementation using that rule MUST disclose that its abort behavior is safer than exact TV-46; it MUST still produce the same successful final state and MUST NOT reinterpret retained client pixels as margin pixels. (sheet.383:L681-L827; S46-SRC, 303-SRC, INFERRED)
Border descriptor grammar
The TV-46 border option has this grammar:
| Form | Meaning |
|---|---|
NIL |
no borders |
| atom | apply one descriptor to left, top, right, and bottom |
| side property list | replace only named :LEFT, :TOP, :RIGHT, or :BOTTOM entries |
| number | standard rectangular-border function with that thickness |
T or function symbol |
default rectangular or named drawing function with its declared default thickness |
| canonical side entry | drawing function plus left/top/right/bottom contributions |
Thickness contributes to the corresponding margin, plus the TV-46 default extra border margin of one pixel. Canonical draw coordinates may express right or bottom positions as negative offsets from current width or height; reshape MUST resolve them against the new dimensions. (baswin.428:L675-L809; S46-SRC)
TV-303 additionally canonicalizes a side whose extent in its perpendicular axis is zero to the sentinel :ZERO. DRAW-BORDERS skips that side, but the non-NIL sentinel still contributes the configured extra border margin. This is observably different from NIL, which removes the side and its extra margin. The later parser also folds existing margins into canonical coordinates in left, right, top, bottom order; implementations MUST NOT substitute NIL for :ZERO. (window/baswin.lisp:L898-L1024; 303-SRC)
Label measurement grammar
In TV-46, a label occupies a top or bottom margin, defaults its text to the window name, and uses a configurable label font. In TV-303, accepted descriptors include string, font, :TOP/:BOTTOM, vertical spacing, centering, multiline extent, and boxed variants. Label height MUST be measured before final inside geometry. For a nonempty string the later code measures it through the sheet motion engine using a line increment of font-character-height + (label-vsp or 2); without a label string it reserves one font-character height. Centering changes horizontal placement, and boxed variants add their rule space to the relevant margin.
Drawing, erasing, or changing a label MUST preserve the client cursor. A label change reparses the descriptor, recomputes margins, marks/restores the decoration region, and redraws through margin refresh rather than emitting client text. (baswin.428:L812-L945, window/baswin.lisp:L1047-L1342; S46-SRC, 303-SRC)
Concurrency and sheet access
Locks
Each sheet has a recursive normal lock and can also be temporarily locked by one or more temporary windows. Normal ownership is by the executing process or an equivalent unique identity. Reacquisition by the owner increments a count; release decrements it and frees the lock at zero. (S46-SRC, 303-SRC)
A conforming implementation MUST obey these rules:
- Geometry, exposure, saved-bit changes, and direct sheet drawing occur while the affected sheet is stable against incompatible changes.
- Locking a sheet for drawing also prevents blinkers from independently changing the pixels being updated.
- A temporary window may lock every exposed overlapping target without permanently deexposing it. It MUST acquire the whole compatible set or wait and retry; a partial set MUST be unwound.
- Waiting MUST occur with scheduler inhibition or the host equivalent released. After waking, geometry and ownership MUST be rechecked because the world can have changed.
- Reparenting an active subtree MUST preserve or recompute inherited lock accounting so no descendant appears unlocked while an ancestor transaction owns it.
A modern implementation MAY use mutexes, condition variables, and transaction objects. It MUST retain the retry-after-wait behavior and MUST NOT hold a global non-reentrant lock while calling an arbitrary window method.
Preparing a sheet
Before direct raster access, the implementation MUST:
- acquire or verify compatible sheet access;
- remove intersecting visible blinkers;
- select or map the correct raster storage and depth;
- clip the operation to the appropriate local region;
- perform the update; and
- permit blinkers to reappear after the grouped operation.
Several consecutive drawing operations MAY reuse prepared state, but a process switch, storage remap, exposure change, or different target MUST invalidate that state.
Geometry and hierarchy protocols
Activation and deactivation
ACTIVATE makes a sheet an active inferior without necessarily exposing it. It MUST be idempotent. It MUST insert the sheet into the superior's active inferior order and propagate device-stride parameters through the subtree. (S46-SRC, 303-SRC)
Activation and containment are separate assertions. The inspected source directly rejects out-of-superior geometry when a sheet is exposed or an exposed position change commits; activation alone does not prove that every inactive geometry was already displayable. A caller MAY prepare an inactive sheet before final placement, but EXPOSE MUST reject it until its bounds fit the superior's inside rectangle. (sheet.383:L1018-L1047; S46-SRC, 303-SRC)
DEACTIVATE MUST first deexpose the sheet, then remove it from the superior's active inferiors. Killing a base sheet includes deactivation, followed by any higher-level resource and process cleanup. A deactivated sheet MUST NOT be exposed until activated again.
Moving, reshaping, and reparenting
- Moving a deexposed sheet changes its offsets and remaps any direct superior-backed view without touching visible pixels.
- Moving an exposed non-temporary sheet MUST deexpose every overlapping sibling that would violate exclusivity, then atomically update its mapping and position.
- Moving an exposed temporary sheet SHOULD use deexpose/re-expose so its saved underlay remains correct.
- Reshaping MUST validate bounds and minimum inside dimensions before committing. Persistent backing storage must grow when needed and must clear unreachable tail storage when shrinking so stale pixels do not reappear on regrowth.
- Reparenting MUST deexpose first, remove active membership from the old superior, change inherited raster parameters, install membership under the new superior, and request screen management for both affected regions.
Higher-level wrappers MUST notify a frame or superior through inferior-change protocols so constraint layouts cannot be bypassed by a pane reshaping itself.
Exposure, deexposure, and saved bits
Invariants
The implementation MUST maintain all of these invariants:
exposed_inferiorsis an ordered subset ofinferiors.- Two ordinary exposed siblings do not overlap. Temporary windows are the explicit exception and protect their underlay with temporary locks and saved pixels.
- A sheet cannot be device-visible if an ancestor lacks visible or saved backing.
- A sheet with persistent
bit_arraycan retain its own contents while deexposed. - A sheet without persistent backing relies on redisplay or the still-valid pixels inherited from its superior; it MUST NOT save another window's pixels by mistake.
- Selection cannot remain inside a subtree being deexposed.
- Mouse dispatch cannot remain inside an invisible subtree.
Expose algorithm
The following pseudocode is normative at the behavior level:
expose(sheet, turn_on_blinkers=false, bits_action=default, x=current_x, y=current_y):
require sheet is active, unless sheet is a root screen
choose bits_action = restore if persistent backing exists else clean
retry:
validate target geometry within superior
if target origin changed: move sheet safely; retry
if already exposed: return no-change
ensure superior provides visible or saved raster access
if sheet is temporary:
determine all exposed overlapping targets
if mouse currently dispatches to one, force mouse reconsideration and wait
atomically acquire compatible temporary locks on all; otherwise wait and retry
else:
deexpose every overlapping exposed sibling; if any wait occurred, retry
mark logical exposure and insert at the front of superior.exposed_inferiors
map sheet.screen_array to superior storage when visible
if temporary: save the exact underlay rectangle
perform bits_action:
noop -> retain current device pixels
restore -> restore persistent saved pixels and refresh dependent adornments
clean -> home cursor and perform complete redisplay
update blinker selection state
expose retained inferiors as required
wake mouse routing
return changed
The implementation MAY optimize, but it MUST retain validation, atomic overlap handling, saved-underlay ordering, and retry after waiting. (S46-SRC, 303-SRC)
Deexpose algorithm
deexpose(sheet, save_bits=default, screen_bits_action=noop,
remove_from_superior=true):
if selected window is sheet or descendant: deselect it
if not exposed: return no-change
force mouse routing out of sheet and descendants
if forced saving requested and no persistent backing exists: allocate it
if saving enabled and backing exists: copy current pixels to backing
if temporary:
restore the saved underlay before releasing every temporary lock
else:
deexpose or detach exposed inferiors as required by backing policy
perform the requested uncovered-area action
clear visible raster mapping where it is no longer valid
remove from superior.exposed_inferiors when requested
mark not exposed
invoke screen management for uncovered regions
wake mouse routing
A temporary window MUST restore its underlay even when aborted. Cleanup SHOULD use an unwind-protect/finally mechanism. This is the mechanism that permits a momentary menu to disappear without requiring the underlying application to repaint everything.
Bury, expose order, and visibility
The front of exposed_inferiors is the top of the local stacking order. Expose moves a sheet to the front. Bury moves it below applicable siblings and invokes the superior's screen-management protocol. If no other window can cover the vacated region, the superior clears or redisplays it according to policy.
The order is local to each superior. A frame pane cannot jump above its frame by changing its position among siblings.
Priority and automatic exposure
Each superior maintains an ordered active-inferior list and a separate exposed subset. Reordering is stable and occurs atomically. The intended comparator is:
- an exposed inferior sorts ahead of a deexposed inferior;
- two exposed inferiors retain their existing stacking order, regardless of numeric priority;
- equal priorities retain their existing order;
- among deexposed unequal-priority inferiors, an explicit numeric priority sorts ahead of
NIL/default priority; and - among two numeric priorities, the numerically higher value sorts ahead.
BURY deexposes the target and moves it to the end of its stable priority class. It does not override another class's numeric priority. Changing priority accepts only a number or NIL and schedules screen reconciliation. (S46-SRC, 303-SRC)
The two release profiles differ at a source defect. System 46 sheet.383:L345-L369 contains an impossible branch, (AND (NULL PRI-S1) PRI-S1), where the adjacent comment requires testing PRI-S2. System 303 window/sheet.lisp:L645-L669 uses the corrected (AND (NULL PRI-S1) PRI-S2). Therefore:
- a named strict-priority-bug mode layered on
TV-46MAY reproduce the malformedNIL-versus-number case, but MUST identify it as a defect-compatibility option and contain any resulting type error; and TV-46without that optional mode,TV-303, andTV-DUALSHOULD use the corrected comparator above. (S46-SRC,303-SRC,INFERRED,TODO-RUNTIME)
Deexposed visibility is distinct from exposure. A deexposed sheet contributes saved pixels to uncovered regions only when it has a backing bit array and its priority is NIL or nonnegative. Automatic exposure considers active, deexposed, fully contained inferiors in priority order, excludes priority -1 or lower, and exposes a candidate only if it is uncovered and would not cover an earlier candidate. If this operation leaves the mouse screen with no selected window, it selects the first eligible named window. (S46-SRC, 303-SRC, TODO-RUNTIME)
Damage is queued by superior and rectangle. A rectangle already contained by a queued rectangle for that sheet is discarded; a new enclosing rectangle replaces contained entries. Dequeueing groups regions for one sheet, skips a locked sheet in nonblocking passes, services other sheets, and retries later. The System 46 background interval is ten ticks, described in source as approximately one sixth of a second. A new damage engine MAY use different storage, but MUST retain region coalescing, per-sheet locking, eventual retry, and independence from an unrelated locked sheet. (S46-SRC, 303-SRC, TODO-RUNTIME)
Refresh
REFRESH accepts a kind of work rather than a Boolean:
| Kind | Required result |
|---|---|
| complete redisplay | Reconstruct all pixels and decorations from application/window state |
| use old bits | Restore or retain saved pixels, then repair borders, labels, blinkers, and invalid portions |
| margins only | Repair border/label/margin material without discarding the inside |
| damaged region | Redraw only the intersection when the class supports it; otherwise escalate safely |
The base sheet MAY clear for a complete refresh. Higher-level streams and applications override the method to replay their own model. Therefore saved bits and refresh are complementary: one preserves pixels; the other reconstructs them.
Screen management
Screen management reconciles rectangles made visible by deexposure, movement, reshaping, or hierarchy changes. It MUST operate in superior-local coordinates, subtract the coverage of higher exposed inferiors, then ask the appropriate lower window or superior to restore each remaining rectangle. It MAY temporarily delay management across a group of operations, but the outermost group MUST reconcile the accumulated damage before returning to ordinary interaction.
Text stream specification
Stream protocol
A basic TV stream MUST support at least:
TYO, STRING-OUT, LINE-OUT
TYI, TYI-NO-HANG, UNTYI, LISTEN, CLEAR-INPUT, FORCE-KBD-INPUT
FRESH-LINE, READ-CURSORPOS, SET-CURSORPOS, HOME-CURSOR
CLEAR-SCREEN, CLEAR-EOL, CLEAR-EOF
INSERT-LINE, DELETE-LINE, INSERT-CHAR, DELETE-CHAR
DRAW-RECTANGLE, BEEP, NOTIFY
RUBOUT-HANDLER or profile-equivalent input editing entry
The object MUST be usable through the Lisp stream calling convention for its profile, not only through host-language methods.
For TV-303, the selected RH-ON load installs the native alternate rubout handler as the stream default. Its complete mutable base command map, dispatch precedence, decimal argument grammar, C-Q second-stage tree, Help variants, pointer/System-Menu filter, full-rubout handshake, and parser-error retry are normatively incorporated from the System 303 Attributes input tree. That application supplies no command/activation/editor override, so it is also a bounded executable witness for the generic handler. A site profile MUST still dump RH-COMMAND-ALIST; local additions do not rewrite the source-initialized base map.
Cursor and character processing
- Cursor X and Y are local pixel positions, normally constrained to the inside rectangle.
- Printable characters draw at the current position, using left kern and the full indexed glyph raster, then advance independently by the character width.
- Return moves to the inside left edge. Line feed advances by line height. The usual CRLF performs both. Backspace moves according to the profile flag and must not move outside the left inside edge.
- Tab advances to the next configured tab stop; a compatibility implementation MUST reproduce profile tab arithmetic, not use host terminal tabs.
- Font-change characters select entries in the font map. The sheet recomputes baseline adjustment so mixed fonts share a baseline.
- An otherwise printable code whose existence-table bit is absent follows the profile's missing-character path. When the existence table itself is NIL, every code is treated as present.
- Nonprinting effectors are state transitions, not host-terminal escape sequences. Return, line feed, tab, backspace, font selection, and profile control codes update cursor/exception state; an unhandled invisible effector is rendered through the visible-lozenge compatibility path rather than silently discarded.
- A line-overflow exception either wraps, truncates, draws a right-margin marker, or delegates to a class-specific handler according to sheet flags and stream method.
- End-of-page sets the appropriate exception state before invoking scrolling, wraparound, or More processing.
:STRING-OUT MAY batch raster operations, but MUST finish with the same glyphs, advance, font, exception flags, and logical cursor as repeated TYO, except where a profile explicitly documents an optimized boundary. SHEET-LINE-OUT is a separate editor redisplay primitive: it draws at most one line in its normal mode and returns the next input index and resulting X, but deliberately leaves the actual sheet cursor undefined. Generic code MUST NOT infer LINE-OUT semantics from it. The no-op stream completion messages :CLEAR-OUTPUT, :FORCE-OUTPUT, :FINISH, and :CLOSE are required compatibility responses for readable late System 46 source even though the preserved older stream.qfasl symbol surface lacks them. (shwarm.162:L338-L465, stream.14:L490-L503; S46-SRC, S46-QF, 303-SRC)
Exception dispatch and More processing
The sheet's packed exception field represents output hold, end page, More, and a residual invalid state. Its dispatcher MUST test them in this order:
output hold -> end page -> More -> residual exception error
The order is observable because one handler can set or clear another state. End of line can draw the profile's right-margin marker, move to inside left on the next line, clear that line, and service a pending More. End of page homes or wraps to the top, clears the new target line, and schedules the next More threshold. The threshold is derived from line height and the penultimate available text line; its delayed marker means “arm on the next pass,” not simply cursor-y >= inside-bottom. (sheet.383:L1289-L1416, window/sheet.lisp:L1873-L1927; S46-SRC, 303-SRC)
When More is enabled and output crosses the armed threshold, the default handler MUST perform one same-stream transaction:
- clear the More flag and temporarily defer rearming;
- clear the end of the current line and draw
**MORE**in font-map entry zero without ordinary stream side effects; - perform the configured input operation, normally
:TYI, honoring the profile's hold/stop characters and permitted timeout; - erase the prompt and restore the prior cursor X without damaging adjacent output;
- set the resulting end-page/wrap or input-wait state; and
- return the character read, including NIL when the chosen timeout path permits it.
Ordinary input resets the threshold. Global and per-sheet flags may disable More. This is an exception-handler state machine within the raster stream, not a separate modal dialog. (sheet.383:L1289-L1416, window/sheet.lisp:L1929-L1990; S46-SRC, 303-SRC, MIT-MAN)
Deexposed typeout action matrix
Output held because a sheet is deexposed MUST dispatch on the selected profile's action before obtaining a drawable mapping:
| Action | TV-46 behavior |
|---|---|
:NORMAL |
wait until output becomes possible, then retry against current state |
:ERROR |
signal output-on-deexposed-sheet without drawing |
:PERMIT |
permit output only when a valid backing screen array exists |
:EXPOSE |
expose the sheet through the normal exposure transaction, then retry |
| list/form | invoke the specified custom message or form, then re-evaluate state |
| unknown | signal an error without changing pixels or exposure |
TV-303 adds :NOTIFY, which sends :NOTICE :OUTPUT and then follows the common output-hold wait rather than silently exposing the sheet. :PERMIT clears the packed output-hold flag only when a backing SCREEN-ARRAY is present. Because that clearing happens in the exception path on an actual output attempt rather than at deexposure, software can distinguish “writing was permitted” from “a deexposed write was attempted.” A reconstruction MUST retain this first-write detection and MUST NOT model :PERMIT as an unobservable Boolean bypass. No action may draw through a stale mapping into a sibling occupying the old visible rectangle. (sheet.383:L1418-L1445, window/sheet.lisp:L1992-L2021; S46-SRC, 303-SRC)
Window, process, and selection model
Window composition
The historical implementation uses Flavors mixins. A new implementation MAY use classes or components, but it SHOULD keep capabilities independently composable:
| Capability | Contract |
|---|---|
| essential/base sheet | Geometry, hierarchy, exposure, raster mapping, locks |
| stream | Character and keyboard I/O |
| borders and labels | Reserve margins and redraw adornments |
| selectable | Name, selection/deselection, input focus, recent history |
| process | Associate or create the executing process/stack group |
| mouse | Hit testing, pointer cursor, movement and button methods |
| save bits | Persistent off-screen raster while deexposed |
| temporary | Save and restore underlay while exposed above ordinary windows |
| typeout | Overlay or subsidiary output with delayed removal |
| scroll | Model-based scrolling and scroll-bar semantics |
| pane/frame | Superior-controlled selection and geometry |
The base compatibility flavor names SHOULD remain available, but compatibility is judged by required methods and behavior rather than linearized class identity.
Selection
Selecting a window MUST:
- resolve any pane or alias to the actual selectable frame/window;
- activate and expose the required ancestry;
- deselect the previous target and adjust its blinkers;
- move pending typeahead to the old target before switching the selected input buffer;
- set the global selected window and input buffer;
- update recent-selection order;
- enable selected visibility for the new blinkers;
- select or wake its process when appropriate; and
- update the who line and mouse routing.
Selection MUST be idempotent except for explicitly documented cycling behavior. Deexposing or killing the selected subtree MUST trigger a safe replacement or leave a known no-selection state.
Only one top-level selection team can own keyboard input. A frame/team leader is the selection identity while its current representative pane can supply the effective I/O buffer, process, status, notification stream, and blinkers. Selecting another pane inside the same team changes that representative without creating a second top-level keyboard owner. Mouse selection MUST run outside the global mouse process when it can block on exposure or process work.
TV-303 generalizes this with recursive selection substitutes. A conforming later profile MUST resolve the ultimate substitute for selection lists and forwarding, and support its release-specific deselection/restoration modes (:DONT-SAVE, :BEGINNING, :LAST, and :FIRST). A new memory-safe implementation SHOULD detect a substitute cycle and signal a bounded error; the inspected recursion has no proved cycle guard, so this safety behavior must be identified as a deliberate correction rather than a historical observation.
The recent-selection structure is a unique, NIL-padded MRU sequence. It excludes the current target, removes duplicates and dead/deactivated entries, filters for the requested eligibility, and falls back to an idle Listener when nothing usable remains. TV-46 grows its vector in blocks of ten; a new representation may differ but MUST reproduce the observable order and filters.
Process association
A process-owning window associates a process and stack group with its stream. Input selection directs keyboard events to the window's I/O buffer; it does not blindly run application code in the keyboard interrupt path. Creation MAY start a process; selection MAY wake or reset one according to its class. Arrest, reset, kill, and error notification are process operations surfaced through window management.
Call, Break, and Abort address the effective selected process. Call arrests or suspends the busy context and selects a Listener-like control context; Break forces a break in the associated process; Abort resets it. A window that merely reports a process does not necessarily own its lifetime, while a process-owning mixin creates or adopts a process and kills the owned process only after inherited window cleanup.
Keyboard and mouse input
Keyboard routing
Keyboard ingress MUST be one atomic decision against the current selected I/O buffer:
- Snapshot the selected buffer, its property list, raw/converted input mode, and available capacity.
- In raw mode, enqueue the raw code and run the optional input interrupt only when space exists.
- Otherwise translate the hardware code to a Lisp Machine character and record keyboard activity.
- Recognize Terminal/Escape and System prefixes before ordinary enqueueing.
- Apply the release-specific asynchronous rule.
TV-46intercepts Call and Abort as selected-window operations unless the buffer requests super-image mode.TV-303instead intercepts Terminal, System, and Control-Clear globally, then consults the current selected buffer's asynchronous-character table; its base defaults include Control-Abort, Control-Meta-Abort, Control-Break, and Control-Meta-Break. The C303 Call path is commented out and MUST NOT be invented. - Enqueue an ordinary converted character and invoke its input interrupt only when space exists.
This ordering is observable: the selected profile's intercepted asynchronous characters cannot appear as ordinary text in normal mode, and a prefix key cannot leak to an application before the selector reads its suffix. (S46-SRC, 303-SRC)
The exact release-specific Terminal/Escape and System prefix leaves, numeric/minus state, Help precedence, mutable registrations, and unknown-suffix outcomes are normatively enumerated in D02's complete CADR keyboard-prefix trees.
Before a System or Terminal operation changes selection, pending ordinary typeahead MUST be transferred in order from the global queue to the old selected window's private buffer, up to its defined capacity. This prevents text intended for the old window from following focus. The prefix and its selector suffix are control input and MUST NOT be transferred as ordinary text.
Terminal command entries contain a character, function, documentation, and options. The default execution path runs the command outside the keyboard process; :KEYBOARD-PROCESS opts into that process and :TYPEAHEAD requests preservation of pending old-window input. Unknown options in the TV-46 registry are forward-compatible and SHOULD be ignored. Terminal Help enumerates the effective registry.
System selection runs in its own control process. Help or ? reports the live registry; Rubout cancels; a concrete window is selected directly; a flavor/program kind first searches and cycles existing matching windows before using its separately declared creation path. Invalid or absent non-creatable targets beep. TV-303 MUST provide mutable add/remove registration and MUST NOT freeze the five entries observed in one fresh band as a universal list.
Mouse overseer
One mouse process or equivalent event loop MUST:
- read relative movement and button transitions;
- apply device scaling and clamp to the selected mouse screen;
- update the roving pointer blinker;
- choose the deepest eligible exposed sheet under the pointer unless ownership is seized;
- deliver enter/leave or
HANDLE-MOUSEtransitions when jurisdiction changes; - send motion and button events in coordinates local to the owning sheet; and
- reconsider ownership when visibility, hierarchy, selection, or the handler asks.
Hit testing MUST respect invisible_to_mouse, active/exposed ancestry, stacking order, and any method/capability filter supplied by the caller. (S46-SRC, 303-SRC)
The ownership value has two sentinels in addition to a concrete sheet: an anonymous grab suppresses normal target actions when the owner cannot name a window, and a Stop state suspends mouse dispatch. The overseer MUST catch a handler failure at its outer boundary so one application cannot permanently kill global pointer service.
For ordinary, non-grabbed button dispatch, the order is: concrete owner's button method; eligible exposed handler immediately under the pointer; mouse selection; desktop/System Menu fallback. The default System 46 behavior selects asynchronously on Left and opens the System Menu on Right. A keyboard-mouse window instead encodes a click in an already selected input window into its I/O buffer; right double-click opens the System Menu. Some forced mouse blips can overtake pending keyboard input in another queue. A strict compatibility mode MUST preserve and document that ordering hazard rather than falsely promise one merged event queue.
Default TV-46 tracking has configurable physical/device thresholds: 10 pixels of scroll-bar entry reluctance, a 3-pixel sensing strip, 300 pixels of exit reluctance, 10 inches/second maximum scroll-entry speed, and a 30 inches/second fast-motion threshold with a temporary 40-pixel cross. A host implementation MUST calibrate physical-speed quantities instead of treating CSS pixels as inches. A hysteretic window retains ownership within a 25-pixel halo. These are profile defaults, not universal constants.
Seizing and releasing the mouse
A modal interaction MAY seize the mouse for a particular sheet or for an anonymous operation. While seized, ordinary under-pointer jurisdiction MUST not steal events. Release MUST wake the overseer and recompute the owner from current geometry. If a temporary window would cover the current mouse target, exposure MUST first force the overseer out of that target or wait; this prevents dispatch into visually inaccessible state.
Decoration refresh behavior
The construction grammar above defines border and label parsing and their margin contributions. At refresh time those decorations remain outside client content: recompute the effective inside rectangle, move retained inside pixels when its origin changes, clear newly exposed strips, then draw border and label methods in the margin refresh phase. A label change marks the margin dirty and MUST be repaired even when saved client bits are reusable. A border or label renderer MUST use the sheet's prepared raster transaction and MUST leave the client cursor unchanged.
Scrolling and typeout windows
Model-based scroll window
A scroll window retains an application display model independent of pixels:
ScrollState {
display_item_model
top_item, target_top_item, bottom_item
screen_image: ordered visible entries with line extents
truncation_policy
selected_or_sensitive_items
optional_typeout_window
}
Redisplay walks the model from top_item, converts entries into one or more display lines, records their screen extents, and stops at the inside bottom. A full redisplay reconstructs the image; an incremental redisplay MAY retain unchanged entries but MUST invalidate entries whose content, position, font metrics, selection, or window width changed.
Relative scrolling reuses pixels with BITBLT when safe and draws newly exposed lines. Absolute scrolling chooses a top item from the requested fraction or item position. The screen image is a cache, never the authoritative application model.
Scroll bar
The scroll bar occupies a margin strip. Its thumb/markers derive from the visible range relative to total items. Pointer movement near the configured strip can engage scrolling after hysteresis; dragging maps position to an absolute target; button gestures above or below the thumb request relative movement. The bar MUST erase or redraw when margins, visible range, total size, or always-visible policy changes.
Typeout overlay
A typeout window is subordinate transient output for Help, errors, or long command results. It grows over its superior's inside rectangle, is excluded from ordinary screen management and mouse selection, and aliases the superior in selection lists. An owning window can construct the overlay from a flavor/options specification and MUST resize it while deexposed whenever the owner's inside rectangle changes. (typwin.53:L197-L251; S46-SRC, S46-QF, 303-SRC)
The overlay retains at least:
TypeoutState {
superior
bottom_reached: pixel_y | null
incomplete: boolean
had_mouse: boolean
sensitive_items: list<{type, object, left, top, right, bottom}>
}
First exposure resets bottom_reached and marks the overlay incomplete. Any character/string/line output marks it incomplete. Cursor movement preserves the greatest vertical extent reached; clear-screen, clear-to-end, refresh without saved bits, and end-of-page handling mark or invalidate the affected extent. Deexposure clears the reached extent, and MAKE-COMPLETE marks the transient result consumed. Selecting the owner while incomplete selects the typeout representative; deexposing that representative returns selection to the superior before its pixels disappear. (typwin.53:L295-L341; S46-SRC, 303-SRC, TODO-RUNTIME)
The overlay handles pointer events only over the region actually reached by output. Outside that region it converts coordinates to the superior, forwards motion or the button event, and sends one final transition so stale highlighting can be removed. Crossing into the overlay disables the owner's text blinkers; crossing back restores them. This is partial-region delegation, not a full-window modal grab. (typwin.53:L256-L293; S46-SRC, TODO-RUNTIME)
A mouse-sensitive typeout item stores semantic type, application object, and its rendered rectangle. Refresh, clear, new typeout exposure, and end-of-page transitions MUST discard regions whose pixels no longer represent that object. Motion highlights the current item. Left-single posts a structured (:TYPEOUT-EXECUTE operation object) action to the I/O buffer; right-single may open the type-specific operation menu in another process; right-double invokes the System Menu. Application work MUST NOT execute in the mouse process. (typwin.53:L6-L193; S46-SRC, 303-SRC, TODO-RUNTIME)
EXPOSE-FOR-TYPEOUT activates before taking the sheet drawing lock, exposes without clearing retained output, waits until exposure is real if the superior currently has no screen array, homes the cursor, and clears only to end of line. This order avoids the superior/typeout lock inversion documented in typwin.53:L343-L355. Removal either restores saved underlay or requests owner redisplay. Automatic removal on the next input and explicit More continuation remain class policies, not assumptions of every typeout window. (S46-SRC, S46-QF, TODO-RUNTIME)
Frames, panes, and constraint layout
Frame contract
A frame is a superior window whose inferiors are panes. The frame owns pane geometry, exposure, and selection. A pane's attempt to expose, deexpose, bury, move, or select is forwarded through the frame so the frame remains coherent. Selecting a pane normally selects the frame and records that pane as the frame's current input pane.
A frame MUST expose, deexpose, activate, kill, and restore its panes as one managed unit. The frame's selection name represents the complete application; panes normally do not appear as independent System-key programs.
Pane definitions
A constraint frame maps stable pane names to pane instances. A pane definition specifies at least a flavor/capability set and initialization options. The frame MUST support lookup by name, sending an operation to a named pane, and broadcasting to all or all exposed panes.
Constraint representation
The layout model is a tree. Interior nodes stack children horizontally or vertically; leaves refer to panes or whitespace. Named configurations choose a tree and set of panes; pane substitutions are resolved before calculation. Unknown panes, substitutions, and configurations MUST fail before visible mutation. (S46-SRC, 303-SRC)
The historical size language includes:
| Form | Required interpretation |
|---|---|
| fixnum | Exact pixels on the stacking axis |
| float | Proportion of the total axis extent passed to this calculation level |
:EVEN |
Equal share of the final descriptor group's remaining extent |
:FIXED |
For a pane leaf, retain its current extent on the stacking axis |
:LIMIT (min max [unit [pane]]) rule |
Prefix another rule with optional lower/upper bounds and optional line/character conversion |
:ASK-WINDOW |
Ask the pane for its constraint |
:ASK |
Invoke the declared receiver/method with sizing context |
:FUNCALL |
Invoke a supplied function |
:EVAL |
Evaluate the supplied form in the historical configuration context |
:BLANK |
Reserve non-pane space and draw it white, black, or with a supplied function |
Line and character units convert through the pane's current cell dimensions and margins. Ask callbacks receive remaining extent, total extent, and stacking orientation. Nested horizontal/vertical nodes change the sizing axis. The parser MUST reject an unknown special keyword, duplicate/missing pane name, invalid unit or rounding form, repeated incompatible stacking node, a mixed :EVEN/non-even group, or an :EVEN group before the final descriptor group. System 46 recognizes an :IF node shape but its implementation signals that conditional constraints are not implemented; TV-46 MUST preserve that bounded failure rather than silently choose a branch. (frame.120:L455-L527, L551-L717; S46-SRC, TODO-RUNTIME)
The solver MUST:
- parse names and macros into a validated tree;
- calculate raw extents in descriptor order, passing current remaining and total context to extensible rules;
- calculate the final
:EVENgroup from the remaining extent; - round line/character constraints to whole cells and add margins;
- apply declared minima and maxima in the source-defined rounding phase;
- assign cumulative positions on the stacking axis and the full available size on the cross axis; and
- verify that every configured pane accepts its candidate edges.
Configuration application is a two-phase transaction:
set_configuration(name):
resolve and parse name, panes, substitutions, and constraint tree
calculate all candidate extents and positions without changing pane edges
ask every pane to verify its complete candidate rectangle
if any pane rejects: return its reason or "Not all panes fit"; mutate nothing
deexpose panes belonging to the old configuration as required
commit every accepted edge
draw configured blank regions
expose the new configuration's panes in configuration order
reread or invalidate cached positions
Verification stops at the first rejection, but no earlier pane may retain candidate geometry. A frame resize performs recomputation while its panes are deexposed so a half-old/half-new layout is never visible. Blank nodes consume exact layout extent but never become panes. (S46-SRC, 303-SRC, INFERRED, TODO-RUNTIME) The calculation, rounding, and positioning paths are frame.120:L719-L876; configuration verification/application is frame.120:L260-L452.
TV-303/T3 MUST permit named configurations and runtime configuration changes. A change invalidates current constraint positions, recomputes all pane edges, exposes the configured panes, and deexposes panes not in the new configuration. System 303 integrates the frame's selected pane with the general selection-substitute mechanism; System 46 uses the earlier frame-selected-pane forwarding. Both MUST remain one selection team.
Notifications and interesting windows
Notifications are delivered through the selected window/team, not through an unrelated host-global toast layer. A selected window supplies a notification stream or printing policy, and a frame forwards that policy to its current representative pane. (S46-SRC, 303-SRC, MIT-MAN)
The system maintains an interesting-window registry for background windows that want attention. System 46 uses a unique window list; System 303 uses an alist capable of retaining associated notification state. Repeated attention for one window MUST not create duplicate registry entries. Selecting or deactivating the window removes its entry, and Terminal 0 S selects an eligible interesting window. Dead or deactivated entries MUST be pruned. Registry order follows the selected release; a new implementation MUST NOT claim chronological ordering without evidence. (basstr.163:L760-L810; window/basstr.lisp:L1684-L1760; S46-SRC, 303-SRC, MIT-MAN, TODO-RUNTIME)
A process that first requests terminal I/O without an ordinary terminal lazily acquires a background Lisp interactor. The system labels and associates it with that process, clears and activates it, rings the bell, marks it interesting, and dispatches the pending stream operation. Merely creating a process MUST NOT allocate or expose this window. (S46-SRC, S46-QF, TODO-RUNTIME)
The notification transaction is:
- if an error's target is already exposed, suppress a redundant general notification;
- otherwise wait until a selected window/team exists;
- obtain that team's notification stream;
- ring the bell and print the short bracketed notification; and
- for a hidden error target, permit the originating process to wait until that target is selected for attention.
A window's deexposed-typein policy can request :NOTIFY, turning attempted background input into interesting-window state instead of consuming unrelated keyboard input. Exact flavor defaults and user-visible wording remain TODO-RUNTIME; the routing and lifecycle above are source/manual requirements. (basstr.163:L814-L895; S46-SRC, 303-SRC, MIT-MAN, TODO-RUNTIME)
Who line
The apparent two-line who line is a separate screen, even when a host compositor presents one framebuffer. Main-screen windows cannot overlap it and the pointer cannot enter its coordinate space. The first row displays contextual mouse documentation. The second displays time, login/user state, the effective process's package and run state, and file or network activity. The documentation row and each status field are separate windows. (S46-SRC, 303-SRC, MIT-MAN)
Each field retains an update function, prior logical state, and horizontal extent. Periodic or event-driven update recomputes it and redraws only when the logical value changed. Updating is deferred while globally inhibited, while its lock is held, or while output is blocked; a run-state-only pass need not redraw time, user, or file fields. A host implementation MAY schedule differently, but MUST preserve field independence and state-based redraw suppression. (S46-SRC, 303-SRC, MIT-MAN, TODO-RUNTIME; tvdefs.181:L328-L340, shwarm.162:L949-L1067)
Mouse documentation resolves in this order:
- explicit
WHO-LINE-MOUSE-GRABBED-DOCUMENTATIONduring a grab or modal phase; :WHO-LINE-DOCUMENTATION-STRINGfrom the deepest current window and semantic item under the pointer; and- the release's default or blank string.
Changing only the current menu/typeout/scroll item MUST invalidate this field. The live System 303 System Menu and Screen Editor captures confirm item-dependent documentation for Attributes and Reshape. They do not establish every modifier or grabbed-documentation transition. (303-RUN, TODO-RUNTIME)
Package and run state normally describe the process returned by :PROCESS from the selected window after frame/substitute resolution. A non-NIL WHO-LINE-PROCESS pins another process across selection changes; LAST-WHO-LINE-PROCESS records the most recently described process, including NIL when none exists. Run state derives from Lisp Machine process status, run reasons, and wait state, not merely host-thread liveness. (S46-SRC, 303-SRC, MIT-MAN, TODO-RUNTIME)
The file/network field maintains separate registries of open streams and active servers. Streams supply their short pathname through the historical who-line string operation; server connection closure removes its entry. These registries are not the notification/interesting-window registry. (303-SRC, MIT-MAN, TODO-RUNTIME)
At T2, a conforming implementation MUST supply the separate screen boundary, pointer documentation, selected-process package/run state, and per-field cache. At T4 it MUST also support process pinning and file/server lifecycle operations.
Color screen profile
Color is a screen capability inside TV, not a second window system. Geometry, selection, exposure, menus, frames, temporary windows, and stream protocols remain unchanged; raster operations apply to all pixel bits. (S46-SRC, 303-SRC, MIT-MAN)
The standard CADR color-screen profile is 576 by 454 pixels, four bits per pixel, with sixteen simultaneously addressable palette indices. Each palette entry stores eight-bit red, green, and blue intensity. A TV-46 or TV-303 implementation that claims the color option MUST expose those logical dimensions/depth and an indexed color map, even if host display hardware uses true color. (S46-SRC, 303-SRC, MIT-MAN; color.33:L223-L249, window/color.lisp:L267-L301)
The CADR hardware does not provide reliable palette readback. The implementation therefore keeps a sixteen-by-three byte shadow array and routes ordinary color-map writes through an API that updates both hardware and shadow. A synchronized write waits for retrace to avoid a visible glitch. The immediate form is valid only when the caller already knows it is in vertical retrace. Bulk installation precomputes the hardware writes, updates the shadow, and synchronizes the transfer. A host backend MAY replace XBUS operations with an atomic palette call, but MUST preserve the logical shadow and ordering. (S46-SRC, 303-SRC, TODO-RUNTIME; color.33:L87-L220, window/color.lisp:L115-L190)
The color screen object exists as profile state even when hardware is absent, but it MUST NOT expose as a usable physical screen. System 46 conditionally adds a Color Window entry to its auxiliary menu; System 303 conditionally adds it to the Windows column. Color font parsing converts or selects compatible raster fonts; this does not introduce vector fonts. (S46-SRC, 303-SRC)
The current System 303-0 harness run is monochrome. No palette timing, color temporary-window restoration, or four-bit ALU claim is labeled 303-RUN; those remain TODO-RUNTIME or emulator-unit-test work.
Screen Manager and Screen Editor integration
The screen manager maintains priority/order policy beyond raw exposure. A sheet can request automatic exposure, deexposed visibility handling, restoration of uncovered rectangles, and ordering. Batching screen changes MUST end with one reconciliation.
The Screen Editor operates on this live tree rather than a copied layout model. Its command set, edge transaction model, validation, and one-level imperfect Undo are specified in Screen Editor and Frame-Up. A TV-303/T4 implementation MUST expose enough protocols for that tool to enumerate active inferiors, inspect/set edges, expose/bury, create/kill, expand, and edit attributes without bypassing frame ownership.

Runtime observation: session
layout-tools-20260718displayed the complete 15-item System 303 Screen Editor menu and item-specific Reshape documentation. The researcher exited without changing window geometry. This reviewed image confirms the visible menu inventory and documentation path, not reshape, Undo, constraint verification, or destructive commands. Its PNG SHA-256 is87cb86efce54505176e82157a09aab6a0ba693359012afefc02f33e01c525c6e; complete copyright basis and portable provenance are in the curated asset catalog.
Boot and initialization order
The TV-303 system declaration loads definitions before the operational modules. The behavioral dependency order is:
TV definitions
-> screen manager and screen/sheet core
-> drawing, blinkers, and warm display operations
-> base windows and who line
-> mouse and base streams
-> stream adapter, graphics, and menus
-> combined methods
-> System Menu, Screen Editor, typeout, scrolling, frames, choices
-> application windows
No application window may be created before the required base combined methods are installed. Startup MUST create the physical screen, who line, mouse process/blinker, initial selectable Listener, selection/input routing, and screen-management state in an order that never sends input to an uninitialized buffer.
Release-specific deltas
The following are normative profile differences, not optional presentation choices:
| Facility | TV-46 |
TV-303 |
|---|---|---|
| System declaration | Monolithic TV module list in the System 46 system source |
Maintained DEFSYSTEM TV with the later module set in sys/sysdcl.lisp |
| Deexposed priority comparison | NIL-versus-numeric branch repeats PRI-S1 and is defective |
Corrected branch tests PRI-S2; stable sort is explicit |
| System Menu | Main menu plus Other submenu | Observed three-column Windows / This window / Programs menu |
| Reset/Kill confirmation | Source paths do not contain the later pointer confirmations | Maintained paths confirm before destructive action |
| System-key table | Static core alist with subsystem additions | Mutable add/remove registry, duplicate suppression in Help, explicit creation path |
| Screen Editor | 13 operation entries | 15 operations, adding Create (expand) and Attributes |
| Window attributes | No later fixed attribute form | Fixed variable-value attribute editor in the inspected maintained source |
| Frame representative | Dedicated selected-pane forwarding | General selection-substitute mechanism |
| Interesting windows | Unique window list | Alist capable of associated notification state |
| Color menu entry | Conditional auxiliary-menu entry | Conditional Windows-column entry |
| Multiple screens and restoration | Present in evolving form | Maintained code expands all-screen selection and management behavior |
More differences MAY be added only with exact source or runtime evidence. A dual implementation MUST select them as a coherent profile.
Cross-subsystem transaction order
These integration rules are normative even when individual services pass isolated tests:
- Selection before key eligibility. Install the new process/I/O-buffer association within the selection transaction before global keyboard input can drain to it.
- Old typeahead before target switch. Transfer already typed ordinary input to the old selected buffer before a System or Terminal command selects another target.
- Mouse work outside the overseer. Selection, callbacks, menu actions, and potentially blocking application work run in another process or enter a structured I/O blip.
- Final motion before ownership exit. The old mouse handler receives the motion needed to remove highlight/feedback before jurisdiction changes.
- All overlap locks before saved-under pixels. Temporary exposure acquires the complete compatible lock set before copying or drawing any part of the popup.
- Restore popup before its action. A momentary menu deactivates and restores the target before invoking code that may inspect or draw that target.
- Constraint verification before pane mutation. Every pane accepts candidate edges before any pane retains them.
- Screen Editor menu removal before state capture.
TV-303deactivates its transient command menu before reading the live screen state to edit. - Parse before value assignment. A choice/value form publishes a new value only after parsing and type validation succeed.
- Notification through the selected team. Bell and text destination resolve through the effective selected frame/pane policy.
- Who-line process after substitute resolution. Package/run state follows the effective selected pane unless explicitly pinned.
- Semantic hit-map invalidation with pixels. Scroll and typeout item regions are invalidated in the same transition that clears, moves, or replaces their rendered pixels.
These rules are synthesized from method/wrapper order across the public sources (S46-SRC, 303-SRC, INFERRED). Existing 303-RUN images confirm only menu appearance/removal and item documentation. Queue order, lock order, verification rollback, notification routing, and hit-map invalidation remain TODO-RUNTIME.
Failure semantics and defensive requirements
A compatible reconstruction MUST detect and report at least:
- exposing a deactivated sheet;
- exposing or moving outside the superior;
- invalid or nonpositive sheet extent, and operation extents outside the explicitly signed internal move contract;
- impossible margins or frame constraints;
- an unknown expose/refresh bits action;
- drawing through a missing/stale raster mapping;
- releasing a lock not owned by the caller;
- an input-buffer overflow attempt;
- a menu action on a disabled or vanished item;
- selecting or operating on a killed window;
- changing a pane geometry behind its frame;
- failure to acquire every required temporary lock;
- an invalid priority or an explicitly selected strict-priority-bug comparison failure;
- an unknown pane/configuration, malformed constraint group, unsupported System 46 conditional constraint, or pane rejection;
- a selection-substitute cycle in a safety-corrected implementation;
- a typeout hit region whose rendered pixels were invalidated; and
- a color-map operation outside its index/channel or synchronization contract.
An error MUST leave hierarchy membership, exposure ordering, saved pixels, locks, and selection in a coherent state. Destructive UI operations SHOULD request confirmation where the chosen release profile does. Host exceptions MUST be translated into a window-system condition or safe debugger path rather than abandoning a visible temporary window with its underlay locked.
Reference protocol inventory
This inventory names the compatibility surface by behavior. It is intentionally more stable than an exhaustive list of private helper functions.
| Protocol family | Required operations |
|---|---|
| Identity and hierarchy | name, superior, inferiors, exposed inferiors, ancestry, screen, active/exposed predicates |
| Geometry | size, inside size, margins, edges, set edges, set position, set superior, verify edges, coordinate translation |
| Lifecycle | init, activate, deactivate, expose, deexpose, bury, refresh, kill |
| Raster | screen array, prepare/access, draw point/line/rectangle/character, BITBLT, clear, save/restore bits |
| Text stream | TYO/TYI, string/line output, cursor, insert/delete, More processing, rubout handler, notify/beep |
| Input | I/O buffer access, listen, no-hang, untyi, clear/force input, selected input buffer |
| Selection/process | selection name/kind, select/deselect, mouse-select, process/stack group, reset/arrest/kill |
| Mouse | handle, moves, buttons, sensitive item, cursor/blinker, seize/release, scroll-bar behavior, documentation |
| Decorations | borders, label, margin refresh, reverse video, font map |
| Screen management | order inferiors, damaged/uncovered area, autoexpose, restore area, delayed reconciliation |
| Frame | pane lookup/name, select pane, create pane, configuration lookup/set/redefine, layout recomputation |
| Menu/choice | set item list, compute geometry, choose, execute item, multiple choice, dynamic refresh |
| Scroll/typeout | display model, redisplay, position, relative/absolute scroll, item lookup/mutation, partial-region forwarding, completeness, typeout removal |
| Attention/status | notification stream, interesting-window lifecycle, who-line documentation/process pin, file/server fields |
| Indexed color | bits per pixel, color-map shadow, synchronized/immediate palette write, compatible raster-font parsing |
Private compatibility users that depend on a specific method name can be supported by a thin symbol/message adapter over these operations.
Conformance test suite
Each test records the release profile, pixel depth, input sequence, logical event trace, final model state, and framebuffer hash or region comparison when applicable. Timing tests use ranges because the historical scheduler and a modern event loop need not have identical instruction timing.
T0 raster tests
| ID | Test | Pass condition |
|---|---|---|
TV-R01 |
Half-open rectangle | Only pixels inside [l,r) × [t,b) change |
TV-R02 |
Established Boolean ALUs | SETA, IOR, XOR, ANDCA, and SETZ match every one-bit source/destination pair; any advertised extension names its extra truth tables and depth semantics |
TV-R03 |
Overlapping BITBLT in four directions | Result equals copying from an immutable pre-operation source |
TV-R04 |
Rectangle clip at every inside edge | No margin, sibling, or host pixel changes; a wholly clipped or nonpositive post-clip operation invokes no primitive |
TV-R05 |
Line endpoint control | Default :DRAW-LINE includes its terminal point, explicit false omits it, and every :DRAW-LINES segment uses the false path; exact octant tie breaking and reversal pixel equality do not gate conformance until a runtime or readable-microcode oracle closes the TODO |
TV-R06 |
Variable-width/kerned text | Cursor and pixels match font metrics and baseline alignment |
TV-R07 |
Reverse video | Character and erase operations exchange foreground/background behavior without changing text metrics |
TV-R08 |
Missing glyph | Profile fallback occurs without out-of-bounds raster access |
TV-R09 |
Four-bit indexed color | All 16 indices survive draw/BITBLT/save/restore and map through the software palette shadow |
TV-R10 |
Runtime negative-origin vector | On a sheet whose inside origin is (2,2), (40,30,-20,-10) changes exactly physical [2,22) × [2,22); applying XOR twice restores the region exactly |
TV-R11 |
Profile clipping boundary | TV-46 preserves or explicitly fences the partially checked BITBLT/pixel API; for nonnegative dimensions TV-303 clips the common translated source/destination intersection on all four sides, and a zero post-clip extent invokes no primitive; negative BITBLT-CLIPPED dimensions are outside the historical public contract and are not required to signal |
TV-R12 |
Signed low-level overlap move | Every sign/direction combination used by margin and reshape moves equals an immutable-source copy and leaves exterior pixels untouched |
T1 sheet and stream tests
| ID | Test | Pass condition |
|---|---|---|
TV-S01 |
Activate/deactivate idempotence | Membership has no duplicates; deactivate removes exposure first |
TV-S02 |
Illegal exposure | A deactivated or out-of-bounds sheet fails with no state/pixel change |
TV-S03 |
Ordinary overlap | Exposing an overlapping sibling deexposes the prior one and preserves ordering |
TV-S04 |
Saved bits | A backed sheet retains exact contents across cover/deexpose/re-expose |
TV-S05 |
Redisplay without backing | Re-exposure invokes complete application refresh rather than showing foreign pixels |
TV-S06 |
Temporary underlay | A momentary sheet restores the exact pre-exposure pixels on normal exit and abort |
TV-S07 |
Temporary lock rollback | Failure to acquire one overlap lock releases every earlier acquisition |
TV-S08 |
Blinker-safe typeout | Drawing through the cursor region leaves text correct and one final cursor phase only |
TV-S09 |
Cursor controls | Return, line feed, CRLF, tab, backspace, home, insert, and delete match profile rules |
TV-S10 |
More processing | Crossing the penultimate-line threshold prompts once in font zero; ordinary, hold/stop, and permitted-timeout inputs take their profile paths; prompt erasure restores X and surrounding pixels; the returned input and rearmed state match the transaction |
TV-S11 |
Deexposed output matrix | :NORMAL, :ERROR, :PERMIT, :EXPOSE, custom, and unknown actions take distinct TV-46 paths without stale writes; TV-303 :NOTIFY sends the output notice before the common wait, while an actual :PERMIT attempt clears hold only when backing exists |
TV-S12 |
Reparent subtree | Geometry, device stride, active membership, exposure, and locks remain coherent |
TV-S13 |
Recursive normal lock | Owner recursion and final release work; non-owner release fails safely |
TV-S14 |
Circular input buffer | Empty/full boundary, wraparound, hooks, no-hang, and non-overwrite behavior match the contract |
TV-S15 |
Priority classes | Exposed and equal-priority stability, numeric order, NIL comparison, and bury-within-class match the chosen release behavior |
TV-S16 |
Damage queue coalescing | Contained regions collapse; disjoint same-sheet regions share one reconciliation transaction |
TV-S17 |
Locked damage entry | One locked sheet is skipped and retried without delaying an independently serviceable sheet |
TV-S18 |
Font-map and output equivalence | One-, two-, and 26-entry font maps normalize by repeat-last; baseline and line height use the mapped maxima; NIL existence means all present; wide-glyph terminal indexing, kerned raster extent, and independent advance are honored; repeated TYO and STRING-OUT finish equivalently, while no cursor assertion is made after SHEET-LINE-OUT |
TV-S19 |
Ordered construction | Delayed screen management surrounds init, saved-backing complete refresh, activation, and optional exposure in that order with profile defaults installed first; a nonempty accumulated queue flushes once as a batch, while an empty queue causes no invented reconciliation |
TV-S20 |
Size deduction | Origin+opposite-edge+size combinations follow precedence; a right/bottom without size bounds the extent; TV-46 CR-counted string height and unclamped string dimensions differ from TV-303 motion-measured/clamped dimensions; TV-303 :EDGES overrides prior/default size and rejects only its established nonpositive case; redundant fields are not generically rejected |
TV-S21 |
Margin, border, and label mutation | Retained client pixels and relative cursor survive margin movement; zero-width TV-303 sides canonicalize to :ZERO, draw nothing, but retain extra margin; multiline/centered/boxed labels reserve measured space and never move the client cursor |
TV-S22 |
Packed exception priority | Simultaneous hold, end-page, and More bits dispatch in hold/end-page/More order; a residual unknown state signals only after the established handlers and leaves pixels coherent |
TV-S23 |
Resize failure policy | A strict TV-46 failure profile exposes the documented erase/mutate-before-late-work ordering; a declared safety-corrected profile stages or restores the change and is labeled INFERRED; neither result is attributed to the other profile |
T2 interaction tests
| ID | Test | Pass condition |
|---|---|---|
TV-I01 |
Selection transaction | Old typeahead stays with old window; new focus, process, blinkers, recency, and who line update together |
TV-I02 |
Selected subtree deexposure | Selection leaves the disappearing subtree before pixels are reclaimed |
TV-I03 |
Mouse hit test | Deepest eligible exposed sheet receives local coordinates in correct stacking order |
TV-I04 |
Mouse seize/release | Seized owner receives events; release immediately recomputes ordinary owner |
TV-I05 |
Cover current mouse target | Temporary exposure forces leave/reconsideration before coverage |
TV-I06 |
Sensitive documentation | Enter/move/modifier/leave changes highlight and who-line text without residue |
TV-I07 |
Border/margin redefinition | Inside pixels move correctly; new strips clear; label/border repaint |
TV-I08 |
Process reset/arrest | Operation targets the window under the menu and leaves the manager responsive |
TV-I09 |
Interesting-window lifecycle | Repeated notification is unique; select/deactivate prunes; Terminal 0 S chooses the eligible target |
TV-I10 |
Who-line precedence and pin | Grabbed/item/default documentation and selected/pinned process state resolve in the specified order |
T3 reusable-family tests
| ID | Test | Pass condition |
|---|---|---|
TV-U01 |
Menu item expansion | String and structured items display, document, return, call, and disable correctly |
TV-U02 |
Momentary menu cancel | Moving out or aborting runs no item and restores exact underlay |
TV-U03 |
Dynamic menu | Recomputed list changes geometry and hit regions without stale selection |
TV-U04 |
Multiple choice | Marks reflect model values and callbacks occur only after valid changes |
TV-U05 |
Scroll full redisplay | Screen-image entries exactly cover the rendered visible model range |
TV-U06 |
Incremental scroll | Reused pixels equal a full redraw and exposed lines are newly rendered |
TV-U07 |
Scroll bar mapping | Relative and absolute gestures reach correct model targets and update thumb |
TV-U08 |
Typeout overlay | Removal restores or redisplays owner with no locked or stale region |
TV-U09 |
Frame selection | Selecting a pane selects its frame and the configured pane, not an independent top-level program |
TV-U10 |
Constraint minima/maxima | Solver distributes exact parent size and rejects impossible trees atomically |
TV-U11 |
Constraint rounding | Child edges are contiguous with no gaps/overlap and final edge equals parent edge |
TV-U12 |
Configuration change | Correct panes expose/deexpose and all names/edges remain valid |
TV-U13 |
Constraint rejection transaction | A rejecting pane leaves every pane at its prior edges and returns the source-defined failure reason |
TV-U14 |
Typeout partial ownership | Written extent receives item interaction; lower area forwards with converted coordinates and no stale highlight |
TV-U15 |
Choice parse/abort | Parse failure and first Rubout do not assign; deexposure restores snapshot and previous selection |
T4 environment tests
| ID | Test | Pass condition |
|---|---|---|
TV-E01 |
System Menu invocation | Correct profile menu appears at pointer and retains original target window |
TV-E02 |
Live System Help | Output reflects the effective mutable/static registry, not a hard-coded application list |
TV-E03 |
System-key cycling | Repeated selection cycles matching existing instances; creation policy remains separate |
TV-E04 |
Recent-window rotation | Dead entries prune and positive, negative, zero, and exposed-window variants follow profile rules |
TV-E05 |
Saved layout | Restores live objects, geometry, exposure order, and selection; killed objects are not fabricated |
TV-E06 |
Delayed screen management | A batch produces the same final pixels/tree as immediate reconciliation without intermediate corruption |
TV-E07 |
Screen Editor protocol | Every non-destructive command operates through live window/frame protocols and one-level Undo limitations match the profile |
TV-E08 |
Multiple screens | Mouse-screen selection, hit testing, screen-local coordinates, and all-screen selection remain distinct |
TV-E09 |
Priority autoexposure | Uncovered candidates expose in corrected priority order; priority -1 does not; no-selection fallback is bounded |
TV-E10 |
Notification destination | Selected frame/pane supplies the stream; a hidden error target enters the attention path without a host-global substitute |
Preserved-system comparison procedure
Use the CADR computer-use harness with a fresh named session. A comparison run MUST retain the identities required by that harness guide, including band and disk hashes, public and private source revisions, private tree and machine-artifact hashes, start-time and execution-time emulator hashes, toolchain, ordered actions, screenshot/pixel hashes, and shutdown state.
Safe probes SHOULD use researcher-created windows and data. Tests that kill, reset, reshape, or arrest shared system windows require an expendable private session. System 46 visible tests remain TODO-RUNTIME until a compatible band is available.
Focused System 303 sheet-core observation
The named harness session tv-core-spec-20260718, generation 1, exercised a researcher-entered rectangle operation in System 303-0. The selected live Lisp Listener reported outer edges (0 0 768 939), inside edges (2 2 766 925), selected status, saved bits enabled, exposed-p=T, output-hold zero, and one following rectangular blinker. These values describe that object at the observation instant, not class defaults. (303-RUN)
The exact input operation was issued twice:
(send tv:selected-window ':draw-rectangle 40 30 -20 -10 tv:alu-xor)Because the listener inside origin was physical (2,2), inside clipping predicts a 20 by 20 intersection at half-open physical rectangle [2,22) × [2,22). Comparing the pre-operation and first-operation captures found exactly 400 changed pixels, with inclusive changed bounds (2,2) through (21,21). Comparing the top-left 40 by 40 region before the first XOR and after the second found zero changed pixels. The running band therefore confirms negative-origin inside clipping and reversible XOR for :DRAW-RECTANGLE; it does not by itself confirm generic BITBLT clipping or the complete ALU space. (303-RUN)
Portable session provenance:
| Field | Value |
|---|---|
| Load band and base/private disk SHA-256 at start | System 303-0; bb16e46ad81decfe1efe691d36b6aa4ce3fd4ffb82474365de3520989d397cb5 |
| Public revisions at start | chaos=db2953fde68d726a605d1d1699bab6c926ef252bd4991f692bae6ee5a634764e; l=d1250f90044f09b6c92014a9aef65f9574e1bcbf8a7163004e53cc6dbed0f2d6; system=4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91; usim=330d8248ec2e12af071e287920e681600f75df9ffd854aada5f8a64c9adad64d; usite=8f717978b458b40adf1e238aaf177f5bc54ef46881268e03b787ba57b0d30a0e |
| Private copy-time revisions | chaos=db2953fde68d726a605d1d1699bab6c926ef252bd4991f692bae6ee5a634764e; system=4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91; usite=8f717978b458b40adf1e238aaf177f5bc54ef46881268e03b787ba57b0d30a0e |
| Private copied tree SHA-256 | chaos=34ab197641aae909e9a224edc307020fddec263e732207a74573d51dac0daa87; system=21f5215de973aa6ccbddb817f2d64edd95ee1014c3028a9b0711ea7c741b807e; usite=adbb720339db225e6635977a869cf3f3d50b507e614b37a976f4a6548d212a81 |
| Emulator SHA-256 at start and execution | 707a77d23e28ea1c45ae0eb0145dc181fa7ba649b9defc30044d4f847ac2c5be for both |
| Private machine artifacts SHA-256 | promh.mcr=2c667f99f014a7130a55b255d31df02588d9396beace78abfe9325269e4ff3e6; promh.sym=e9e3dd6a541511dd9541ae96b99dae19cb185d8b79fa09959f21fa52224f233d; ucadr.sym=9071decf16fa8f11d7970c4662db0d6e95600fe43ec86ac41c77b37dbd7caa2a |
| Toolchain | Guix manifest SHA-256 3adae999bbe420182f22adc2499fcc82449a46eaf580a362de9c0e718fa6b37d; Guix channel commit 230aa373f315f247852ee07dff34146e9b480aec |
| Capture hashes, PNG / pixels | pre-XOR f5b5bfc6ec830ab227c843d72e05714f60a37f35758122d94735734b5638cf5d / 13bf175f424b506c52b8512f3453cc51d57f1c9aeada040888a876c42868079d; clipped 8ea2d452542bb1d513a4562bbeea5eee42286113d3893d326ea09227338d84d5 / da86e0ad00fcc4a7540afc1bf2a53c77e9f977dd62e7abfa8044bca8757fe0dc; restored ddbc94e5a5ba262942ed05a43226a38464d45bb6913d34ad49661cb94b56ec50 / 831578d70fb1422c1d6e1fd6e8c347ff6ec53d0b583e5b39e1dee4594e3307c2 |
| Shutdown | usim_exit_status=0; forced_stop=false; state_may_be_incomplete=false; base disk unchanged |
The focused input sequence recovered the Listener with Abort, queried the selected window and its source associations, recorded the pre-XOR state, issued the two identical operations, and stopped cleanly. Raw captures remain in the ignored session tree and are not linked or published here because intermediate date/error states are not needed for the scholarly claim.
Live :SOURCE-FILE-NAME properties associated key callable TV definitions with logical source areas SYS: WINDOW; SHEET and SHWARM; the pathname version queried as :UNSPECIFIC. This proves resident callable behavior plus a source-area association. It does not identify the compiled source revision or show that the band was built from the pinned Fossil checkout. The session did not query TYPEP/COMPILED-FUNCTION-P on symbol functions, method functions, or combined Flavor methods, so it also makes no compiled-function-object representation claim.
System 303 runtime closure probes
The following 15 probes close source-derived interaction requirements without using operational or licensed payloads as tracked test fixtures. Each probe remains TODO-RUNTIME until a named harness run records both screen evidence and semantic state. Existing screenshots provide the stated visible baselines only.
| Probe | Safe live setup and action | Required observation | Requirements closed |
|---|---|---|---|
P0 priority/damage |
Create overlapping disposable windows with NIL, negative, and positive priorities; bury, deexpose, dirty saved bits, and briefly hold one sheet lock |
Stable priority classes, corrected NIL behavior, autoexposure, saved-bit restoration, and independent queue progress | priority comparator, bury, damage coalescing, lock retry |
P1 keyboard/typeahead |
Create two disposable Lisp Listeners; type ordinary text followed immediately by a System selector; inspect both input streams | Text remains with the old Listener; prefix/suffix are not application text | selected-buffer gate, typeahead transfer, prefix ordering |
P2 MRU |
Create/select A, B, C; deactivate B; use previous/Terminal rotations in both directions | Exact eligibility, pruning, fallback, and rotation order | MRU and recent-window semantics |
P3 process/who line |
Put one disposable Listener process into a named wait; switch windows and pin/unpin the who-line process | Package/run-state follows effective selection, then the pin, then selection again | process association, who-line pin/cache |
P4 nested mouse |
Create a parent/child handler pair; cross child, parent, clipped edge, and another inferior | Deepest owner, local coordinates, final cleanup motion, and documentation precedence | hit testing, ownership exit, who-line item resolution |
P5 hysteresis/menu |
Open a disposable momentary menu; move just inside and outside the 25-pixel halo | Retention, dismissal, pointer warp, and restored underlay | mouse hysteresis and momentary-menu exit |
P6 scroll bar |
Populate a numbered text-scroll window; perform all six button/double-click variants with slow and fast entry | Exact top/bottom/proportional targets, unused gesture, entry reluctance, deferred cleanup | scroll protocol and mouse thresholds |
P7 menu grammar |
Build a safe menu whose operators append symbols to a private log and post one command blip | Every item form/operator, expose-only first click, sparse hit map, dynamic reevaluation, and exact blip | menu grammar and execution |
P8 temporary pixels |
Render a researcher-created pattern; hash the rectangle; show/dismiss nested popups with one induced lock conflict | All-or-none locks and bit-identical restoration at each nesting level | temporary exposure/deexposure transaction |
P9 constraints |
Create a disposable fixed/proportional/even frame with one pane that rejects a candidate; resize and switch configuration | Raw/rounded extents, complete preflight rollback, blank extent, and commit/expose order | constraint grammar and two-phase transaction |
P10 choices |
Use disposable multiple-choice and value forms; test implications, conflicting rules, bad number, first Rubout, and deexposure | Deterministic propagation, retry without assignment, abort snapshot, and selection restoration | choice transaction and parsing |
P11 typeout |
Produce partial mouse-sensitive typeout over a test pane; move/click above and below bottom_reached; complete and output again |
Partial-region forwarding, exact execute blip, invalidation, completeness, and blinker transfer | typeout overlay state machine |
P12 notifications |
Have a disposable background process write/request input through a hidden window, repeat, then select/deactivate it | Lazy one-time interactor, unique interesting entry, bell/text routing, and lifecycle removal | notification and interesting-window semantics |
P13 Screen Editor |
In an expendable generation, move and Undo a disposable test window and reject one reshape, then exit | Menu deactivates before snapshot, edge rollback, one-level Undo limits, and selection restoration | Screen Editor transaction; the 15-item menu is already a 303-RUN baseline |
P14 color |
Only when an emulated color device is available: create a color window, cycle all indices, cover it with a temporary window, and restore | Four-bit pixels, shadow palette, menu registration, ALU preservation, and restored color indices | color profile; otherwise emulator-unit-test only |
For queue, lock, and process assertions, a screenshot is insufficient. The probe MUST also print or inspect a compact researcher-created event/state trace. Raw captures remain under ignored build/cadr-computer-use/; only a minimum reviewed screenshot needed for substantive documentation may enter the curated asset tree.
Known unknowns and required follow-up
- Closed runtime point: System 303 inside-relative negative-origin rectangle clipping and double-XOR restoration are now exact 400-pixel observations, as recorded above. Generic BITBLT and pixel accessor clipping remain separate claims.
TODO-RUNTIME: compare the exact System 303 line walker, overlapping and signed BITBLT edge cases, robust source/destination clipping, tab stops, and More prompt control characters against small synthetic live windows rather than only integrated application output.TODO-RUNTIME: exercise persistent save-bits and no-save-bits siblings with controlled pixel patterns and verify restoration hashes.TODO-RUNTIME: exercise each deexposed-typeout action without operational data.TODO-RUNTIME: compare all scroll-bar buttons, hysteresis thresholds, and absolute mapping with a synthetic list.TODO-RUNTIME: exercise constraint rounding at minimum, maximum, odd remainder, and impossible sizes in a researcher-created frame.TODO-RUNTIME: determine whether the System 303 band ever exercises the corrected NIL-versus-numeric priority branch differently from its maintained source.TODO-RUNTIME: exercise typeoutbottom_reached, incomplete/complete selection, semantic-item invalidation, and forwarding outside the written extent.TODO-RUNTIME: exercise background-interactor allocation, duplicate notification, Terminal 0 S, and hidden-error wait behavior; exact bell/text wording is not yet a runtime claim.TODO-RUNTIME: measure who-line field refresh cadence, process pinning, and file/server field arbitration independently of the already observed item documentation.TODO-RUNTIME: no current run exposes CADR color hardware; palette retrace and four-bit temporary restoration remain source/manual or emulator-unit evidence.TODO-RUNTIME: obtain and run a compatible System 46 load band before making any System 46 pixel or timing claim.- Except for the bounded
streamsymbol-surface result below, the exact relationship between each public System 46 QFASL and the highest readable source generation in its directory has not been proved from build logs. QFASL presence and symbol inventory are corroboration, not body or source-version identity. - Host keyboard and mouse mappings are emulator integration. Historical electrical scan codes and physical ergonomics are outside this specification.
Artifact identities
Compiled-artifact method and source skew
The System 46 QFASLs were inspected inertly: the audit reused the evacuation and nibble-decoding helpers from the tracked public-asset extractor, then considered only plausible FASL SYMBOL and STRING group payloads. It never loaded or evaluated a QFASL. For tvdefs, sheet, baswin, shwarm, and frame, every simple top-level function, macro, variable, flavor, and method flavor/message name from the highest readable companion source was present in the compiled module's symbol inventory. That corroborates a definition surface only; it does not establish method bodies, constants, lambda lists, or whether a source-visible defect was compiled. (S46-QF)
stream.qfasl supplies an exact counterexample to treating the highest source and compiled file as one witness. Its symbol inventory contains DRAW-RECTANGLE-INSIDE-CLIPPED and lacks %DRAW-RECTANGLE-CLIPPED, matching the change present by stream.10. It also lacks all nine later names:
CLEAR-OUTPUT CLOSE CURGEN DRAW-CUBIC-SPLINE FINISH
FORCE-OUTPUT INCREMENT-CURSORPOS LINE-IN SPLINE
Source history adds splines and :DRAW-CUBIC-SPLINE in stream.11, generic stream completion/close methods and :LINE-IN in .12, and :INCREMENT-CURSORPOS in .13; .14 retains that relevant surface. The strongest justified conclusion is therefore that the preserved stream.qfasl has a stream.10-level definition surface. Its bodies have not been disassembled. A compiled-surface-compatible System 46 facade MUST treat those nine names as later extensions, not as proved members of the compiled module. (S46-QF)
Public System 46 representatives
| File | Bytes | SHA-256 |
|---|---|---|
src/lmwin/tvdefs.181 |
27,621 | db0557fdd1e869d29119781501139281773da67f67200660c5e578278b3c1b6e |
src/lmwin/sheet.383 |
68,328 | 4f874b747b47599fadeee83abe6ef16a3a06f5ffecba9ecadc0613e6274ad024 |
src/lmwin/baswin.428 |
56,577 | 2ee1f487e6d14bec5bfc52a1e64b04963b8b1120a4d291be329995de92339dd4 |
src/lmwin/stream.10 |
28,337 | c966a334e723617445db2fa750cca92f6cedfcb09b9f4d3b9b5712e641aad81f |
src/lmwin/stream.14 |
41,227 | 3a41c4752da5b84f2ed88b1b8e3c215c54ceda75f4db28d3bb461fdc2e30b499 |
src/lmwin/mouse.149 |
40,629 | 2bf88baf3a881a47be520fdbd0e1fa0fa45c0e8fa0c5eb0dc349ed5b8877585d |
src/lmwin/menu.29 |
44,154 | dc750a73f9c5983b913890f159c118075f8b5c1566cc0f2420f5637f2f5439a2 |
src/lmwin/frame.120 |
40,532 | a43a7eed0cd7ebe7e9a8ffabdb402f354702e2071443a313ca7378ad91a40ed0 |
src/lmwin/scrman.144 |
30,539 | 15c29e616fa464a45327f51c8ae63fd4740e29ddf92486c0715aae709d5b9878 |
src/lmwin/sysmen.105 |
28,436 | c203bc08b5550edefb1928349179fc54c483655d273077294211eb778daff6f1 |
src/lmwin/tvdefs.qfasl |
41,328 | cf7bcab7255313e33e6689f1eca5ccc7d0b8bbb031081536f46fa26c7a741443 |
src/lmwin/sheet.qfasl |
66,995 | f21f72a9c3450c742da91fc30d31f29df3f4bc84e9191ae0245ff0ec0b8addaf |
src/lmwin/stream.qfasl |
29,463 | ea6337f43755a20b94d239b1d57d8d12a68a8709a40bebb4602848f163d0c141 |
src/lmwin/scrman.qfasl |
25,378 | 5cd8f94a04a383db8cd255476bd2283f800b284f87c54b9cb2bb0622cb5e1f51 |
src/lmwin/basstr.qfasl |
33,941 | 622ca5c92187d4e444e47da80aa12c3c75b50dbea14d9da133465eaad4746921 |
src/lmwin/baswin.qfasl |
64,455 | f2925a6b8e0f912f3af686083909ad6a0d5f1a2b29e16b9011db8edab19cc335 |
src/lmwin/mouse.qfasl |
30,902 | ba1cf8f8472de06e126ce8c60806797f79ac50e399a9baedb848ca5d5530add5 |
src/lmwin/menu.qfasl |
68,259 | 84ccd9cd7e8eea30174889604d140934a41d7bbd75bfa011baac871548704a7f |
src/lmwin/frame.qfasl |
65,998 | c43107fd603217184933618a3f1b9dad1f2e6b5fab4c72e93c859f01c4aed795 |
src/lmwin/sysmen.qfasl |
33,301 | b2b75fc4c0f0a9876a994e3c058e1699b487511165bfdae2ed8a845aff64d753 |
src/lmwin/proces.qfasl |
19,739 | 25fe02c86653e213b3d91353ffed2f656041211104403785c8a38d46aa079be3 |
src/lmwin/choice.qfasl |
78,021 | 63848e971713a0fc27debaac5ac211e1a173dfa96ee71db8dde8fc9c84e538cc |
src/lmwin/scroll.qfasl |
39,238 | 07a2bec9f67658b9c5badd668bff52d17dfd211ab3b9407c34c947f73e95c44a |
src/lmwin/tscrol.qfasl |
23,759 | 26f82c8753c2e5969d979df251673af3e9263d03469c0e361ef9f77c55dd22cf |
src/lmwin/scred.qfasl |
40,893 | b1de273791b4466692c011c724d6d31e013bea4a1ba84116bfcd083b7d6ed8bd |
src/lmwin/shwarm.qfasl |
37,592 | ef6a96f88fd01f4402b6f670506903b47ae03b37d5b302b14d97cce377039e21 |
src/lmwin/color.qfasl |
24,416 | 5ca940ec55dfa2ac03c04b6a9458c054e63363beced30fcb16ff574292238294 |
src/lmwin/typwin.qfasl |
37,912 | c834382fa22f777733f6447f0dbab610307d6357c34310abcd961d68c7ea9489 |
These compiled files were inventoried and hashed, not disassembled in this audit. S46-QF therefore corroborates that each module family had a compiled payload in the public snapshot; it does not prove that the QFASL was produced from the highest numbered readable source beside it.
Preserved System 303 runtime
The primary behavior witness is public disk-sys-303-0.img, 269,562,880 bytes, SHA-256 bb16e46ad81decfe1efe691d36b6aa4ce3fd4ffb82474365de3520989d397cb5. The harness guide records the current source, emulator, machine artifacts, and per-session evidence. The maintained source identities for representative modules are pinned by the System 303 Fossil check-in in the Sources section. The runtime closure table above distinguishes those source identities from behavior not yet exercised in the band.
Sources
- MIT System 46, pinned public
tvdefs.181,sheet.383,stream.14,shwarm.162,basstr.163,baswin.428,mouse.149,menu.29,frame.120,scrman.144,sysmen.105,typwin.53,choice.12,scroll.141,tscrol.41,scred.62, andcolor.33. - MIT, Lisp Machine Manual, third edition, especially “The TV Display” and window-system material.
- David A. Moon and Allan C. Wechsler, Operating the Lisp Machine (stable MIT record), MIT Artificial Intelligence Laboratory Working Paper 209 (April 1981), explicitly accurate as of System 67; especially §§2.1-2.3 for user-visible corroboration.
- MIT System 46, pinned public TV manual source, window-system draft, and operations manual source.
- LM-3, pinned System 303
tvdefs.lisp,sheet.lisp,stream.lisp,shwarm.lisp,graphics.lisp,scrman.lisp,basstr.lisp,baswin.lisp,mouse.lisp,menu.lisp,frame.lisp,sysmen.lisp,typwin.lisp,choice.lisp,scred.lisp, andcolor.lisp. - Repository runtime studies, CADR computer-use harness, System Menu and selection, and Screen Editor and Frame-Up.
Last verified: 2026-07-19.
