<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Parlance releases</title>
  <link>https://orbitope.com/parlance-releases/releases/</link>
  <atom:link href="https://orbitope.com/parlance-releases/feed.xml" rel="self" type="application/rss+xml"/>
  <description>New Parlance releases — downloads and what changed in each version.</description>
  <language>en</language>
  <lastBuildDate>Mon, 28 Sep 2026 00:56:22 GMT</lastBuildDate>
  <item>
    <title>v0.16.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.16.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.16.0</guid>
    <pubDate>Sun, 27 Sep 2026 16:49:27 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="installing-on-linux">Installing on Linux</h3>
<p><strong>.deb</strong> (Debian, Ubuntu): <code>sudo apt install ./parlance-desktop_*.deb</code>.
On Ubuntu 23.10 and later the package installs a small AppArmor
profile so Chromium's sandbox can start; nothing else is needed.</p>
<p><strong>AppImage</strong>: <code>chmod +x Parlance-*.AppImage</code> and run it. On Ubuntu
23.10 and later an AppImage cannot use the sandbox (AppArmor blocks
it and an AppImage cannot carry a profile), so if it exits at once
with <em>&quot;The SUID sandbox helper binary was found, but is not
configured correctly&quot;</em>, start it with <code>--no-sandbox</code>, or use the
.deb instead. The AppImage also needs FUSE 2, which Ubuntu 22.04
and later no longer install by default: if it fails with
<em>&quot;dlopen(): error loading libfuse.so.2&quot;</em>, run
<code>sudo apt install libfuse2</code> (<code>libfuse2t64</code> on 24.04).</p>
<h3 id="something-not-right">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new">What's new</h2>
<p><strong>Parlance 0.16.0 — Edit while you play, a demo in the box, and a runtime you can ship</strong></p>
<p>Nothing in your project needs converting, and the file format is unchanged. A project
that passed the validator on 0.15.0 still passes, with one thing to check: the editor now
flags unknown or misspelled keys (<code>isend</code>, <code>showif</code>) that it used to ignore. CI already
rejected these, so you will only see them if you never ran the validator outside the
editor. There is also one new warning, described below.</p>
<p><strong>Editor</strong></p>
<ul>
<li><strong>Edit while Play runs.</strong> While a Play session is open, the right-hand column has two
tabs, <strong>Play</strong> and <strong>Edit</strong>, over one session. Click a node (or just switch to Edit) to
fix the line you're standing on. The session keeps your state and picks up the change,
and it now survives a switch to the Text view.</li>
<li><strong>Validation jumps to the exact spot.</strong> Clicking a problem lands on the node, the
choice, the quest stage or objective, the exit, the form field or the grid row, not
just the file. Flag, reputation and relationship warnings can now be clicked too, and
the Flow panel appears on factions, characters and items.</li>
<li><strong>Quest editing without JSON.</strong> Journal name and tags sit in the quest inspector.
Stages move earlier or later in play order. If a move changes what an existing
condition means, you get a warning first.</li>
<li><strong>Rename stage and outcome ids.</strong> Every reference is rewritten: conditions, quest
effects, routes, snapshots, localization keys, review threads and the canvas layout.
Same-named stages in other quests are left alone. The same rename works from
<code>parlance rename</code> and the MCP <code>rename_entity</code> tool.</li>
<li><strong>Outdated translations.</strong> Change an English line and its translations are marked
<strong>outdated</strong> on the coverage bar instead of passing as done. The locale template lists
what changed for the translator, and <strong>Mark current</strong> accepts a typo-level edit.
Existing catalogs report nothing new until a line changes.</li>
<li><strong>Explore models return visits.</strong> A scene you can go back to (an object you examine
again, an arrival scene, an exit's denial dialogue) is now revisited with the state you
built up elsewhere. Nodes that need that state no longer show as unreached. Find a path
here gets a budget control.</li>
<li><strong>Passive checks in Play.</strong> Play applies the passive-check reveal the way your game
would: an unrevealed passive choice is hidden, or greyed if it is set to show when
locked. An optional toggle lists what a higher skill would reveal. The Starting State
panel adds reputation, relationships and quest stages.</li>
<li><strong>New warning (<code>FLOW</code>): a node whose only choices are passive checks.</strong> A game that
hides unrevealed passive choices could show nothing clickable there, and the runtime
still holds back any fallback choice. Give the node one ordinary choice.</li>
<li><strong>Reorder choices</strong> with ↑/↓ in the node inspector (or Alt+↑/↓). <strong>+ Add condition /
effect / modifier</strong> no longer saves a blank entry and flashes an error while you fill it
in.</li>
<li><strong>Your typing is safe when a file changes underneath.</strong> If git, the MCP server or a
second window changes a file while you are mid-edit, the inspector fields and the Text
view keep your text and offer the file's version instead of replacing what you typed.
Two quick saves to one entity no longer produce a false &quot;changed on disk&quot;.</li>
<li><strong>The check odds bar</strong> now accounts for penalties and critical rolls, and shows the
range across modifiers.</li>
<li><strong>Drafts: Get review notes</strong> pulls the reviewer's comments into the draft you're in.
The verdict bar matches the verdict given and shows the writer's note. A re-sent draft
moves to &quot;Waiting for you&quot;.</li>
<li><strong>Stricter, sturdier validation.</strong> A file that is valid JSON but the wrong shape is
reported by name instead of emptying the sidebar or stopping the editor. Unknown keys
are flagged in the editor as they already were in CI. Dice past 100 dice or 1000 sides
are refused instead of freezing the inspector. A character with many equally ranked
offers gets ten tie warnings and a summary, not hundreds of thousands.</li>
</ul>
<p><strong>Desktop app</strong></p>
<ul>
<li><strong>The demo is in the box.</strong> <strong>File → Open the Demo</strong> (or the welcome screen) copies
<em>The Mistfall Inn</em> to <code>Documents/Parlance</code> the first time and opens your copy after
that. It never overwrites your edits.</li>
<li><strong>The MCP server ships with the app.</strong> <strong>Help → Connect an AI Agent…</strong> gives
ready-to-copy setup for Claude Code and other MCP clients, pointed at the open project.
No separate install is needed.</li>
<li>A hardening pass over saving, file locking, the file watcher, git and sign-in. Network
git operations time out instead of hanging, review sync no longer lets an older verdict
overwrite a newer one, and publishing always targets the repository's default branch.</li>
</ul>
<p><strong>CLI &amp; CI</strong></p>
<ul>
<li><strong>Pull-request annotations.</strong> <code>parlance ci-check</code>, <code>parlance route</code> and
<code>tooling/validate.py</code> take <code>--annotations github|none|auto</code>. Under GitHub Actions
(the default) each problem shows on the changed file and line of the PR. Exit codes do
not change.</li>
<li><strong><code>parlance init</code> never overwrites.</strong> It refuses an existing project or a non-empty
folder (exit 1) before writing anything; a usage mistake exits 2. <code>--force</code> allows a
non-empty folder but still keeps every existing file. The <code>first-conversation</code>
template now works from the npm package.</li>
<li><code>parlance explore --json</code> and <code>parlance witness --json</code> print only JSON on stdout.</li>
<li>A route's <code>advance</code> step is capped at 10,000 and stops as soon as it loops.</li>
<li>The MCP server refuses to write an entity that fails its own schema (<code>written: false</code>,
nothing on disk).</li>
</ul>
<p><strong>Runtime &amp; spec</strong></p>
<ul>
<li><strong><code>@orbitope/parlance-runtime</code></strong>, MIT, on npm. It is the same playback code the editor's
Play panel runs (conditions, effects, dialogue stepping, checks, offers, quests, dice),
with a loader and zero dependencies, and it passes every conformance vector. A
JavaScript or TypeScript game can install it instead of writing a port.</li>
<li>The schema and the runtime conformance vectors are unchanged, so <strong>a 0.15 runtime plays
every 0.16 project the same way.</strong> The reference runtime now reads state by own keys
only, so a flag named <code>constructor</code> behaves like any other. It lists codex entries in
plain id order.</li>
<li><strong>Validator ports</strong> owe the new passive-only <code>FLOW</code> warning, the dice bounds, the capped
<code>OFFER</code> tie report, ECMA-262 pattern anchoring and total reporting over malformed files.
Eighteen new validator conformance cases (129 in all) pin them. The Python reference
validator now rejects a custom-type row id that isn't lowercase snake_case, and an id
ending in a newline.</li>
<li>Locale files may carry <code>@sourceHashes</code> and <code>@outdated</code> entries. Engines loading
translations must skip keys that start with <code>@</code>.</li>
</ul>
<p><strong>Docs</strong></p>
<ul>
<li><code>INTEGRATION.md</code>: installing and loading with <code>@orbitope/parlance-runtime</code>, skipping
locale metadata, and an accurate account of what the Godot and Unity ports load.</li>
<li>The editor guide, cookbook and tooling READMEs were brought in line with the app, and
cover passive checks and fallbacks, the Play/Edit tabs, quest editing and outdated
translations.</li>
</ul>
<p><strong>Migrating a project, or maintaining a port?</strong> A project needs nothing beyond fixing
any <code>SCHEMA</code> or <code>RULES</code> error the validator now names. Runtime ports can move their pin.
Validator ports have a checklist. All three are covered in <a href="http://MIGRATIONS.md">MIGRATIONS.md</a> and the
published spec at <a href="http://github.com/Orbitope/parlance-spec">github.com/Orbitope/parlance-spec</a>.</p>
]]></description>
  </item>
  <item>
    <title>v0.15.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.15.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.15.0</guid>
    <pubDate>Sat, 26 Sep 2026 05:04:40 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-1">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-1">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="installing-on-linux-1">Installing on Linux</h3>
