W.O.P.R. // REAL-WOPR PROJECT
DECISIONS, NOT OPTIONS
One technology per module, each picked for a reason:
- Core engine — Fortran 90 via
gfortran. Hard requirement; the thesis depends on a period-authentic core. F90 over F77 for slightly more tractable I/O while remaining era-plausible (F90 standardized the language micros were already running dialects of). - Bridge — Python + FastAPI. Good async subprocess handling, clean Postgres (
asyncpg) and Anthropic SDKs, and the routing logic stays short. - Comms layer — its own Node/TS module over WebSocket. Keeping it separate from the bridge is the point: it is a wire, not application logic, and must be independently toggled and measured.
- Surfaces — Next.js apps sharing a CRT component library. Five front-ends, one shared CRT look.
- DB — Neon (plain Postgres). Forward-only migrations applied by
db/apply.sh; the bridge is the sole client, so identity and clearances live in bridge code (theWOPR_OPERATORSroster), not in the database. - Joshua — the Falken Dialogue Processor by default: a Common Lisp dialogue engine whose every technique was computable on 1983 hardware — the project's hardest problem, so it gets the front seat. A session can instead ask for the Claude API substitution (
?joshua=claude) or the 1983 scripted keyword engine; same persona, different reconstructions.
Rationale and period grounding for each module live in feasibility.md.
JOSHUA — THE FALKEN DIALOGUE PROCESSOR
Joshua has three engines; the period one is Common Lisp with anachronistic statistics — 1983-computable math, decades-early ideas.
| Layer | Status in 1983 | What it does here |
|---|---|---|
| Tokenizing + pronoun reflection | Period — ELIZA (Weizenbaum 1966) | Turns "MY plan" into "YOUR plan" in echoes |
| Affect variables shaping replies | Period — PARRY (Colby 1972, Lisp on a PDP-10) | OBSESSION rises each gameless turn → "SHALL WE PLAY A GAME?" pressure; Falken recognition beats |
| Naive-Bayes dialogue-act classifier | Anachronism — 1700s math, 1990s NLP practice | Routes input to GREETING / WAR / LEARNING / GAME-REQUEST… |
| Stop-word reject option on the classifier | Period — Chow's reject option (1970) and the SMART system's stop list (1971) both predate the film | A turn whose only known tokens are function words ("ARE YOU LONELY") is answered as OTHER instead of being forced onto an act. The right answer to a turn the machine can read is an act, not a reject: "IT IS RAINING HERE" and "I SHOULD BE DOING MY HOMEWORK" were rejects until the corpus grew small-talk acts for them |
| Data-driven topic/domain planner | Anachronism — rule-based expert-system practice was period; mixing it with statistical routing is the Falken fiction | Corpus tables keep NORAD, command authority, security, computing, and war replies grounded in the right databank slice |
| Content guards over the classifier's verdict | Period — the stop list again, used the other way round | An act with a guard stands only when the turn carries one of that act's content tokens (*act-guards*); the function words belong to the stop list, never to a guard, and the planner's rules read the turn alone so they cannot shadow a guard |
| TF-IDF cosine retrieval over a databank | Anachronism — Salton's vector-space model (1975) existed for document search; retrieval-augmented dialogue is a 2020s idea | Grounds replies in W.O.P.R.'s "knowledge databank" |
| Markov bigram generation | Anachronism — Shannon (1948) math, 1990s statistical NLP | Composes novel "musing" lines the corpus never contained |
| Variant selection with a memory of what was said | Period — a list filter over the HISTORY block, no new state | The variant LCG is seeded from the dialogue history but had no memory of its own output, so an act asked twice in one conversation could answer twice in the same words. unspoken-frames drops the variants already spoken before the pick, and falls back to the whole list once they all have been |
The math is all additions, multiplications, and logs over a few hundred numbers — a VAX-11/780 would not have noticed. What 1983 lacked was the concept of statistical dialogue and the training data; that gap is exactly the Falken fiction, and exactly why the feasibility verdict for open conversation (NO) stands unchanged.