Statice persistent object and database environment
Statice is a persistent, shared object environment for Genera, not a serialized Lisp world and not merely a B-tree library. A program declares entity types in Lisp, creates or opens a database stored in the Statice File System, and works with entity handles that stand for records whose lifetime can exceed the current process, machine, and world. Transactions, page locks, a recovery log, local and remote page clients, indexes, backup tools, a schema-aware Browser, and a Command Processor interface turn that programming model into a database system.
The inspected Open Genera release divides the product into development, run-time, server, Browser, documentation, and examples systems. Its lower layers are DBFS page/file service, records, areas, B*-tree indexes, schemas, queries, and recovery. The separately loadable contributed system named btree is unrelated to those internal Statice indexes and must not be used to explain their implementation.
This article reconstructs the product family without loading any optional Statice system or creating a database. It distinguishes four kinds of evidence throughout:
- Public manual: intended Statice 2.0 behavior and the Statice 2.1 release notes.
- Licensed source: the later Open Genera source snapshot shipped with this museum's legitimately acquired media.
- Local artifact observation: names, sizes, hashes, dependency declarations, and inert Help-extraction counts; no proprietary body text is reproduced.
- Runtime observation: a safe probe of the base world, limited to package and already-loaded-system presence. No Statice system was loaded and no namespace, file-system, partition, database, schema, or backup state was changed.
Evidence and rights boundary
The local Statice source tree is licensed Symbolics material and remains untracked. This page publishes original analysis, short program and command labels needed to identify the interface, and portable cryptographic evidence. It does not reproduce source bodies, decoded Help prose, database examples, or compiled payloads.
The licensed sys.sct/statice/ subtree contains 172 files totaling 5,182,497 bytes. A manifest made by sorting each relative pathname and hashing each file, then hashing that manifest, has SHA-256 1e1f10caa8b09c20efaf1aca62f069a1e00a9521d1d4bea0739b62525cd238d3. Selected evidence files are:
| Portable artifact | Bytes | SHA-256 | Use in this study |
|---|---|---|---|
statice/sysdcl.lisp.~111~ |
3,874 | 65f969bf20786e1c97bcedc2f275f61d5c49252d2dfab9b92573dbfe37c5a679 |
development-system declaration |
statice/runtime-sysdcl.lisp.~17~ |
5,895 | 140412218e60d99d3a47bbd1b0c6757e13cbc3f9197c1e2dadf33542eaae6f7c |
run-time dependency graph |
statice/server-sysdcl.lisp.~5~ |
4,964 | c471dbe1f586fbfc1e64ecf0dbae20a1b790117951ad7e9b3f78ec65a49e87a7 |
server, recovery, and backup layers |
statice/browser-sysdcl.lisp.~5~ |
3,196 | 5146f0a9f93a2deb6718c74144d59e05b57daae1fd4255a35695d0836a81e512 |
Browser packaging |
statice/documentation/doc-sysdcl.lisp.~35~ |
4,543 | 300dc5875ba6a538bc82cb4c983c043b9472bcb6c24ec77654b90530c19ef0ee |
installed documentation inventory |
statice/statice-packages.lisp.~45~ |
21,790 | 759540c96712ac516c465e25b6485cd687f11d1d406ed957ba2c5d4450d4f036 |
package, command-table, and interface boundary |
statice/development/browser.lisp.~41~ |
46,117 | 7fa700d6a1bbc212e7a7dd1dc2715c49482daca6d781fcf08475421f71fbbb7d |
panes, commands, gestures, queries, and edit conflict handling |
statice/development/defining-forms.lisp.~15~ |
43,378 | 0fc0c26894a3c4d0ce1593d32db6a4d30498dc2699acb95a7b964b9e43513f58 |
schema and entity-type expansion |
statice/development/for-each.lisp.~4~ |
29,742 | 791153ebb1600fcbde56b21331899dad5f7dfe90286285bf609db3f6866d4306 |
compiled query syntax |
statice/model/defs.lisp.~145~ |
70,165 | ae034e0e37fb29918ce655f0075f7c0ae5f3a29a1283d17e9d2f4c55dd6e8729 |
database, schema, type, attribute, and entity-handle objects |
statice/model/datatypes.lisp.~172~ |
200,858 | 43c15f32c80497fd2b31f282298c8380929b35c1c2014a1b36124a026baa23f0 |
logical and physical data types |
statice/model/query.lisp.~47~ |
101,238 | 68744428c395aa2ae754dc46954d92dd989a63499ec204b0e9abeeea0fafdfda |
query planning and execution |
statice/model/update-schema.lisp.~29~ |
53,046 | 8055eb4de60abddd3f15d324c444ccfe76eecbd9ccd17551ffcefa8c854599fe |
schema comparison and update |
statice/storage/tree.lisp.~137~ |
74,421 | 33fd0532e1c80a80f1b578a23ad80f63e5153a32afcadeae796087d87415a5ce |
internal B*-tree implementation |
statice/storage/record.lisp.~226~ |
126,206 | 0aa3f0c609ce0b00878c5ad0324d7ef3333af177506e647566a84a665ec8e884 |
entity and relationship records |
statice/file/client.lisp.~543~ |
55,043 | e5befd3d51071cf0f1c6f0c7e242bb2d67df2ce8f77f7039270d572577d3a827 |
page client and transaction boundary |
statice/file/common.lisp.~432~ |
103,253 | cf130015f843c4c41cb9a25d9e05e79c7841f55a0d9e821ef1429fd313ea434f |
common page and file-system mechanisms |
statice/file/remote.lisp.~263~ |
40,640 | 4adcd6d519d07e6435968015e872cf11fc3043322a5219d5c3a5f7d18fb6c4c6 |
remote page protocol |
statice/file/lock-order.lisp.~22~ |
12,720 | c16bbcdc4aaa9340f2d0de99abff5c9c32b393385c8b0be6796ed24f3fd72491 |
lock ordering and deadlock support |
statice/file/dbfs-pathnames.lisp.~30~ |
13,776 | 5053b1759124a44c5d424056f5d9871c67ba3257f4a0ddd84023d4b1d634d4db |
DBFS pathname behavior |
statice/utilities/runtime-utilities.lisp.~1~ |
21,238 | cc8389c158477f3331b3c30fa5df5c5c726061a568ba480150b80511ce794cb2 |
top-level commands and database copy |
statice/utilities/model-dumper.lisp.~36~ |
24,240 | eeaee9020253e8704963cd703947a3810175461a89d4a23e29d9a1f14c188894 |
source-form dump and load |
The public Statice User's Guide PDF is 1,346,186 bytes, 245 pages, SHA-256 8c6f10e9801f01bc95c789d2234b7e7068144290dc72bcc5c965b0987220cb8f. Its book-registration page identifies Statice 2.0 for Genera 8.0 and document number 999979. The PDF's 2018 creation metadata describes the scan or generated copy, not the date of the historical product. The public Release Notes for Statice 2.1 PDF is 61,690 bytes, seven pages, SHA-256 b7dad36e1dd993c49fbc9b97f9e1cf07dc6fa290085fc9d69a809aa816ccdce3.
Release and source-version boundary
The local system registry reports released and latest version 466 for Statice, Statice-Runtime, Statice-Server, and Statice-Browser, and version 426 for Statice-Documentation. Those are Genera system versions, not public Statice product-version numbers; no evidence maps 466 to a marketed Statice release. Consequently this page does not silently project every Open Genera source detail back onto Statice 2.0 or 2.1.
That boundary matters. The 2.1 notes describe entity handles as Flavors and say that direct CLOS integration is not supported. The later inspected source says the user-visible layer underwent a Flavors-to-CLOS conversion, defines entity handle classes with defclass, and has examples specialized with CLOS methods. Lower layers still mix SCL/Flavors and Future Common Lisp machinery. This is release drift: the older manual and later media are each evidence for their own state, not a contradiction to erase.
Product map and load boundary
The family is layered deliberately:
| System | Declared role | Principal layers |
|---|---|---|
Statice-Runtime |
deploy an application that uses an already defined schema | packages and unique IDs; DBFS kernel/client; record and index layers; model, query, schema update, DBFS directories, run-time utilities, model dumper, presentation types |
Statice-Server |
own disks, serve pages, recover, and back up | run-time plus UFS disk access; local and remote DBFS server; recovery; server setup; tertiary storage, volume librarian, maintenance, complete/fuzzy backup utilities |
Statice-Browser |
inspect and edit entities interactively | run-time plus the Statice Browser Dynamic Windows program |
Statice |
develop schemas and applications | run-time plus schema/access/type/query macros, Browser, and example source |
Statice-Documentation |
installed Documentation Examiner material | Statice topic, tutorial, operator, type, performance, error, and release-note books |
The run-time declaration resolves the following conceptual stack:
application and entity methods
-> defining/access/query macros (development system)
-> schema, datatypes, entity handles, queries, schema update
-> records and relationship records
-> heaps, areas, B*-tree indexes, and scrolls
-> DBFS directories and pathnames
-> local or remote page client, locks, queues, and transactions
-> UFS disk access, recovery log, backup, and server (server system)
The declarations mark development sources as distributable within Symbolics' product machinery while most run-time/server internals are marked otherwise. The purchased media nevertheless includes many Lisp source files beside compiled VBINs. Neither fact grants public redistribution rights; all such files remain licensed inputs.
Persistence model
Template schema and real schema
A define-schema form creates a template schema in Lisp virtual memory. define-entity-type adds persistent classes, inheritance, attributes, storage hints, and generated access functions to that template. make-database copies the template into a new database as its real schema. Thereafter the template and real schema are distinct objects: administrators can add physical indexes to one database without changing every database or the Lisp definition, and a new program definition does not mutate existing storage by itself.
with-database associates a pathname with a schema and establishes a current database for its body. open-database, with-current-database, current-database, and terminate-database expose the longer-lived connection boundary. A database's stored schema name must name a template schema present in the Lisp world; the Browser likewise needs that package and schema loaded before it can interpret persistent records.
Entity types, attributes, and relationships
Entity types support multiple inherited attributes, although the 2.1 notes forbid duplicate inherited attribute names. An attribute can be scalar or set-valued, nullable or :no-nulls, entity-valued or ordinary, unique, read only, cached, initialized by a form, placed in an area or attribute set, and given generated accessors. Entity-valued attributes can declare an inverse, so a relationship is navigable in both directions. Type options choose areas, type sets, clustering, constructors, initialization keywords, instance variables, documentation, and multiple-attribute indexes.
An entity handle is a Lisp proxy for a persistent identity. The handle stores enough identity and database context to find the record; it is not the entire entity serialized into the heap. Unique IDs let references remain meaningful across pages and sessions. The server keeps its ID source in FEPn:>UNIQUE-ID.FEP.1, a two-block FEP file. The guide says the system can recreate it if lost, but explicitly advises leaving it alone.
Records and physical layout
The source separates entity records from relationship records:
- one entity record holds a persistent entity's scalar values and inherited slots;
- a set-valued relationship normally has a relationship record per member;
- a special unique one-to-many entity relationship can store the back pointer in the target entity record instead;
- areas group pages, while type sets and attribute sets identify the pages that hold particular kinds of records;
- clustering hints place entities or relationships that are likely to be read together near one another.
The 2.0 guide gives a Statice page as 1,152 bytes on 36xx machines and 1,280 bytes on Ivory machines. One directory-property description also calls a block 1,152 bytes while parenthetically noting 1,280-byte Ivory FEP blocks. Page size is therefore a server/hardware format property, not a portable constant. Database copy detects incompatible page sizes and directs the user to textual Dump/Load instead.
The page cache has a configurable buffer-replacement limit. Least-recently used pages can be reclaimed only when they are not held by a transaction; pages above the configured limit are treated as most-recently used. A database can thus be larger than Lisp virtual memory, but long transactions can pin enough pages to defeat replacement.
Indexes are physical, not semantic
Statice indexes are B*-tree structures in the Statice-Index layer. They sort keys and accelerate access without changing which entities satisfy a query. The product supports normal attribute indexes, inverse indexes for relationship directions, exact and case-sensitive variants where applicable, and indexes on several attributes. A multiple index can service predicates that constrain a leading subsequence of its fields; arbitrary trailing-only conditions do not have the same ordered access path.
The query planner can intersect several applicable indexes. Without one it scans the smallest suitable physical population: a type set, attribute set, or area. Adding an index therefore trades storage and update/lock work for query speed. The 2.1 notes additionally report that indexes can improve deletion speed, not only lookup.
Data types
The 2.0 interface accepts the following built-in or compound type specifiers for persistent attributes:
statice:all-but-entity,statice:alist-member,boolean,character,double-float,statice:entity-handle,statice:image,integer,statice:limited-string,member,dw:member-sequence,statice:pathname,single-float,string,string-char,symbol,t,time:time-interval,time:time-interval-60ths,time:universal-time, and vectors of unsigned elements sized 1, 2, 4, 8, 16, 32 bits orfixnum;- application-defined logical types, whose handlers map a logical Lisp value to an underlying physical Statice representation.
The permissive type t uses Genera's binary dumper. The manual establishes support for numbers, characters, strings, symbols, arrays, recursive lists, compiled code, generic functions, symbol-cell locatives, and Flavors that supply a dump form. It excludes most other locatives, dynamic and lexical closures, logic variables, stack groups, and circular objects. This facility persists a value inside a Statice record; it does not turn an arbitrary live Genera process or world into a database snapshot.
The documented unsupported type-specifier list is and, array, atom, common, compiled-function, cons, function, hash-table, instance, list, locative, not, or, package, random-state, readtable, satisfies, sequence, simple-array, simple-vector, stream, structure, sys:dynamic-closure, sys:generic-function, sys:lexical-closure, and values. The distinction is between a supported Statice storage type and an ordinary Lisp type name, not between Lisp and non-Lisp data.
Query, update, and transaction semantics
Query language
for-each is the compiled query form. It binds an entity variable, compiles predicates against the known schema, selects access paths, and evaluates a body for each result. The dynamic for-each* and count-entities* variants accept type and condition data at run time. The 2.1 notes place two important limits on for-each*: one entity variable per call, and no iteration over set-valued attributes. The later source still contains those entry points, but this study did not load the system to test whether release 466 retains the limits.
The Browser source's exact comparison vocabulary is:
| Family | Operators |
|---|---|
| numeric/general ordering | =, not-equal, <, >, <=, >= |
| membership/identity | any, eq, eql, equal |
| case-insensitive strings | string-prefix, string-search, string-equal, string-greaterp, string-lessp, string-not-greaterp, string-not-lessp |
| exact-case strings | string-prefix-exact, string-search-exact, string=, string-not-equal, string<, string>, string<=, string>= |
The Browser asks for attribute/value/operator triples in an Accept Values form. Program code can express richer compiled conditions and ordering. Index selection is an optimization underneath the truth conditions; a query still has the same intended result when it falls back to a scan.
Transaction contract
with-transaction establishes the supported atomic update boundary. A normal return commits; a nonlocal exit or process death aborts. Nested transactions do not independently commit: the outermost transaction owns the eventual commit or abort. The manual promises atomicity, isolation, and persistence of committed changes across failures.
The page layer uses two-phase, page-granularity locking:
- an unlocked page can acquire a shared read lock or exclusive write lock;
- a transaction retains acquired locks until commit or abort;
- an upgrade from read to write can participate in a deadlock;
- the detector handles two-way, n-way, and upgrade cycles and aborts the youngest transaction in a detected cycle;
- a restartable abort normally retries, with a documented default retry limit of 100.
This retry behavior is semantically visible. Any non-database side effect in a transaction body can occur more than once. The 2.1 notes therefore advise small transactions, avoiding irreversible effects, avoiding unnecessary nesting, and never overriding the internal without-aborts protection. The debugging variable *restart-testing* deliberately forces retry paths.
A client or server failure aborts unfinished work. A server failure aborts the transactions using that server across clients. The 2.1 notes also say not to warm boot while Statice locks are held: world recovery is not a substitute for the database transaction protocol.
Schema change
Changing a template schema does not rewrite a real schema. Update Database Schema compares them and plans actions. Compatible changes include adding or deleting entity types and attributes, and adding or deleting indexes, type sets, and function/attribute sets. New attributes begin null or empty. Deleting a type deletes its entities, and deleting an attribute does not necessarily recover its occupied space.
Changes to inheritance, an entity type's area, or an attribute's stored type, cardinality, uniqueness, null policy, or area can require rebuilding rather than in-place update. Dumping and loading through source form is the general cross-format reconstruction path.
Two independent warnings make Update Database Schema unsafe to recommend for preservation work:
- the Statice 2.1 release notes explicitly say not to use it because of reliability problems and say to back up first if it must be used;
- the later inspected
update-schema.lisp.~29~contains a source comment that warnings when data will be lost are still to be done, immediately noting cascading entity and tuple deletion.
The second point is source-visible behavior not disclosed by the 2.0 command description. This museum performed no schema update.
Programming interface inventory
The 2.0 operator dictionary names 83 public operators. The table below is a complete name inventory, grouped by purpose. It is intentionally a map rather than a substitute for the manual's argument lists and conditions.
| Count | Purpose | Complete operator-name inventory |
|---|---|---|
| 7 | definition and basic use | define-schema, define-entity-type, make-database, with-database, with-transaction, for-each, delete-entity |
| 2 | set-valued attributes | add-to-set, delete-from-set |
| 9 | indexes | make-index, make-inverse-index, make-multiple-index, delete-index, delete-inverse-index, delete-multiple-index, index-exists, inverse-index-exists, multiple-index-exists |
| 4 | array/string portions | attribute-value-array-portion, attribute-value-length, set-attribute-value-array-portion, do-text-lines |
| 4 | database lifetime | open-database, with-current-database, current-database, terminate-database |
| 10 | dynamic access and query | attribute-value, set-attribute-value-to-null, inverse-attribute-value, attribute-value-null-p, make-entity, for-each*, add-to-set*, delete-from-set*, count-entities*, do-text-lines* |
| 5 | clustering, testing, tuning, and UI | with-cluster, *restart-testing*, dbfs:set-buffer-replacement-parameters, view-entity, statice-utilities:entity-named-by-string-attribute |
| 11 | extensible logical types | statice-type:define-value-type, statice-type:define-handler-flavor, statice-type:encode-value, statice-type:decode-value, statice-type:read-value, statice-type:value-equal, statice-type:size-of-value, statice-type:write-value, statice-type:record-equal, statice-type:record-compare, statice-type:value-compare |
| 31 | schema inspection | get-real-schema, get-template-schema, get-real-schema-name, get-template-entity-type, schema-name, schema-types, type-name, type-parent-names, type-attributes, type-area-name, type-set-exists, type-multiple-indexes, attribute-name, attribute-function-name, attribute-type, attribute-value-type, attribute-value-is-set, attribute-unique, attribute-read-only, attribute-area-name, attribute-set-exists, attribute-index-exists, attribute-index-average-size, attribute-inverse-index-exists, attribute-inverse-index-exact-exists, attribute-inverse-index-average-size, attribute-no-nulls, attribute-inverse-function-name, multiple-index-attribute-names, multiple-index-unique, multiple-index-case-sensitive |
The counts sum to 83. Generated entity accessors and constructors are application-specific and therefore do not add fixed names to this release-level inventory.
Development workflow
A normal development sequence is:
- load the development system and define a schema plus entity types;
- create a DBFS database from the template, or open an existing database whose schema name matches a loaded template;
- create entities and relationships inside small transactions;
- add physical indexes after measuring real access patterns;
- query with compiled
for-each, or use dynamic operators and the Browser for exploration; - dump source-form data or take a complete server backup before risky schema or storage work;
- terminate an exact-copy source before opening its clone, because the copy preserves unique identities.
The shipped example system includes book, bank, university, image, extensible type, presentation-type, Joshua, and finger-oriented examples. They establish integration surfaces but are not separate Statice products. Exhaustive example walkthroughs are deferred to the repository's D60 examples dossier.
Statice File System and server topology
DBFS as a Genera file-system type
The Statice File System is registered in a namespace as a File System object of type DBFS. It lives on a Symbolics server host, but clients address its namespace name rather than embedding that host in every database pathname. A site can therefore move the file-system service while preserving logical names. More than one Statice file system can reside on a host.
A DBFS pathname has a host and directory components, for example IRIS:>DIRECTORY>DATABASE, but no ordinary file type or version. Lookup is case-insensitive while names preserve case. Relative pathnames, directory wildcards, completion, and directory commands are supported. The exposed file properties are author, creation date, comment, directory status, and length in blocks.
This namespace resemblance does not make a database an ordinary byte stream:
| Ordinary file operation | DBFS behavior established by manual/source |
|---|---|
Open for reading or writing |
rejected; only probe, probe-link, and probe-directory directions are accepted |
| Show Directory / Dired | supported for database and directory names |
| Create Directory | supported |
| Delete File / Delete Directory | supported and immediate; there is no undelete or expunge stage |
| Rename File | supported |
| Copy File / Show File | not a way to copy or print database contents; use Statice-specific copy, dump, or Browser operations |
| links | not supported |
The DBFS root directory is represented in a directory database, rooted from the FEP .UFD. The server stores partition information, a log descriptor, and the directory root identity as file-system metadata. Create Statice File System constructs that managed structure; it is not synonymous with making one user database.
Local and remote clients
A local client reaches the server's disk layer directly. A remote client asks the host for a server process, then uses pooled connections for page requests; idle connections can be scavenged. Two services divide the work:
DBFS-PAGE, documented at TCP port 569, carries synchronous page requests;ASYNCH-DBFS-PAGE, documented at TCP port 568, sends reverse notifications such as cached-page invalidation.
The asynchronous channel improves cache behavior but is not the sole correctness mechanism. The 2.0 manual describes TCP and Chaos service registrations. The 2.1 notes say to use TCP because the Chaos path is unreliable. The later Open Genera command source only constructs TCP service triplets. This is a specific release difference, not evidence that the older manual invented its Chaos configuration.
The commands' keyword is visibly named TCP Not Present. In the later source, setting it makes the procedure treat the TCP tuple as already present and return without updating the host object. That matches its documentation—do not add the tuple—although the resulting “already has” status message is potentially misleading.
Recovery, backup, and interchange
Log and failure recovery
The server's recovery log grows automatically and records enough page activity to abort unfinished work and restore a consistent committed state after a failure. It is part of the server layer, not a user-level audit trail. A complete backup is supported. The manual also describes a continuous archive design but says that facility is currently unsupported; this page does not turn that design into a shipped capability.
Complete backup and restore
The Statice File System Operations program manages volume sets and volume sequences. A complete backup can run without disabling the file system. A complete restore is destructive: it first removes the databases currently in the selected Statice file system, after confirmation, then restores the backup. Compare Backup Volume Set compares saved and current pages.
The volume library is itself a Statice database. It tracks volume identities, backup runs, files, and notes, and supports queries such as backup history and finding the volume that contains a named database or file ID. The manual names cartridge and industry-standard tape choices and local or remote tape drives; its recommendation is remote tape over TCP. The media also includes fuzzy backup compiled modules. Their source is not present, so their algorithm and supported user contract remain a TODO; their names alone do not justify a claim of online incremental backup.
Selective restore
Selective Restore exposes the following decisions:
- target Statice File System;
- whether to disable it for the restore;
- one or more database path patterns;
- whether to repatriate recovered files, with
Yes,No, orQuerypolicy; - name-conflict action: leave, rename existing, replace existing, load under a unique name, or query;
- automatic or manual volume selection;
- tape device and volume host;
- detailed-progress display.
The 2.0 manual advises application programmers to leave repatriation off by default. Selective recovery is still a server administration operation; it is not a transaction-level undo command.
Database dump/load source form
Dump Database writes a textual reconstruction file to an ordinary file system. Its control records include domain, relation, committed-domain, and index forms; its data records describe entities and relationship data. Dump holds one long consistent transaction, whereas Load commits many smaller transactions. Load therefore reconstructs logical contents but is not a byte-for-byte image restore. Clustering is re-established during the load.
The manual warns that this source form can be larger than the original binary database and can run into the historical LMFS file-size limit of approximately 15 MB. It is nevertheless the portable path between servers with different Statice page sizes. The later Open Genera source adds a Data Only option to Load Database; that option is absent from the 2.0 command dictionary and loads records against an existing schema rather than rebuilding schema/index definitions.
An exact Copy Statice Database preserves unique IDs. The source and its copy must not both remain open: terminate the first before opening the duplicate. This is an identity collision constraint, not just a filename rule.
Persistence artifacts at a glance
| Artifact | Meaning | Snapshot-like? | Preservation consequence |
|---|---|---|---|
| DBFS database | schema, records, relationships, indexes, and page metadata | no; managed page database | preserve with matching server format or dump/load |
| Statice File System | namespace, directory database, partitions, log, and many databases | closer to a storage service than a VM image | requires server topology and recovery metadata |
| recovery log | uncommitted/committed recovery state | no | pair with the file-system state; do not present as user history |
| complete backup volume set | server-level backup of a Statice File System | media image at the database-service level, not machine state | preserve volume order, labels, library metadata, server page format, and restore procedure |
| Dump Database output | textual logical reconstruction | no | most portable and inspectable form, but large and not byte-identical |
| Genera world/VLOD | Lisp world containing code, schemas, and possibly open handles | yes, world/load image | does not by itself contain or commit the external DBFS page store |
Command Processor surface
Loading the Statice run-time/development utilities installs a Statice Command Processor table. The later source and compiled interface define exactly 13 Statice-specific top-level commands:
| Command | Purpose and principal arguments |
|---|---|
| Add ASYNCH DBFS PAGE Service | update one host's namespace service list; host plus TCP Not Present switch |
| Add DBFS PAGE Service | update the synchronous page service on one host; same switch |
| Add Statice Partition | add an FEP partition pathname and size in blocks to a named local Statice File System |
| Copy Statice Database | source/destination; optional author, comment, and creation-date properties; directory-creation policy; query policy |
| Create Statice File System | name; Locally; directory partition, maximum directory entries, initial log blocks, and repeated data partition/size entries |
| Delete Statice File System | name and Locally; confirms destruction of the entire file system and its databases |
| Dump Database | DBFS database pathname and ordinary destination pathname |
| Load Database | DBFS destination, ordinary source pathname, If Exists error/create policy, and later-source Data Only boolean |
| Set Database Schema Name | DBFS pathname and schema symbol; confirms before changing the stored association |
| Show All Statice File Systems | namespace, defaulting to all/search path |
| Show Database Schema | DBFS pathname; reconstructs a definition from stored schema metadata |
| Show Statice Partitions | local Statice File System |
| Update Database Schema | DBFS pathname; plans, reports, confirms, and performs the dangerous comparison/update described above |
Ordinary Show Directory, Create Directory, Rename File, and Delete File commands remain applicable to the DBFS namespace within the restrictions above.
Schema reconstruction is intentionally lossy
Show Database Schema can reconstruct entity area/type-set/multiple-index options and attribute unique/index/inverse-index/area/attribute-set/no-nulls options. The source does not reconstruct all source-level choices. It omits at least attribute caching, initialization forms, inverse forms, clustering, accessor/reader/writer names, and read-only declarations, plus entity constructor, conc-name, default-init plist, documentation, initialization-keyword, instance-variable, and own-cluster choices. Its output is useful evidence about the real schema, not guaranteed recovery of the author's original declarations.
Two source-only command findings
The later Copy Statice Database source offers :comment in the accepted property list but tests for :copy-comment when binding the internal copy flag. On the inspected source this mismatch appears to prevent the requested comment property from being copied. The matching VBIN has the same source version, but runtime confirmation remains a TODO because the system was not loaded.
The later Load Database source exposes Data Only; the 2.0 command dictionary does not. This is a later user-facing addition rather than an undocumented option inferred from an internal helper.
Statice Browser
The program object is named Statice-Browser and displays the title Statice Browser. It is a Dynamic Windows system-menu program that inherits the Help Program, colon full-command, standard-arguments, and standard-scrolling command tables. The manual starts it with Select B or the System menu. Its job is to open an existing database whose schema definition is already in the world, construct queries, inspect result sets, and view or edit entity attributes.
Window structure
The source defines six panes:
- a title pane naming the open database and state;
- a viewer/typeout pane for the selected entity and explanatory output;
Current Candidates, holding the active query's entity handles;Queries, retaining result-set objects that can be reselected;- a
Commandsinteractor; - a
Command Menupane.
The fixed top-level menu contains exactly Open Database, Query, Begin Edits, End Edits, Abort Edits, and Help. Viewer output and the two history panes are separate: selecting a query changes the candidate source; selecting a candidate changes the viewed entity.
Complete Browser-defined command surface
The inspected Browser source defines 13 program commands. Inherited Help and scrolling commands remain available but are not relabeled as Browser-defined.
| # | Command | Direct key/menu | Effect and arguments |
|---|---|---|---|
| 1 | Clear | command | clear pane histories, pathname/schema state, candidates, and saved result sets |
| 2 | Remove Typeout Window | Space |
remove the transient typeout window without echoing a command name |
| 3 | Open Database | top menu | accept a DBFS database pathname; require matching loaded schema/package; reset previous state |
| 4 | Query | top menu | accept entity type and attribute/operator/value rows; count candidate size, confirm a large result, then execute |
| 5 | Begin Edits | top menu | start queueing Browser edits instead of writing each one immediately |
| 6 | Abort Edits | top menu | discard the queued edit set |
| 7 | End Edits | top menu | compare and commit queued changes; Compare Attributes is None/Changed/All, default Changed; Difference Action is Query/Abort/Ignore, default Query |
| 8 | Describe Attribute | presentation command | describe the selected schema attribute |
| 9 | Next Candidate | Control-N |
move forward by integer count, default 1; numeric and Control-U arguments are accepted |
| 10 | Previous Candidate | Control-P |
move backward by integer count, default 1; numeric and Control-U arguments are accepted |
| 11 | Select Candidate | presentation command | make a candidate entity current |
| 12 | View Entity | presentation command | display a functional entity handle in the Browser |
| 13 | Select Query | presentation command | switch to a retained result set |
No other fixed Browser keybindings were found in this source. Standard Dynamic Windows editing, scrolling, completion, abort, and Help behavior comes from the inherited command tables and can be site- or release-sensitive; this article does not invent editor-style bindings for them.
Presentation gestures
| Presented object | Gesture established by source | Result |
|---|---|---|
candidate entity in Current Candidates |
left | Select Candidate |
query/result set in Queries |
left | Select Query |
| functional entity handle in the Browser | left | View Entity |
| attribute name | middle | Describe Attribute |
| abbreviated set value | contextual menu choice | display more members of the set |
pop-up-image value |
presentation action labelled Show Image |
open the image; the source uses a generic gesture and does not pin a physical button |
The Browser displays only the first three members of a set-valued attribute, then an ellipsis and remaining count. That limit is a source constant, not a manual approximation. Attribute values are presented as editable forms unless the schema marks the attribute read-only, exposing the inherited Dynamic Windows structure-slot modification action.
Immediate and deferred editing
Outside an edit session, changing one displayed attribute opens its own transaction and writes it. The source explicitly does not recheck that value against the value originally displayed, so a concurrent change can be overwritten.
Begin Edits instead records proposed values. At End Edits, the Browser opens a transaction, compares current storage with the old displayed values according to the chosen policy, and writes the queued updates. Under Query, each conflict presents old, current, and proposed values and asks how to proceed. A source-only qualification is important: the comparison loops filter through the storage handler's indexable-p. Thus the displayed All or Changed policy does not visibly prove comparison of every non-indexable extensible value. Runtime confirmation of that edge case remains a TODO.
Another source-visible detail is that Query counts entities in one transaction and retrieves them in a later transaction. The confirmation estimate and the final result therefore need not describe one atomic snapshot if another client commits between those phases. The result container accommodates the eventual fetch; the displayed count should be read as an estimate at confirmation time.
Screenshot status
Screenshot TODO: the base licensed world did not have the Statice packages or Browser system loaded, and the safe probe deliberately did not load optional software or create a database. A meaningful Browser capture additionally needs a disposable, rights-cleared test database and loaded matching template schema. Without those prerequisites, a blank or error window would not verify the query, presentation, or edit behavior described here. No screenshot is published in place of that missing runtime evidence.
Statice File System Operations program
The server administration application displays Statice File System Operations and has internal program name DBFS-OPERATIONS. The manual and installed Help say to load DBFS-Utilities, then use Select Shift-D. Its upper pane is a command menu; the lower pane is a Lisp interaction/directory pane. Commands can be typed, selected from the menu, or invoked from presented directory entries. Accept Values gathers command options, and End executes the form.
Maintenance option surfaces
Complete Backup, Compare Backup Volume Set, and Complete Restore share a core Accept Values surface: Statice File System, volume-set name, volume sequence number, device, volume host, and detailed-progress display. Complete Restore adds the destructive replacement confirmation.
Selective Restore supplies the complete policy set listed in the recovery section. Describe Backup Volume asks for the tape type/device and volume host; Describe Statice File System asks for the file-system name; Enable/Disable File System and Show Backup History select a file system; Find Backup Volumes accepts the filename-or-ID search key. Initialization and device-specific prompts can vary with installed tape support, so this article does not claim an exact hardware menu without a loaded runtime.
Maintenance screenshot status
Screenshot TODO: DBFS-Utilities was not loaded in the base world and this study did not load it. A publishable maintenance screenshot should be made only in a disposable server configuration, because even opening Accept Values beside live DBFS presentations risks inviting a destructive Complete Restore, Delete, partition, or enable/disable action. The future capture must stop before End, record the exact menu and options, and undergo the repository's screenshot rights review.
Installed on-line documentation
The tracked inert extractor described in Recovering Genera on-line Help and documentation reads SAB and source Help structures without evaluating licensed forms. Its ignored local catalog identifies 24 Statice SAB files totaling 885,139 source bytes, 320 documentation records, 1,863 embedded command objects or references, and two picture objects. The command-object total is an internal serialization count, not 1,863 distinct Statice commands.
Three books are installed with the base documentation run time:
| Logical Help source | Bytes | SHA-256 | Records | Command objects | Pictures |
|---|---|---|---|---|---|
doc/installed-440/statice-rt/statice1.sab |
79,892 | aa697b2f036fb57a82ab04ce0e6a330c3b428c8b5dd9b76d1a5888799d02865e |
31 | 28 | 2 |
doc/installed-440/statice-rt/statice2.sab |
29,966 | 44fe8569ef556ffc8f38c45a1c17afd880ffa1c0127b9db28cbf9a423537e1cb |
14 | 66 | 0 |
doc/installed-440/statice-rt/statice3.sab |
15,305 | dd925e1d6853769f2ad3f4d18ddde3594c5ae19227bcb059c58773e77bd21e12 |
17 | 8 | 0 |
The 21 product documentation SABs cover installation, buffer replacement, errors, extensible types, hints, operators, performance, release notes, tools, five topic divisions, four tutorial divisions, and types. Their decoded prose and pictures remain under ignored build/help/genera/; this article links the tracked recovery method, not those licensed outputs.
The evidence-producing files at verification time were:
| Artifact | Bytes | SHA-256 |
|---|---|---|
scripts/extract-genera-help.py |
55,939 | e59440906a0092afe28ca514be9e7afdf6c21ca1009b765a710f0a4121f13a74 |
ignored catalog.json |
577,696 | a089d1e64e65e06471ef5bb90533164242267c9f8eb1067062a41796998c1aed |
ignored lisp-source-help.jsonl |
9,817,347 | 8e59a784b805808e86b84be58fea8622f64fb3e79d7d0603ef64ce0ed1365190 |
The extracted Help confirms the Browser's Select B and the operations program's Select Shift-D invocation, while the inspected program source and compiled menu establish the later exact command sets. Help is therefore one evidence class, not a substitute for implementation inspection.
Why the contributed btree system is not Statice storage
Open Genera media also registers a contributed CL-HTTP-adjacent system named btree, pretty name Binary Tree, version 34. Its three source modules define classes and mixins for balancing ordinary binary-tree objects and include graph commands and test code. The ten-file, 97,433-byte subtree including compiled files and journals has portable manifest SHA-256 1734ca18619218085f009f6bf24676c9868f921b051eb1ff332e1ba0c68b2855.
Statice does not declare this system as a dependency. Its package exports make-btree-index with the explicit description “Create a B* tree index,” and its own storage tree, scroll, and interface modules implement that index layer. Occurrences of Statice names in the contributed system's journal are merely the full loaded-system header recorded when a Binary Tree patch was made. The similarly named facilities therefore have this bounded relationship:
| Facility | Data structure | Product role |
|---|---|---|
| Statice internal index | page-backed B*-tree over persistent keys | database query/update access path |
contributed btree |
balanced binary-tree classes/mixins over Lisp objects | independent contributed library, later used near CL-HTTP material |
Bounded CADR and LM-3 comparison
The public MIT CADR System 46 source snapshot was checked at Git commit 8e978d7d1704096a63edd4386a3b8326a2e584af. A case-insensitive whole-tree search over 1,895 files found no exact Statice, DBFS, persistent object, B-tree, or B* tree term. The tree does contain its own local file system, file servers, directories, and ordinary in-world databases; those are not a Statice persistent-object product.
The LM-3 System 303 Fossil export was checked at check-in 4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91. Among 4,917 files, the exact bounded search found two versioned copies of one historical bug-board text, not a Statice implementation. That text embeds a 1987 Symbolics patch header whose loaded-system census includes Experimental Statice 30.0, DBFS 34.14, Statice-Index 6.0, Statice-Record 14.1, Statice-Model 27.48, Statice Documentation 1.0, DBFS-directory 9.8, and Statice-Utilities 2.5. It is useful contemporary evidence that Statice ran in the Symbolics development environment associated with the quoted patch, but it does not make Statice part of the LM-3 System 303 source tree.
This bounded result supports “no CADR/LM-3 counterpart found in the two pinned trees,” not the broader claim that no MIT Lisp Machine ever hosted related research or connected to a later Statice server.
Runtime load-state observation
The fresh Genera computer-use harness session d41-statice-20260718, generation 2, evaluated one read-only form in Dynamic Lisp Listener 1. It called only find-package, loaded-only sct:find-system-named, and find-symbol; it did not load a system, create a namespace object, enable a service, or touch DBFS storage.
All six probed packages were absent: STATICE, STATICE-MODEL, STATICE-INDEX, DBFS, DBFS-DIR, and UFS. All seven loaded-only system queries returned no: Statice, Statice-Runtime, Statice-Server, Statice-Browser, Statice-Documentation, DBFS-Utilities, and contributed BTREE. With no STATICE package, the STATICE-BROWSER program symbol was also absent. This proves the base world's load state, not absence from the licensed media and not failure of the products when deliberately loaded.
The session used the 54,804,480-byte Genera 8.5 world a8ee5e86cc7e322f7385af3e0cd579d7650d4dcfc3ce328acbf8b25515dd0672, 1,533,760-byte VLM 9f5e18d5770f973879716182b6856ef5a8ee9d3b2bb907476ea0cf35986aa4c7, 346,880-byte debugger 2db918cfe8f35f52c7ff4b7695b0ecd3bb85e41a3327ea5a94874edf05edb54a, 15,248-byte ifconfig preload f45f45461622975996ab41138f64bb84a4b17c51fba0dbb649208914898c26b7, 21,280-byte X compatibility preload acd71dbcb948f05b7fd2730b2b4706c08f16f46d792bd9aa6aa64370e855e4b1, and configuration 5ce6509f5adf2cf2d054d34eb4ba777ce462285b8cd9b01bc071bf819139e086. The Bubblewrap mode isolated user, mount, network, PID, IPC, and hostname namespaces; exposed no host root, external route, or guest-visible host file service; and used an MIT-SHM-disabled private Xvfb whose absence was verified. Both pinned guest-X substitutions and the one-shot RFC 868 reply were observed.
The ordered action log contains two intent/outcome records and has SHA-256 88f1577aede328c7ee24028d3e7f39b5d11716fab32ecc0cb70750d6f7ae24a2. A local 1200 by 900 evidence capture showed the complete results; PNG SHA-256 is 875169201fe548ff9c0521e8f5c0342c9ac22ee36d57c6cab5fa0098310c6df3 and normalized pixel SHA-256 is 1c44a93f0afdce969207f11e4ac16f27ef49badeb1c43ac74fc74eb67c10e5a6. It remains in the ignored session tree because it shows only the probe, not a visible Statice application state worth publishing.
The private world hash remained identical to the base. The harness did not invoke Save World or create a process checkpoint. Shutdown reached its prompt, sent and accepted confirmation, and observed cleanup progress, then encountered the already characterized VLM cleanup stall and required bounded forced termination. forced_stop and state_may_be_incomplete are true; orderly_vlm_host_shutdown is false. No database or server had been opened, so the run supplies load-state evidence only.
Preservation and emulation implications
- A VLOD containing Statice code is not a Statice database backup. Preserve the DBFS store, recovery and directory metadata, page-size/server identity, and backup or dump path separately.
- A textual Dump Database is a logical reconstruction. It is preferable for cross-machine recovery, but it does not preserve byte layout, free pages, exact index shape, or the author's original schema source.
Show Database Schemais not a source-code decompiler. Its reconstruction omits documented source-level options, and later schema evolution can make it differ from the original declaration even when it is accurate about storage.- An exact database copy duplicates entity identities. Record the source and copy relationship and never use both as independent live databases without a verified identity-migration procedure.
- Preserve command/source/manual drift explicitly. The TCP-only later source, CLOS conversion,
Data Only,Find Backup Volumes, incomplete update warnings, and likely comment-copy mismatch should not be backported into a generic “Statice always behaved this way” account. - Keep recovered SABs, VBINs, Lisp source, database pages, dumps, and screenshots out of the tracked tree unless their rights are established independently. Short command labels and original functional analysis do not authorize distribution of the underlying licensed implementation or documentation.
- A future emulator validation should begin with a disposable test file system and schema, test commit/abort and crash recovery before schema update, and preserve every pre-operation disk/volume identity. Destructive maintenance commands must never be exercised against the purchased base media.
Open questions
- TODO: map system version 466 and documentation version 426 to an exact marketed Statice release, if surviving release media or patch records establish the relationship.
- TODO: safely load Statice into a disposable derived world, create a rights-clear test schema/database on disposable DBFS storage, and exercise the Browser and operations frame through the Xvfb harness.
- TODO: verify whether release 466 still imposes the documented Statice 2.1
for-each*limitations. - TODO: confirm at run time whether Browser conflict comparison omits non-indexable values and whether its count/fetch phase can visibly diverge under a concurrent commit.
- TODO: confirm the
:commentversus:copy-commentsource mismatch against the loaded command and copied properties in a disposable database. - TODO: establish the exact algorithm and supported contract of the source-absent fuzzy-backup modules; do not infer it from filenames.
- TODO: determine which backup device choices the preserved environment can actually configure without real tape hardware, and whether a file-backed, non-destructive test path exists.
- TODO: recover a complete compatibility matrix for 36xx and Ivory page, FEP-block, and backup formats from server source plus real media observations.
Sources
- Symbolics, Statice User's Guide, Statice 2.0 for Genera 8.0, document 999979; verified 2026-07-18.
- Symbolics, Release Notes for Statice 2.1, verified 2026-07-18.
- MIT CADR System 46 source snapshot, commit
8e978d7, bounded comparison verified 2026-07-18. - LM-3 System 303 Fossil export, check-in
4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91, bounded local comparison verified 2026-07-18. The Fossil restoration tree is used as a separate historical witness and is not treated as the System 46 source release. - Licensed Open Genera Statice media, 172-file local manifest identified above; source, binary, Help, and system-declaration inspection performed 2026-07-18.
Last verified: 2026-07-18.