<p><strong>.deb</strong> (Debian, Ubuntu): <code>sudo apt install ./parlance-desktop_*.deb</code>.
On Ubuntu 23.10 and later the package installs a small AppArmor
profile so Chromium's sandbox can start; nothing else is needed.</p>
<p><strong>AppImage</strong>: <code>chmod +x Parlance-*.AppImage</code> and run it. On Ubuntu
23.10 and later an AppImage cannot use the sandbox (AppArmor blocks
it and an AppImage cannot carry a profile), so if it exits at once
with <em>&quot;The SUID sandbox helper binary was found, but is not
configured correctly&quot;</em>, start it with <code>--no-sandbox</code>, or use the
.deb instead. The AppImage also needs FUSE 2, which Ubuntu 22.04
and later no longer install by default: if it fails with
<em>&quot;dlopen(): error loading libfuse.so.2&quot;</em>, run
<code>sudo apt install libfuse2</code> (<code>libfuse2t64</code> on 24.04).</p>
<h3 id="something-not-right-1">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new-1">What's new</h2>
<p><strong>Parlance 0.15.0 — Richer choices, story-logic testing, and your own data types</strong></p>
<p>This release changes more than any before it. Nothing in your project needs converting:
every project that was valid on 0.14.0 opens, validates and plays exactly as before. The
new choice and node shapes are opt-in, and the editor now edits your custom game data too.</p>
<p><strong>New ways to write a choice</strong></p>
<ul>
<li><strong>Hide the line, keep the choices.</strong> A <code>showIf</code> on a node that has choices, or that
ends the dialogue, now hides only its line. The choices are still offered, and the
dialogue still ends. The validator used to reject both shapes.</li>
<li><strong>Nodes with choices and no line.</strong> A node can present its options on their own.</li>
<li><strong>Fallback choices.</strong> Mark a choice <code>fallback</code> and it appears only when none of the
node's other choices is available, so the player is never stuck. The &quot;may be stuck&quot;
warning goes away on nodes that have one.</li>
<li><strong>Locked choices.</strong> A choice whose condition fails can be shown greyed out instead of
hidden, with its own <code>lockedText</code> (&quot;Requires Persuasion 4&quot;). Set it per choice, or for
the whole project with <code>rules.choices.whenLockedDefault</code>. <code>lockedText</code> is localizable
and counted in word counts. It is never voiced.</li>
<li><strong>Tags on lines and choices.</strong> <code>node.tags</code> and <code>choice.tags</code> are passed through to your
game untouched, for camera cues, mood, analytics or anything else your engine reads.</li>
<li><strong>Engine commands.</strong> A new <code>engine</code> effect, <code>{ &quot;type&quot;: &quot;engine&quot;, &quot;command&quot;: &quot;shake_camera&quot;, &quot;args&quot;: [0.5] }</code>, hands a command to your game at that point in the
effect order without changing story state. Declare your commands in
<code>rules.engine.commands</code> and the validator checks names and argument counts (<code>ENGINE</code>).</li>
</ul>
<p>All of these work in the inspector, the canvas, the Text view (round-trip), Play, and the
shareable player.</p>
<p><strong>Story-logic testing</strong></p>
<ul>
<li><strong>Explore</strong> (Reports → Explore, or <code>parlance explore</code>) plays your story for you: seeded
random playthroughs, then an exhaustive pass that takes every choice and both outcomes
of every check. It reports unreached nodes and choices and real dead ends, and says when
it was cut short, so a node is never called unreachable just because the search stopped.</li>
<li><strong>Find a path here</strong> (node inspector, or <code>parlance witness</code>) finds a way to reach a
node. Keep it as a snapshot to start Play from, or as a route, offered once replaying
it has proved it reaches the node.</li>
<li><strong>Route coverage</strong> (<code>parlance route --coverage</code>, the Explore tab and the flow map) shows
which nodes your saved routes touch.</li>
<li><strong>Replay a route in Play.</strong> Load a saved route and step through it with the canvas
following. If a step no longer holds, replay stops and leaves you in a live session: carry
on by hand, then <strong>Update route</strong> or <strong>Save as new</strong>. <strong>Show on map</strong> marks the route's
scenes on the flow map.</li>
</ul>
<p><strong>Custom game data</strong></p>
<p>Declare your own entity types (drinks, suppliers, spells, loot tables) in the editor
with the sidebar <strong>+</strong>, and edit them in a spreadsheet-style grid: inline edit, sort,
<code>column:value</code> filters, copy and paste to and from Excel or Sheets, a picker for
reference fields, problems marked on each cell, and undo. It stays quick at 50,000 rows.
A <strong>Fields</strong> panel adds, retypes, renames and removes fields, carrying values with a
renamed field. Custom rows show up in search, review and draft diffs, the prose check's
canon names, and export (<code>parlance export --format csv|json --type &lt;id&gt;</code>). Agents get
four MCP tools for them. Both validators check the declarations in <code>data/types.json</code>.</p>
<p><strong>Rename an id everywhere</strong></p>
<p><strong>Rename id</strong> (entity view, the command palette, <code>parlance rename</code>, or the MCP
<code>rename_entity</code> tool) rewrites every reference to an entity's id: other entities,
localization and VO keys, bindings, test routes and snapshots, lore links, review threads
and canvas layout. You see every file it will change before it runs. If anything changes
on disk after the preview it refuses, and it never deletes the original until the new one
is written. Nested ids (nodes, choices, quest stages) and custom rows can't be renamed yet.</p>
<p><strong>Lore as linked documents</strong></p>
<p>A new <strong>Lore</strong> surface in the sidebar edits your <code>lore/</code> Markdown with live links:
<code>[Mara](parlance:character/mara)</code> links show up in find-usages, under &quot;Mentioned in lore&quot;
on the entity, and as a warning (never a block) when you delete it. The prose check flags
a dangling link and a plain entity name that could be linked. You can open review threads
on a lore paragraph. If the paragraph is later edited, the thread is marked moved or stale
instead of quietly pointing somewhere else.</p>
<p><strong>Also in this release</strong></p>
<ul>
<li><strong>Script export.</strong> A <code>.docx</code> screenplay or an <code>.xlsx</code> line sheet (speaker, loc key, VO
key, condition, check and effects per line) for one dialogue or the whole project, from
the canvas toolbar, Reports, or <code>parlance export --format docx|xlsx</code>.</li>
<li><strong>Placeholder voice lines.</strong> A voice row in the Play panel reads lines aloud through
your own text-to-speech provider (an OpenAI-compatible API or a local command), set up
under AI settings → Voice. Audio is cached outside <code>data/</code> and never counts as recorded VO.</li>
<li><strong>A better Text view.</strong> Syntax highlighting, a line gutter, find &amp; replace, and
autocomplete for ids.</li>
<li><strong>Reports.</strong> A Speakers tab (lines, words and voiceable lines per speaker, for casting and
VO budgets), a Flag flow view (search a flag and see everything that sets it and everything that reads it), and
codex-term mentions in the prose report (<code>CODEX_MENTION</code>).</li>
<li><strong>Asset bindings.</strong> An optional <code>data/bindings/*.json</code> maps portraits, VO lines and
cutscenes to engine asset paths per profile, and the reference validator warns (<code>BIND</code>)
on anything used but unbound, or bound but missing.</li>
<li><strong>Exclusive flag groups.</strong> List flags that must never be true together in
<code>rules.flag.exclusiveGroups</code>, and both validators flag an effect that sets two at once.</li>
<li><strong>Four new importers:</strong> SugarCube, ChoiceScript, Arcweave and Ren'Py, joining Yarn, Ink
and Twine/Harlowe. The existing importers now use the new choice shapes and lose far less
(the Yarn example: 101 declared losses down to 37), and Yarn commands such as
<code>&lt;&lt;shakeCamera 0.5&gt;&gt;</code> become engine commands.</li>
<li><strong>Files from Windows tools load.</strong> A JSON file saved with a byte-order mark (PowerShell
5.1, older Notepad) used to drop out of the project silently, and re-creating the
&quot;missing&quot; entity then overwrote it. Such files now load, an unparseable file is
reported as a problem instead of vanishing, and creating an entity refuses to write
over a file that failed to load.</li>
<li><strong>Accented lore file names</strong> match on every OS.</li>
</ul>
<p><strong>Desktop app fixes</strong></p>
<p>A five-round audit of the packaged app (not the dev build) fixed more than 40 bugs that only
showed up there. The ones you are most likely to have hit:</p>
<ul>
<li><strong>Share build</strong> saved nothing in every desktop release. It works now.</li>
<li>Quit and closing the window no longer discard unsaved edits, and Quit no longer stops
the host in the middle of a save.</li>
<li>New projects no longer all claim port 8000, so the app can't open another project's
window by mistake.</li>
<li>Review and Drafts now commit only the project's own folders. &quot;Send for review&quot; used to
push the whole repository, local files included.</li>
<li>Explore and Find a path here run with a time limit instead of freezing a large project.</li>
<li>A right-click menu, links that open in your browser, the system proxy honoured, launch
arguments and macOS &quot;Open With&quot; respected, and no downgrade offers from the update check.</li>
<li>Windows: no console window flashing on every git call, saves retry while antivirus or
OneDrive holds a file, and ids like <code>con</code> or <code>aux</code> are refused.</li>
<li>The &quot;First conversation&quot; template is back in the packaged app.</li>
</ul>
<p><strong>Writing your own runtime?</strong> 0.15.0 is a contract release. A 0.14 runtime can strand a
player on a 0.15 project (it skips a gated node that carries choices, and shows a fallback
choice beside the choices it was meant to replace), so ports must upgrade: return gated nodes with <code>textHidden</code>, apply the fallback
partition, return <code>lockedChoices</code>, throw from <code>chooseChoice</code> on a choice that isn't
selectable, pass tags through, and handle the <code>engine</code> effect. The full checklist and the
new conformance vectors are in <a href="http://MIGRATIONS.md">MIGRATIONS.md</a> and the published spec at
<a href="http://github.com/Orbitope/parlance-spec">github.com/Orbitope/parlance-spec</a>.</p>
]]></description>
  </item>
  <item>
    <title>v0.14.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.14.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.14.0</guid>
    <pubDate>Thu, 17 Sep 2026 22:02:11 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-2">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-2">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="something-not-right-2">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new-2">What's new</h2>
<p><strong>Parlance 0.14.0 — Dialogue offers, and conditional check modifiers</strong></p>
<p>The headline is a better way to decide which dialogue a character plays, with the
editor rebuilt around it — plus conditional bonuses on skill checks.</p>
<p><strong>Dialogue offers replace the character ladder</strong></p>
<p>A character no longer owns an ordered <code>dialogues</code> ladder. Instead, each dialogue
self-declares when it should play with an <code>offer</code> — <code>{ character?, when?, priority? }</code> — and the engine picks the best fit by <strong>priority tier, then how
specific the condition is, then id</strong>. Selection is now order-independent: a
dialogue carries its own eligibility the way a node carries its own <code>showIf</code>, so
&quot;most specific wins&quot; is the engine's job, not your sort order. The old ladder was
first-match-wins, so which scene played depended on list position, and a general
rung sitting above a specific one silently shadowed it forever — the most common
authoring bug this format had.</p>
<p>This is a breaking change, but migrating an existing project is one click or one
command:</p>
<ul>
<li><strong>In the editor:</strong> the project opens with a banner in the Validation panel —
click <strong>Convert ladders to offers</strong>.</li>
<li><strong>Terminal:</strong> <code>parlance migrate &lt;project&gt;</code> (add <code>--check</code> to preview first).</li>
</ul>
<p>The converter preserves exactly which dialogue won in every game state; the
<code>INVERSION</code>, <code>SHADOWED</code>, and <code>CONFLICT</code> notes it prints are the few spots worth a
glance.</p>
<p><strong>Conditional check modifiers</strong></p>
<p>A skill check can now carry <code>modifiers</code> — conditional bonuses that apply only when
their condition holds. An item, a relationship, or a completed quest can raise (or
lower) the odds on a check without you duplicating the check or faking a flag. A
check with no modifiers behaves exactly as before.</p>
<p><strong>Also in this release</strong></p>
<p>The editor was reworked to make offers legible at a glance:</p>
<ul>
<li><strong>Dialogue inspector, rebuilt for offers</strong> — see an offer's status without
deselecting the node, see where it ranks against the character's other offers,
and read a live resolution preview that shows which dialogue would win in the
current state.</li>
<li><strong>Clearer dialogue graph</strong> — character portraits now show as avatars on nodes,
with an always-on speaker chip so you can see who's talking without opening a
node.</li>
<li><strong>An author-facing walkthrough of dialogue offers</strong> in the editor guide.</li>
</ul>
<p><strong>Migrating a project, or writing your own runtime?</strong> The full migration recipes,
the detection commands, and the runtime port checklist (offers, check modifiers,
and the re-vendored conformance vectors) are in <a href="http://MIGRATIONS.md">MIGRATIONS.md</a> and the published
spec at <a href="http://github.com/Orbitope/parlance-spec">github.com/Orbitope/parlance-spec</a>.</p>
<p>macOS: a downloaded build is unsigned — clear the quarantine attribute with
<code>xattr -cr /Applications/Parlance.app</code> after installing if Gatekeeper blocks it.</p>
]]></description>
  </item>
  <item>
    <title>v0.13.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.13.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.13.0</guid>
    <pubDate>Wed, 02 Sep 2026 22:45:53 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-3">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-3">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="something-not-right-3">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new-3">What's new</h2>
<p><strong>Parlance 0.13.0 — Git-native collaboration (public beta)</strong></p>
<p>Writers and owners can now draft, review, and publish narrative end-to-end
inside the Parlance desktop app — against your studio's own GitHub, GitLab, or
Bitbucket repository. Parlance hosts nothing; your repo stays the source of truth.</p>
<p><strong>For writers — contribute with no terminal, no git</strong></p>
<ul>
<li>Sign in with GitHub (device flow) or paste a GitLab/Bitbucket token — no server, no pull request.</li>
<li>Open a project straight from a repository (clone-in-app); large media (Git LFS) is skipped so you don't download gigabytes you don't edit.</li>
<li>Work in Drafts, not branches: start a draft, &quot;Send for review&quot;, &quot;Send changes&quot; — you never see or name a branch.</li>
<li>Plain language throughout: any git error is shown as a sentence, with the raw detail tucked behind &quot;Details&quot;.</li>
</ul>
<p><strong>For owners — review and publish, git-free</strong></p>
<ul>
<li>A &quot;Reviews waiting for you&quot; inbox lists drafts by title and author — no branch names.</li>
<li>One-click <strong>Approve &amp; publish</strong> lands a review as a merge commit, computed refs-only, so your open files, checkout, and branch are never touched — whatever branch you're on.</li>
<li>An overlap that can't merge cleanly is refused in plain language, with every ref left intact.</li>
</ul>
<p><strong>Also in this release</strong></p>
<ul>
<li>Faster on big projects: validation runs incrementally on a worker thread so saves stay responsive; the editor patches its cache per-entity instead of refetching the whole project.</li>
<li>Command line + CI: <code>@orbitope/parlance-cli</code> (<code>ci-check</code>, <code>route</code>, <code>init</code>, <code>save import</code>) and a reusable GitHub Action gate your game's CI on the same validator the editor runs — see the CI-integration guide.</li>
<li>Starter templates so a new project isn't an empty folder, plus editor polish (dialogue-canvas edge repair, an Items pass, a smoother review surface).</li>
</ul>
<p><strong>Public beta — what to know</strong></p>
<ul>
<li>Each writer needs a host account and collaborator access to the repo; Parlance enforces nothing your host doesn't.</li>
<li>GitHub sign-in requires the studio owner to have installed the Parlance GitHub App on the repo; GitLab and Bitbucket need no app.</li>
<li>Import existing stories from Twine, Ink, or Yarn.</li>
</ul>
<p>No change to the narrative format or the published contract — a project valid on 0.12.0 is valid on 0.13.0.</p>
]]></description>
  </item>
  <item>
    <title>v0.12.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.12.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.12.0</guid>
    <pubDate>Wed, 26 Aug 2026 19:40:34 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-4">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-4">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="something-not-right-4">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new-4">What's new</h2>
<p>Durability. The ways the editor could lose your work, closed.</p>
<p>If you write a runtime: nothing here is for you. The contract did not move —
schema, conformance vectors and runtime semantics are byte-identical to v0.11.0,
and a port pinned there needs no action at all. This is an editor release.</p>
<p>What could go wrong before</p>
<p>Four of these were reachable in ordinary use, not in contrived conditions, and
each is now defended by a test AND by a mutant in the battery — if the code
changes and the battery still passes, the change did not do what it looks like.</p>
<p>Corruption. Every write now goes through one path, with a temp filename unique
per write. It used to be a fixed <target>.tmp, which meant two writers shared
one buffer and published a blend of both. The editor host and the MCP server
are separate processes on one project, so this needed no bad luck — just both
of them running, which is the documented setup.</p>
<p>Lost entities. The array registries — skills, variables, items, portraits —
rewrite the whole file to change one entry. Two concurrent saves silently
dropped whichever entity lost the race. Read-modify-write is now behind a
cross-process lock.</p>
<p>A crash that took the host down. validate() is total: malformed data reports
as an issue instead of throwing and killing the process the editor talks to.</p>
<p>A lock race. Absent is no longer read as stale, and stealing a lock verifies
identity before taking it.</p>
<p>Two smaller ones: the serializer no longer silently drops a <strong>proto</strong> key, and a
websocket broadcast survives one dead socket instead of failing the whole batch.</p>
<p>The desktop app</p>
<p>Quit on close, session restore — reopen and you are where you left off — and
real File, Edit, View and Window menus rather than the default Electron ones.</p>
<p>Underneath</p>
<p>The suite is now 1,649 tests, up from roughly 1,050, including a mutation
battery that runs in a worktree and in CI. Two CI failures found during this work
are worth naming, because both passed locally first: a depth-5000 condition test
that exhausted the runner's heap and silently took 29 other tests down with it,
and watcher tests that slept on a clock instead of waiting on an event, which
held on macOS and failed on a loaded two-core Linux runner.</p>
]]></description>
  </item>
  <item>
    <title>v0.11.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.11.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.11.0</guid>
    <pubDate>Wed, 26 Aug 2026 18:39:20 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-5">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-5">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<h3 id="something-not-right-5">Something not right?</h3>
<p>Parlance sends no telemetry and files no crash reports, so a
problem with this build is invisible until someone says so —
<a href="https://orbitope.com/parlance-releases/feedback/">report a bug or send feedback</a>.</p>
<hr>
<h2 id="whats-new-5">What's new</h2>
<p>Conditional narration, and the audits and importers go public.</p>
<p>If you write a runtime: read the first section. It is additive to the schema and
NOT safe to ignore.</p>
<p>Conditional narration — DialogueNode.showIf</p>
<p>A node can now carry the same condition type a choice already could. When the
condition fails the node is skipped: its text is not shown, its onEnter does NOT
fire — a skipped node did not happen — and resolution continues at <code>next</code>.</p>
<p>There was no way to write this before. A line of narration that should appear only
in some world states could not be a choice without fabricating a decision the
player never made, and a node advances by <code>next</code> to one fixed target. So the line
either always appeared or was not written.</p>
<p>The hazard runs the opposite way from the usual &quot;additive&quot; reading, and it is
worth stating plainly: a runtime pinned below v0.11.0, handed a project that USES
the field, will render conditionally-hidden narration unconditionally. No parse
error, no warning — silent wrong output. Do not treat this the way you treated
snapshot.visitedDialogueIds in 0.10.0.</p>
<p><a href="http://MIGRATIONS.md">MIGRATIONS.md</a> carries the exposure check: a script that tells you whether any
project you consume actually uses node-level showIf, which a grep for &quot;showIf&quot;
cannot answer because it hits every gated choice. No output means no exposure and
you can move the pin on your own schedule.</p>
<p>Implement resolveNode from RUNTIME_CONTRACT.md and route every arrival through it:
entry, next, a choice's goto, and a check's onSuccess/onFailure. Six new validator
conformance cases and the reworked advance/step_dialogue vectors pin the semantics,
including the cycle case.</p>
<p>The audits and the importers are now published, MIT</p>
<p>Two bundles that until now existed only inside the private repo:</p>
<p>audits/     five review-only editorial audits — dialogue ladder ordering,
character voice, character presence, quest journal, state
reachability. They read a project and report on it.
importers/  Yarn and Ink importers, with worked fixtures for each.</p>
<p>Both are in the MIT carve-out and both publish to parlance-spec alongside the
schema, because forking one for your own project is the entire point and a licence
that withholds that makes them useless.</p>
<p>One rule governs both, and it is enforced rather than promised: nothing in either
bundle writes prose. The audits report and never draft. The importers convert and
never paraphrase — every emitted string is checked against the source byte for
byte, and a paraphrase halts the import rather than being retried, because a
second pass cannot un-invent a line. Loss is declared, never silent: a migration
with three declared losses is a good outcome honestly reported, and one that came
out clean because the awkward lines were reworded is a failure wearing a success.</p>
<p>A prose check that knows your own names</p>
<p>Every check in the editor was structural — references, flow, reachability,
interpolation. None read the writing. The defect that accumulates in a long
project written by more than one person is not a broken goto; it is a proper noun
spelled three ways across two years.</p>
<p>The new check derives your project's proper nouns from data/ — characters,
factions, items, locations, skills, codex, endings, quest journal names — and
matches them case-sensitively. So &quot;Mistfal&quot; reports as a near-miss naming the
canonical form, and &quot;calloway&quot; reports as a name written lowercase. Neither is a
finding a general-purpose spell checker can produce, and neither needs a list you
maintain: rename a character and the check follows.</p>
<p>Three surfaces: a Prose tab in Reports, underlines inline as you type, and
<code>npm run prose -- --check</code> for CI. Words you add yourself live in
lore/dictionary.md — plain Markdown, so a writer can edit it without touching
JSON. English only for now; the locale seam is in place.</p>
<p>An optional AI pass sorts a first run's unknown words into names, jargon, dialect
and real typos, on your own API key. It only classifies words the deterministic
check already found: it never edits prose, never writes until you accept, and
never adds a typo to the dictionary. Everything else works offline and free.</p>
<p>It is deliberately not part of the contract. Spelling is editorial — it says
nothing about whether a project conforms to the format — so the reference
validator does not implement it, and it emits its own SPELL code that validation
never produces.</p>
<p>Smaller things</p>
<ul>
<li>The demo now uses node showIf, with routes covering the gate in both directions.</li>
<li>A pre-tag gate (tooling/scripts/release_check.py) checks that the version, the
docs and the published spec agree before a tag is cut. It found a partial
version bump on main on its first run.</li>
<li>Editor guide gains a section on the prose check.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>v0.10.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.10.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.10.0</guid>
    <pubDate>Tue, 25 Aug 2026 04:40:24 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-6">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-6">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<hr>
<h2 id="whats-new-6">What's new</h2>
<p>Performance at scale, and a hardened test suite.</p>
<p>Parlance is built for a 500k–1M-word game, but every project that exists is
three orders of magnitude smaller — so its behaviour at target size had been
reasoned about and never measured. This release measures it, fixes what the
measurements exposed, and closes a set of defects found by auditing the tests
themselves rather than the code.</p>
<p>Performance</p>
<ul>
<li>
<p>Validation no longer blocks a save. It ran synchronously on every write, and
because the pass covers the whole project its cost grows with the project. A
save now returns as soon as the bytes are on disk; fresh issues arrive over
the validation websocket a moment later, and rapid saves coalesce into one
pass instead of one each.</p>
<p>Server-side save latency, measured:</p>
<pre><code>110k words     223 ms  -&gt;  1 ms
1.02M words   2085 ms  -&gt;  1 ms
burst of 5 saves at 1M words   10.6 s  -&gt;  9 ms
</code></pre>
<p>At today's project sizes this is invisible — the largest real project saves
in about 32 ms either way. It matters because the cost is proportional to
project size, and the target is 100x larger.</p>
</li>
<li>
<p>Measured across eight project sizes from 2.7k to 2M words. Every core
operation is linear: validation holds at 1.31–1.44 microseconds per word
across a 46x size range, so there is no quadratic path waiting at scale.</p>
</li>
<li>
<p>A fixture generator (tooling/scripts/make_scale_fixture.py) inflates a real
project to any target word count while preserving its shape, so these numbers
can be reproduced and re-checked as the editor changes.</p>
</li>
</ul>
<p>Fixes</p>
<p>Found by auditing the test suite rather than reported — most were invisible in
normal use.</p>
<ul>
<li>Live reload could stop entirely on a project with no lore/ directory, so
validation-on-save quietly stopped with no error shown.</li>
<li>A save the server rejected could be dropped without surfacing anything, so
later edits were silently discarded while the canvas still showed them.</li>
<li>A reviewer's suggested rewrite could be lost when review threads merged.</li>
</ul>
<p>Plus smaller fixes to project opening, field editing, and the review panel.</p>
<p>Editor</p>
<ul>
<li>Import a save written by the game as a snapshot, keeping its visited set, so
a bug a playtester hit can be opened directly instead of reproduced by hand.</li>
<li>The location map is readable: proper edge routing and arrowheads instead of
crossed-over S-curves on every return exit.</li>
<li>Reviewers can open a dialogue via Play with the diff carried along, on a
branch they have not checked out.</li>
<li>The review branch and scene pickers are searchable, and matching handles
terms typed out of order rather than one contiguous string.</li>
<li>Reopening from the Dock on macOS, and a second launch opening the project it
was given.</li>
</ul>
<p>macOS and Windows builds are unsigned in this release; installation notes below.</p>
]]></description>
  </item>
  <item>
    <title>v0.9.0</title>
    <link>https://github.com/Orbitope/parlance-releases/releases/tag/v0.9.0</link>
    <guid isPermaLink="true">https://github.com/Orbitope/parlance-releases/releases/tag/v0.9.0</guid>
    <pubDate>Mon, 17 Aug 2026 06:10:36 GMT</pubDate>
    <description><![CDATA[<h3 id="installing-on-macos-7">Installing on macOS</h3>
<p>This build is <strong>unsigned</strong>. On first launch macOS may say
<em>&quot;Parlance is damaged and can't be opened.&quot;</em> — it isn't. That's just
Gatekeeper's warning for any unsigned app downloaded from the internet.</p>
<p>Drag <strong>Parlance</strong> to <code>/Applications</code>, then run once:</p>
<pre class="hljs"><code>xattr -cr /Applications/Parlance.app
</code></pre>
<p>After that it opens normally.</p>
<h3 id="installing-on-windows-7">Installing on Windows</h3>
<p>This build is <strong>unsigned</strong>, so SmartScreen may show <em>&quot;Windows
protected your PC.&quot;</em> Click <strong>More info → Run anyway</strong>.</p>
<hr>
<h2 id="whats-new-7">What's new</h2>
<p>The first public release of Parlance.</p>
<ul>
<li>A visual editor for the whole narrative layer: dialogue and quest canvases,
location maps, playtesting with seeded dice, and validation on every save</li>
<li>Share builds export any scene as a single self-contained HTML file that plays
in a browser, now carrying state across scene boundaries</li>
<li>The format spec, runtime contract, and conformance vectors are published
separately under MIT at <a href="http://github.com/Orbitope/parlance-spec">github.com/Orbitope/parlance-spec</a></li>
<li>Documentation at <a href="http://orbitope.com/parlance-releases/">orbitope.com/parlance-releases/</a></li>
</ul>
<p>macOS and Windows builds are unsigned in this release; installation notes below.</p>
]]></description>
  </item>
</channel>
</rss>
