Repository navigation
Releases: mdcrowley/actionstations
Releases · mdcrowley/actionstations
Release list
Action Stations 0.4.0
The first release since 0.1.0. It carries the 0.2.0 (review fixes), 0.3.0 (packs) and 0.4.0
(domain packs) milestones, which were not released separately. Highlights: the app is now
Action Stations; everything the app ships (templates, prompts, workflows, domain profiles,
reference documents and examples) is a pack, with 25 domain packs included and public-domain
library packs to download; nine example tabletops; an optional local-tools setup that installs
LM Studio, Ollama or ComfyUI only if you choose to; and a guided workflow from documents to
export.
Changed
Name
- The app is now called Action Stations everywhere (machine name
actionstations): package, installer names (actionstations-<version>-…), app idcom.mdcrowley.actionstations, settings folder (Action Stationsunder Application Support,%APPDATA%or~/.config), default projects folder (Documents/Action Stations), documents, and the repository (mdcrowley/actionstations). On the first launch after updating, the oldTabletop Generatorsettings and projects folders are moved to the new names (copied when a move is not possible; the old folder is kept if the copy fails) and recent projects are updated. API keys that cannot be unlocked under the new name (keys saved before the in-app rename in #191) are set aside and the Providers page asks for them once. New projects are<name>.asprojfolders;.ttxprojprojects open as before, and double-clicking either opens it in the app on macOS (ADR-0019) (#277).
License
- Licensed under the PolyForm Internal Use License 1.0.0 (
LICENSE.md), with commercial use, including consulting and facilitation for other organizations, reserved as described inCOMMERCIAL.md; contributions are accepted under a contributor license agreement (CLA.md) (#254). An additional permission (LICENSE-EDUCATION.md) lets schools, colleges and universities and their faculty, staff and students use, install and share it for teaching, coursework, research and student exercises (#279).
Guided workflow and plain language
- Internal: the largest renderer components outside the MSEL editor and inject deck (inject editor, its toolbar and actions, facility facts, facilitator mode, list editors, provider form, document editor, domain picker, brief, export, ideas and a few dialogs) are split into smaller parts and hooks; no behavior change (#203).
- Generated MSELs follow the reference pace (#223):
msel_phaseasks for about six rows an hour, at most seven (20–28 rows for a 4-hour exercise, scaled by phase length), side injects included; a newDENSITY_DENSEinfo lint notes a phase above that. - Project Overview opens on a "Get this exercise ready" checklist (documents → facility facts →
generate → injects → media → export / facilitate) with live state per step, one primary Next
button and the project's scenarios; project settings moved into a collapsed section below
that remembers whether it was open (#226). - Scenario page: a next-action bar ("Next: write 6 injects" → "Render media (0/6)" →
"Export / Facilitate") above the tabs; the status badge now reflects the work done (Draft,
Injects written, Media rendered, Ready) and lint errors keep a scenario from "Ready"; the
Injects tab shows how many injects are missing (#227). New setting (Settings → Generation, off
by default): write injects and render media automatically after generation (#227). - Warnings tab and MSEL lint use plain-language headlines per check, keep the code and the
checker's detail as secondary text, sort errors first and offer "Go to row" (opens the MSEL on
that row) or "Open inject". A glossary popover explains MSEL, inject, STARTEX / ENDEX, SimCell,
hot wash, time jump, PIO and lint where they first appear, plus a Glossary button on the
Overview and scenario page. The facility facts "Checked by lint" badge is no longer red, and
the Documents table hides the embedder model and chunk counts behind an Advanced detail (#229). - Scenario page: the Stages list and Generation log moved below the tabs into a collapsed
"Advanced information" section, which opens on its own while a generation runs (#189).
Navigation, onboarding and look
- Project sidebar grouped into Build (Overview, Documents, Facility facts, Generate, Scenarios, Facilitate) and a collapsible Advanced group (Search index, Prompt overrides, Provider routing) that remembers whether it is open; Providers now comes before Prompts, Templates and Workflows; project page titles match their nav labels; the sidebar fits a 1000 × 800 window (#230).
- One selection style in lists: selected items use a highlighter fill (no longer the error pink) with the accent bar, hover is a neutral tint, and the domain picker shows the current domain with a check (#236).
- Toasts appear at the bottom left of the content area so they never cover a primary action (#240).
- Projects with no projects yet: the empty state's primary button is New project; setup is the secondary action (#234).
- Facilitate: the header button is Open presentation or Close presentation depending on whether the presentation window is open (
facilitator:present-statusand thefacilitator:present-changedevent) (#235). - In-app branding is now Action Stations: logo in the sidebar, comic-panel theme (newsprint light, navy-ink dark, Bangers page titles, ink outlines and hard shadows), window, page and menu-bar titles renamed (the settings folder keeps its name); new app icon from the logo; closing the main window now quits the app on macOS too;
scripts/dev-bundle.shbuilds a renamed Electron bundle for unpackaged runs; macOS overscroll bounce disabled (#191).
Editors and saving
- Long MSELs and inject decks stay responsive (#201): committing a cell edit re-renders only
that row (about 1 of 304 rows instead of all of them on a 300-row MSEL; commit time measured
at ~2–4 ms instead of ~90 ms in the test harness), deck cards re-render only when their own
state changes, and lists of 150 or more rows or cards mount only what is near the viewport
(new renderer dependency@tanstack/react-virtual). Keyboard navigation, "Go to row", drag to
retime and screen-reader row positions (aria-rowindex/aria-rowcount) work the same. - The MSEL editor, its rows and cell editors, and the inject deck are split into smaller
components and hooks with no change in behavior (part of #203). - MSEL saves send the
updatedAtof the copy they were made from; main refuses a stale save with CONFLICT and the editor redoes it onto the newer scenario, so a save never overwrites fields written meanwhile by a job or another editor (#199). - MSEL grid: From/To columns are wider and narrow columns (From, To, Tag, Format) break only between words; row IDs and times never split. The Warnings list keeps its row ID / code column on one line (#237).
Background jobs and repair
- Query refreshes follow what changed (#198):
project:changedandjob:doneinvalidate only
the queries of that project, scenario and kind of data, at most once per 250 ms, instead of
every cached query on every save (a 100-inject run no longer re-reads every inject per save). - Background jobs are tracked in one store for the window (#197): export, import, index
rebuild and idea jobs reattach after navigating away and back, with progress and Cancel, and
the Export button stays disabled while that scenario's export runs.
Generation and checks
- Generated MSELs follow the reference pace (#223):
msel_phaseasks for about six rows an hour, at most seven (20–28 rows for a 4-hour exercise, scaled by phase length), side injects included; a newDENSITY_DENSEinfo lint notes a phase above that.
Documents and export
- Export page: the output folder defaults to
<project>/exports(created on the first export)
or the folder last chosen for that project; the folder, Export button and a readiness summary
(events without injects, unrendered injects, lint errors) sit in a pinned action bar (#238).
Templates
- Released content follows one naming rule. Simulated: the exercising organization and its
people, airlines (Skyline Air, HWK Air, Lakeshore and others, with their own flight codes),
private businesses (news outlets, the sports team and stadium in the phishing lure, regional
utilities, national consumer brands in the facility, cargo carriers, banks) and the street
addresses of real properties. Real: cities, counties, regions, geography and coordinates; city
and county government agencies as outside parties and responders (Akron Fire Department,
Summit County EMS), and airports run by local government as outside parties (a diversion to
Cleveland Hopkins); products and vendors (Cisco, Lenel, Palo Alto…), sector organizations
(WaterISAC, OHWARN, the Red Cross), federal and state agencies (the FBI Cleveland Field Office
included) and real threat groups. Users' own projects can use any names (#278, #283, #335). - Template schema examples and previews follow the rule (#278, #335); the shipped airport
example does too: North Coast International Airport, its people, airlines, regional utility,
concessions and cargo carriers are simulated, while its city (Akron), county (Summit County),
the Akron fire and police departments and Summit County EMA are real again (#335). Its street
address is simulated and kept off Cleveland Hopkins' address and ZIP. The affected inject
cards are re-rendered and the phone-call clip is re-voiced. The water and UAS examples use
fictional towns and are unchanged (#283, #335). examples/simulated-names.jsonis applied bymake-exampleto imported documents, seed
scenarios and seed documents, so rebuilding an example fromreference/stays simulated, and
scripts/simulate-names.mjsapplies it to files in place.tests/content/real-org-names.test.ts
checks templates, examples, prompts, domain profiles and t...