tickmarkr 2.0.0 → 2.1.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.
@@ -3,12 +3,21 @@ import { Box, render, Text, useApp, useInput } from "ink";
3
3
  import { useRef, useState } from "react";
4
4
  import { ToggleMark } from "./components.js";
5
5
  import { clip, INK, inkInput, inkOutput, KeyBar, padCell, Pointer } from "./frame.js";
6
- const DRIVERS = ["auto", "herdr", "subprocess"];
6
+ const DRIVERS = ["auto", "herdr", "subprocess", "orca"];
7
+ // One line per driver, shown for the value currently selected: four environments no longer fit on
8
+ // a single description row at 80 columns (the shipped three already clipped), and orca is an
9
+ // EXPLICIT choice — `auto` still means herdr-else-subprocess and never reaches for it.
10
+ const DRIVER_DESC = {
11
+ auto: "auto: herdr when HERDR_ENV=1, else subprocess — never orca",
12
+ herdr: "herdr: every worker runs in a visible pane you can watch and unblock",
13
+ subprocess: "subprocess: headless child processes — no cockpit, same fail-closed gates",
14
+ orca: "orca: visible terminals in the Orca app — an explicit choice, never auto's",
15
+ };
7
16
  const VISIBILITY = ["pane", "headless"];
8
17
  // Three fields, one toggle, one action — a descriptor array, deliberately not a forms framework.
9
- function buildRows(offerSkills) {
18
+ function buildRows(offerSkills, driver) {
10
19
  const rows = [
11
- { id: "driver", section: "Run", label: "Driver", desc: "auto: herdr when HERDR_ENV=1, else subprocess · herdr: visible panes · subprocess: headless child processes" },
20
+ { id: "driver", section: "Run", label: "Driver", desc: DRIVER_DESC[driver] },
12
21
  { id: "concurrency", section: "Run", label: "Concurrency", desc: "parallel task batteries per run — min 1; an empty or zero entry reverts on leave" },
13
22
  {
14
23
  id: "visibility",
@@ -36,7 +45,6 @@ function buildRows(offerSkills) {
36
45
  }
37
46
  export function InitWizardApp({ fields, frameColumns = 74 }) {
38
47
  const { exit } = useApp();
39
- const rows = buildRows(fields.offerSkills);
40
48
  const [cursor, setCursor] = useState(0);
41
49
  const cursorRef = useRef(0);
42
50
  const driverRef = useRef(fields.driver);
@@ -47,6 +55,8 @@ export function InitWizardApp({ fields, frameColumns = 74 }) {
47
55
  const lastValidConcurrencyRef = useRef(fields.concurrency);
48
56
  const typedRef = useRef(false);
49
57
  const doneRef = useRef(false);
58
+ // Built per render so the description row follows the driver the cursor last cycled to.
59
+ const rows = buildRows(fields.offerSkills, driverRef.current);
50
60
  const [, setRevision] = useState(0);
51
61
  const bump = () => setRevision((n) => n + 1);
52
62
  // Leaving the row (or pressing Enter on it) is the commit point: a parse ≥ 1 becomes the new
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tickmarkr",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Spec in, verified work out.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,6 +35,10 @@ through brief lineage. **An executor choice nobody made is still an executor cho
35
35
  status, and either ADOPT the
36
36
  existing orchestrator (updated brief, re-armed watchers) or, if the old hierarchy is dead, archive the
37
37
  stale brief and build fresh.
38
+ **An adopted seat ANNOUNCES itself, in the same act as re-arming:** tell the adopted orchestrator the
39
+ fresh seat is live (verified send: probe token + read-back). Through the gap its view of your tier read
40
+ STALE, and a tier that believes it is unsupervised escalates into a file nobody is reading. Earned
41
+ 2026-08-22: a fresh seat re-armed all four watchers and announced nothing until the operator asked.
38
42
  ⚠ **Adopting a hierarchy silently adopts its EXECUTOR CHOICE.** The P92→P98 GSD drift propagated
39
43
  exactly this way: each overseer read the prior brief, reproduced "the same two-leg pattern as the
40
44
  last three phases", and the unruled bypass of the engine became load-bearing through repetition.
@@ -240,6 +244,9 @@ is a lossy summary nobody trusts while a clean session re-oriented from disk-ver
240
244
  **Do the same for yourself before you are forced to**: write the handoff while your judgment is still
241
245
  good, not after. If your own context cannot be read by the watcher, say so to the operator and ask for the
242
246
  number — an unmeasured budget is not a small budget.
247
+ **Every handoff's re-arm list ends with the announce step from Setup 0** — inform the surviving
248
+ orchestrator the fresh seat is live — or the next seat re-arms silently beside a tier that still
249
+ believes it is alone.
243
250
 
244
251
  ## Supervising GSD legs — when the mission dispatches `/gsd:*` instead of `tickmarkr run`
245
252