@troylar/flightdeck 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  <!-- Generated by build.py from src/releases.json. Edit that file, not this one. -->
4
4
 
5
+ ## 2.2.0 · Oct 24, 2026
6
+
7
+ Practice a draft while you edit it.
8
+
9
+ ### New
10
+
11
+ - **Practice: run the draft on screen while you edit it, recording nothing** (Editing). Practice in the draft editor runs what's on screen: check steps, pass gates, try sample details, and keep editing. A step you change says Try it again; a gate whose steps changed asks for a pass again; the rest keeps your place. It has its own Undo, and offers Stage it for a test run at the end. It stays in this browser tab, is never written to the team folder, and never counts as a run. *Where:* The draft editor, Practice
12
+ - **Practice evidence, Fill in, values steps set, and Run from here** (Editing). Checking a step that asks for evidence opens its boxes under the step, checked as a run checks them, or Check without it. Fill in works as in a run. A value a step sets flows to the steps after it, and they ask again if that step does. Run from here starts partway: the steps before it are assumed, and it asks for the sample details it needs. *Where:* The draft editor, Practice
13
+
14
+ ## 2.1.1 · Oct 23, 2026
15
+
16
+ A planned run starts exactly once.
17
+
18
+ ### Improved
19
+
20
+ - **A plan that was started or declined can't be started again after someone edits it** (Plans). A decision on any version of a plan holds it: it shows "Decided on an earlier version of this plan" with who decided what and when, and it can't be started, declined or switched. To run it again, make a new plan. Decisions that disagree are flagged across every version. Needs 2.1.1 on every computer. *Where:* Runs, a plan's page; reading for other apps (status changed); the folder checker
21
+
22
+ ### Fixed
23
+
24
+ - **A start that couldn't save its run can only be saved again, never started twice** (Plans). A start marks the plan started, naming its run, then saves the run. If the run doesn't save, that window offers Try again, which saves exactly that run, and only for the same person in the same folder. Each plan keeps its own Try again. Other windows see the plan started and its run missing in Folder health, even after an edit, and nothing starts it again. *Where:* A plan's start form; Folder health
25
+ - **A switch to another version is kept when the plan is then started** (Plans). A start or decline is written to its own file, <plan>.status-<window>-d.json, beside the switch. Flightdeck 2.1.0 reads it as before. *Where:* proposals/
26
+ - **A decision file that can't be used holds its plan everywhere** (Plans). Any file named for a decision on a plan (<plan>.status-…) that can't be read, was made by a newer Flightdeck, or isn't in its format holds that plan: it can't be started, declined or switched until the file reads, or is fixed or deleted. Reading for other apps says so in a new held field, and the folder checker agrees with the app. *Where:* A plan's page; Folder health; reading for other apps (held); the folder checker
27
+ - **The folder checker matches the app on plans** (Plans). It reads plan decisions, copies of a plan, file names in proposals/ and format names as the app does, so what your AI assistant reports about a plan matches what Flightdeck shows. *Where:* The folder checker
28
+ - **Folder health doesn't call a damaged file newer** (Files). Folder health names it on its own, says why it can't be read, and says to fix or delete it, as a plan's page does. *Where:* Folder health
29
+ - **A file in proposals/ that can't be read and names no plan is named** (Plans). Folder health names it on its own: its name doesn't say which plan it's for, so if it's a decision, that plan could be started again while it can't be read. Restore it from a backup, or delete it if it's a stray copy. *Where:* Folder health
30
+ - **A note that couldn't be read is named, not dropped without a word** (Runs). The run page and Folder health name the notes file and the line that couldn't be read. It may still be arriving; once it reads, the warning goes. The other notes show as usual. *Where:* The run page; Folder health
31
+
5
32
  ## 2.1.0 · Oct 22, 2026
6
33
 
7
34
  Steps and phases that only some runs need.
package/README.md CHANGED
@@ -570,7 +570,7 @@ A process is one page, with its checklist in the middle.
570
570
  | **See its shape** | **Flight plan**: phases as waypoints, gates as checkpoints, tracks as parallel lanes, linked processes as connecting flights. From that version's runs and skills it adds typical times, autopilot (steps skills cover) and turbulence (steps that go off-script most). Each phase's steps open under it, or all at once with **Show all steps** and **Hide all steps**. Choose a phase to jump to it. |
