Skip to content

Releases: mdcrowley/actionstations

Action Stations 0.4.0

Choose a tag to compare

@mdcrowley mdcrowley released this 27 Oct 12:37

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 id com.mdcrowley.actionstations, settings folder (Action Stations under Application Support, %APPDATA% or ~/.config), default projects folder (Documents/Action Stations), documents, and the repository (mdcrowley/actionstations). On the first launch after updating, the old Tabletop Generator settings 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>.asproj folders; .ttxproj projects 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 in COMMERCIAL.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_phase asks 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 new DENSITY_DENSE info 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-status and the facilitator:present-changed event) (#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.sh builds 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 updatedAt of 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:changed and job:done invalidate 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_phase asks 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 new DENSITY_DENSE info 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.json is applied by make-example to imported documents, seed
    scenarios and seed documents, so rebuilding an example from reference/ stays simulated, and
    scripts/simulate-names.mjs applies it to files in place. tests/content/real-org-names.test.ts
    checks templates, examples, prompts, domain profiles and t...
Read more