Most digital wargames bury their rules. A result appears and the player either trusts it or does not. Squad Leader Expeditionem takes the opposite position: every combat result, every morale check, every leadership modifier cites the rule number from the 4th edition text. The action log is a verifiable chain of reasoning, not a black box.
The project ships a rules core with no input or output. It receives a state and a command and returns a new state, the events with their rule IDs, and a hash. A game is its seed, its switches, and its command log. A replay reproduces the hash sequence or it is a defect. That separation makes the core testable independently of any display or network layer.
Four play modes: two humans at one screen (hot seat), two clients on one LAN with a room code, a human against a computer opponent, and two computer opponents in a headless tournament. The client is either a browser (TypeScript, Vite) or a desktop window built with pygame-ce on Windows and Unix.
Boards come from a procedural generator that draws terrain as shapes on the ground rather than colored hexagons. A wood is a mass of crowns. A building is the plan of a structure that can cover more than one hex. A road is a ribbon that turns. A hill is a flat brown area with a crest line where the level changes. Each generated board image is reproduced by tests from a manifest seed, and a scan that gets into the image directory stops a test.
“Every combat result cites the rule number. The action log is a verifiable chain of reasoning, not a black box.”
— Project README
Redact the transcript and the context still leaks. Summarize it with an LLM and the result is unauditable. Encode it as embeddings and vec2text recovers 92% of inputs exactly. Transcript2Symbol_AI exists because all three obvious alternatives fail for the same reason: prose preserves residual semantic associations that an adversary can infer from, regardless of whether the identifiers themselves were removed.
The instrument reads speaker-labelled text transcripts of conversations with older adults and rewrites them into a closed, typed ASCII frame language. One frame line looks like: F5 = REQUEST(S3, TRANSFER(agent=S1, theme=C_GIFT_CARD, recipient=S3), t=FUT, asp=PERF, mod=FULL, pol=POS) @T9 ~0.90 !SG. Role fillers are closed-vocabulary tokens only. No free string can appear. That makes “no free text got out” a testable property.
The pipeline runs in three stages on the local machine: detect and redact PII (medical, financial, identity, third-party) using Presidio, project patterns, lexicon, coreference, and GLiNER; symbolize the redacted text through a local CPU LLM constrained by a generated GBNF grammar; then validate with a semantic checker. A seven-vector consolidated research survey (164 cited sources, 7 independent research agents) grounded the design decisions before the first line of code. Raw transcript text never leaves the host.
The four families sit behind one interface. Scripted agents use named parameters and heuristic evaluation. Learned agents are neural networks trained from self-play reinforcement learning (PPO in raw torch on one GPU). Prompted model agents use local or SaaS language models that select from the legal command list, with the odds of each command included in the prompt. Tuned model agents are local language models fine-tuned on the game’s own traces via LoRA on one GPU. A multi-AI code review by Grok ran in parallel across all the code on September 23rd.
RatCatcher_AI, the Raspberry Pi 5 wildlife detection system now running dual cameras, dual microphones, a Hailo AI Hat+ NPU, and an e-paper status panel, received a targeted training refinement in September. The commit refines the YOLO training data specifically for detecting rats at night, where the infrared camera feed produces lower-contrast images that the daytime-trained model struggled with. The system now runs 27,599 lines of Python across 29 test files, with video detection at approximately 35 FPS on the PCIe-attached Hailo-8L and audio species identification via BirdNET running on a parallel thread.
Transcript2Symbol runs as five gated milestones, each of which can stop the project and report. M0 is the model decision: which local LLM, what size, what quantization. A pinned 30B symbolizer was selected from a Qwen3 ladder. M1 builds the corpus generator and gold labels. M2 runs the symbolizer on synthetic conversations and measures meaning preservation. M3 runs the adversarial attacker harness and measures leakage. M4 compares the symbolic output against baselines (redacted prose, summaries, embeddings). The findings report is due 2027-06-30. Non-negotiable invariants: raw text never leaves the host, v0.1 uses synthetic data only, symbolic output contains no free strings, thresholds freeze before the test split is touched, and model roles stay in separate families.
The board generator is its own engineering story. Each terrain type is rendered as a shape on the ground: woods as masses of tree crowns, buildings as architectural plans covering multiple hexes, roads as ribbons with curves, hills as flat brown areas with crest lines at elevation changes. The generator produces boards in the 1977 Avalon Hill look with new art from the 1977 counter values. A release audit reads a manifest of seeds and regenerates every image, comparing against the stored version. No scanned Avalon Hill art ships in the repository.
··· “Frustrating adversaries since the dial-up era” · GitHub: rondilley · 58 Repositories and Counting ···
The August stack asked “is this real?” at three layers (pixels, tokens, protocol). September’s projects ask the next question: once you know what something is, how do you represent it so a machine can reason about it and a human can audit the reasoning? Squad Leader Expeditionem answers it for wargame rules: every result is traceable to a rule number, every game is reproducible from its command log. Transcript2Symbol answers it for conversation: every utterance maps to a typed frame whose vocabulary is closed and whose privacy properties are machine-checkable. Both share a conviction that a system’s reasoning should be inspectable, not trusted.
Transcript2Symbol’s consolidated research survey is itself notable: seven independent research agents produced vector reports on PII detection, meaning representations, interlingua candidates, abstraction-privacy methods, leakage evaluation, elder-speech corpora, and local CPU LLM feasibility. The consolidation document (produced September 25th) cross-references 164 cited sources, flags 11 cross-report discrepancies, records what each agent could not open or verify, and preserves every secondary-source and unverified marker. One agent was OOM-killed mid-run; the consolidation reports what was lost.
September 4–5: VECTOR analysis refinement (filtered). September 8–9: Squad Leader Expeditionem initial commit and game engine. September 16–18: computer opponent development, board generator, map art. September 17: RatCatcher night training. September 23: multi-AI code review (Grok). September 25: Squad Leader rule alignment. September 25–26: Transcript2Symbol vision, requirements, architecture, research survey, and multi-AI reviews. September 30: Transcript2Symbol initial code import.
Transcript2Symbol’s symbolizer uses llama.cpp’s GBNF grammar constraint to force the local LLM to emit only syntactically valid frames. The grammar is generated from the inventory file, so when predicates or role fillers change, the grammar updates automatically. Grammar-constrained decoding guarantees syntax but not correct content: the LLM can produce a well-formed frame that misrepresents what was said. That distinction is why the semantic validator and the evaluation harness exist as separate stages.
A game is its seed, its switches, and its command log. The replay tool feeds the log back through the rules core and checks each state hash. If the hash sequence diverges, the replay halts and reports the point of divergence. This is the same principle as a chess PGN: the record is the moves, not the board states. The states are derived, and their correctness is verified by reproduction. Tournament mode runs two AI opponents headless and records the log for post-game analysis.
Transcript2Symbol enforces a hard boundary: every cloud API call passes through egress.gate(), which fails closed. Cloud models see only redacted text, symbolic output, or project documents—never raw transcripts. Cloud clients refuse the RawText type at the type level. The five cloud providers (Gemini, OpenAI, Grok, Mistral, and an unnamed fifth) run in separate model-family roles, declared in every report, so that no single provider’s failure mode can hide behind another’s output.