571
571
  | **Edit it** | **Edit** opens the draft on a page of its own, with the **Builder** or the **Markdown** beside a live check (what blocks publishing, and what's just a tip) and a preview. |
572
572
  | **Look back** | The Versions panel shows the newest, with every version under **All versions**. An older version shows a way back to the current one and **Restore as draft**. |
573
- | **Try it first** | Under **All versions**, **Stage the draft for testing**, then **Start a test run** on the staged line. Real runs stay on the current default until someone chooses **Make v3 the default**. See [Staging and test runs](#staging-and-test-runs). |
573
+ | **Try it first** | **Practice** in the editor runs the draft as you edit it, recording nothing. Then, under **All versions**, **Stage the draft for testing**, then **Start a test run** on the staged line. Real runs stay on the current default until someone chooses **Make v3 the default**. See [Staging and test runs](#staging-and-test-runs). |
574
574
  | **See how runs go** | **How runs go**: typical time per phase, the steps that go off-script most, and who has held each role. |
575
575
  | **Plan ahead** | **Plan a run**, next to **Start a run**: a name, the details you know, who does what and an optional time. |
576
576
 
@@ -599,6 +599,10 @@ A process is one page, with its checklist in the middle.
599
599
 
600
600
  **New process** on the Processes page asks for a title; the file name is made from it and shown before you create it. The group, tags, run details, roles, owner and file name are under **More options**. Start blank, from Code check-in or Weekly review (publish v1 as it is, or open it in the editor), or copy a prompt for your AI assistant.
601
601
 
602
+ ### Practice while you edit
603
+
604
+ **Practice** in the draft editor runs what's on screen without recording anything: check steps, pass gates, give run details sample values, and keep editing as you go. A step you change shows **Try it again**; a gate whose steps or details changed asks to be passed again. Evidence opens under the step as it would in a run (or **Check without it**), **Fill in** works as in a run, a step's `sets:` value flows to the steps after it, and **Run from here** starts partway, assuming the steps before it and asking for the sample details it needs. It's kept in this browser tab only, never written to the team folder, and never counted as a run. Links and commands you follow still act on real systems. When you get through the whole checklist, **Stage it for a test run**. See docs/design.md, section 34.
605
+
602
606
  ### Staging and test runs
603
607
 
604
608
  A stage is a safe rehearsal: the next version, tried by test runs, while every real run stays on the current default.
@@ -933,6 +937,8 @@ Moving from 2.0 to 2.1: put 2.1 in the team folder and have everyone reopen it b
933
937
 
934
938
  **Known issue:** an older copy shows a test run by name only and never changes it, but counts it in Home's running number, and How runs go and Compare versions list its stage as one more version (marked Clash once that stage is made the default). Updating to 2.1 fixes both.
935
939
 
940
+ **Fixed in 2.1.1:** 2.1.0 could start a planned run twice when the run saved but its decision couldn't be written (a retry started a second run), or when the copy of the plan that was started was deleted while another copy remained. 2.1.1 closes both once every computer has it; a 2.1.0 copy can still start a plan that was edited after someone started or declined it. If a plan already has two runs, keep one and cancel the other. **Known issue:** two computers starting the same plan at the same moment can both start it (Runs shows the decisions disagreeing; keep one run), and a renamed plan decision that can't be read holds no plan until it reads (Folder health names it). [Updating Flightdeck](https://github.com/troylar/flightdeck/blob/main/docs/updating.md#what-to-know-when-moving-to-21) has the details.
941
+
936
942
  </details>
937
943
 
938
944
  <details>
package/bin/flightdeck.js CHANGED
@@ -865,7 +865,7 @@ async function readData(eng, adapter, req) {
865
865
  /* Which version a plan starts on is unknown (null), not missing, when any of its process's versions couldn't be read or
866
866
  verified: only problems with the versions themselves count (a run that doesn't match its version is named at the run). */
867
867
  const probs = ledger(), unsure = (proc) => probs.some((x) => ['', 'publications', 'publications/'].indexOf(x.path) >= 0 || x.path === 'publications/' + proc || x.path.indexOf('publications/' + proc + '/') === 0);
868
- return done(all, two ? A.runs2(list, plans, nameOf, d.processes, unsure, leftOut) : A.runs(list, plans, nameOf, d.processes, unsure), d.readAt);
868
+ return done(all, two ? A.runs2(list, plans, nameOf, d.processes, unsure, leftOut, d) : A.runs(list, plans, nameOf, d.processes, unsure, d), d.readAt);
869
869
  }
870
870
  /* followups: every run's follow-ups come from its run.json, so any run that couldn't be read may hide some. */
871
871
  const items = F.list(runs.filter((r) => !req.proc || r.process === req.proc), d.fuDecisions).filter((x) => req.status !== 'open' || F.isOpen(x));