@zerwiz/ymir 0.1.25 → 0.1.26

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.
Files changed (106) hide show
  1. package/.agents/bus/messages.json +1 -0
  2. package/.agents/config/agents.machine.example.yaml +16 -0
  3. package/.agents/config/app-repos.yaml +38 -0
  4. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +72 -1
  5. package/.pi/mcp.json +2 -2
  6. package/CHANGELOG.md +42 -2
  7. package/README.md +39 -23
  8. package/assets/reference/state/.branch-eligible-owner +4 -0
  9. package/assets/reference/state/.branch-mirror-cursor +1 -0
  10. package/assets/reference/state/.branch-outcomes-cursor +1 -0
  11. package/assets/reference/state/.branch-session +1 -0
  12. package/assets/reference/state/.count-default_wF_p5 +1 -0
  13. package/assets/reference/state/.count-default_wF_p6 +1 -0
  14. package/assets/reference/state/.count-default_wR_p2 +1 -0
  15. package/assets/reference/state/.count-default_wS_p2 +1 -0
  16. package/assets/reference/state/.count-firstmate_fm-server-knowledge +1 -0
  17. package/assets/reference/state/.hash-default_wF_p5 +1 -0
  18. package/assets/reference/state/.hash-default_wF_p6 +1 -0
  19. package/assets/reference/state/.hash-default_wR_p2 +1 -0
  20. package/assets/reference/state/.hash-default_wS_p2 +1 -0
  21. package/assets/reference/state/.hash-firstmate_fm-server-knowledge +1 -0
  22. package/assets/reference/state/.heartbeat-streak +1 -0
  23. package/assets/reference/state/.inactive-outcome-reconcile +2 -0
  24. package/assets/reference/state/.lock +1 -0
  25. package/assets/reference/state/.pi-branch-extension-loaded +1 -0
  26. package/assets/reference/state/.pi-turnend-extension-loaded +2 -0
  27. package/assets/reference/state/.pi-watch-extension-loaded +2 -0
  28. package/assets/reference/state/.seen-server-knowledge_turn-ended +1 -0
  29. package/assets/reference/state/.session-start-agents-baseline +2 -0
  30. package/assets/reference/state/.session-start-complete +1 -0
  31. package/assets/reference/state/.stale-default_wF_p5 +1 -0
  32. package/assets/reference/state/.stale-default_wR_p2 +1 -0
  33. package/assets/reference/state/.stale-firstmate_fm-server-knowledge +1 -0
  34. package/assets/reference/state/.stale-since-default_wF_p5 +1 -0
  35. package/assets/reference/state/.stale-since-default_wR_p2 +1 -0
  36. package/assets/reference/state/.stale-since-firstmate_fm-server-knowledge +1 -0
  37. package/assets/reference/state/.startup-network.delivered +1 -0
  38. package/assets/reference/state/.startup-network.report +1 -0
  39. package/assets/reference/state/.startup-network.status +10 -0
  40. package/assets/reference/state/.startup-network.timings +6 -0
  41. package/assets/reference/state/.trace-context-effective +1 -0
  42. package/assets/reference/state/.wake-queue.seq +1 -0
  43. package/assets/reference/state/.wake-rows.consume.tR2rTy +0 -0
  44. package/assets/reference/state/.watch-arm-output.3581p6 +0 -0
  45. package/assets/reference/state/.watch-arm-output.3ciDNP +0 -0
  46. package/assets/reference/state/.watch-arm-output.SksR6k +0 -0
  47. package/assets/reference/state/.watch-cycle-exits.log +22 -0
  48. package/assets/reference/state/.watch-deliveries.log +19 -0
  49. package/assets/reference/state/.watch-triage.log +38 -0
  50. package/assets/reference/state/.watch.lock/fm-home +1 -0
  51. package/assets/reference/state/.watch.lock/pid +1 -0
  52. package/assets/reference/state/.watch.lock/pid-identity +1 -0
  53. package/assets/reference/state/.watch.lock/watcher-path +1 -0
  54. package/assets/reference/state/.watch.lock.owner.qqbxmS/fm-home +1 -0
  55. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid +1 -0
  56. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid-identity +1 -0
  57. package/assets/reference/state/.watch.lock.owner.qqbxmS/watcher-path +1 -0
  58. package/assets/reference/state/.watcher-down +1 -0
  59. package/assets/reference/state/branch-outcomes.jsonl +1 -0
  60. package/assets/reference/state/branch-session/2026-09-04T16-49-38-671Z_01a06d53-6b6f-7619-930d-e6dfd9a4a29e.jsonl +211 -0
  61. package/assets/reference/state/home-summary.json +42 -0
  62. package/assets/reference/state/server-knowledge.busy-gen +1 -0
  63. package/assets/reference/state/server-knowledge.busy-state +1 -0
  64. package/assets/reference/state/server-knowledge.herdr-presentation +12 -0
  65. package/assets/reference/state/server-knowledge.meta +18 -0
  66. package/assets/reference/state/server-knowledge.pi-ext.ts +26 -0
  67. package/assets/reference/state/server-knowledge.turn-ended +0 -0
  68. package/bin/ymir-install.sh +6 -1
  69. package/package.json +2 -2
  70. package/scripts/electron.sh +1 -3
  71. package/scripts/start.sh +0 -9
  72. package/.agents/config/agents.yaml +0 -53
  73. package/.agents/config/tailscale-sync.yaml +0 -9
  74. package/.agents/config/wedge-alarm +0 -3
  75. package/.agents/state/.wake-queue.seq +0 -1
  76. package/.agents/state/.watcher-down +0 -1
  77. package/.agents/state/procevent-inbox/when-hall-button.1.adapter +0 -1
  78. package/.agents/state/procevent-inbox/when-hall-button.1.result +0 -8
  79. package/.agents/state/procevent-inbox/when-hall-button.2.adapter +0 -1
  80. package/.agents/state/procevent-inbox/when-hall-button.2.result +0 -5
  81. package/.agents/state/procevent-inbox/when-odrerir.1.adapter +0 -1
  82. package/.agents/state/procevent-inbox/when-odrerir.1.result +0 -8
  83. package/.agents/state/procevent-inbox/when-odrerir.2.adapter +0 -1
  84. package/.agents/state/procevent-inbox/when-odrerir.2.result +0 -5
  85. package/.agents/state/procevent-inbox/when-odrerir.3.adapter +0 -1
  86. package/.agents/state/procevent-inbox/when-odrerir.3.result +0 -5
  87. package/.agents/state/procevent-inbox/when-odrerir.4.adapter +0 -1
  88. package/.agents/state/procevent-inbox/when-odrerir.4.result +0 -8
  89. package/.agents/state/procevent-inbox/when-odrerir.5.adapter +0 -1
  90. package/.agents/state/procevent-inbox/when-odrerir.5.result +0 -8
  91. package/.agents/state/procevent-inbox/when-sessrumnir-cloth.1.adapter +0 -1
  92. package/.agents/state/procevent-inbox/when-sessrumnir-cloth.1.result +0 -8
  93. package/data/learnings.md +0 -33
  94. package/data/local-models.md +0 -34
  95. package/data/operator.md +0 -15
  96. package/data/projects.md +0 -28
  97. package/data/realm.md +0 -1
  98. /package/{.agents/state/.wake-queue → assets/reference/state/.last-check} +0 -0
  99. /package/{.agents/state/procevent-inbox/when-hall-button.1.handled → assets/reference/state/.last-heartbeat} +0 -0
  100. /package/{.agents/state/procevent-inbox/when-hall-button.2.handled → assets/reference/state/.last-watcher-beat} +0 -0
  101. /package/{.agents/state/procevent-inbox/when-odrerir.1.handled → assets/reference/state/.main-eligible-rows.tmp.Exxm82} +0 -0
  102. /package/{.agents/state/procevent-inbox/when-odrerir.2.handled → assets/reference/state/.main-eligible-rows.tmp.p2HMKo} +0 -0
  103. /package/{.agents/state/procevent-inbox/when-odrerir.3.handled → assets/reference/state/.wake-queue} +0 -0
  104. /package/{.agents/state/procevent-inbox/when-odrerir.4.handled → assets/reference/state/.wake-rows.consume.BcqXSq} +0 -0
  105. /package/{.agents/state/procevent-inbox/when-odrerir.5.handled → assets/reference/state/.wake-rows.consume.NDZZei} +0 -0
  106. /package/{.agents/state/procevent-inbox/when-sessrumnir-cloth.1.handled → assets/reference/state/.wake-rows.consume.VGkhYm} +0 -0
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,16 @@
1
+ # config/agents.<hostname>.yaml — a per-machine OVERLAY for the personal setup.
2
+ #
3
+ # Copies next to config/agents.yaml and is deep-merged over it when the
4
+ # hostname matches (short form, before the first dot). Override the hostname
5
+ # with YMIR_AGENTS_MACHINE. Use it so each machine runs its own model/harness
6
+ # combination from one repo. Private (gitignored); this .example is the shape.
7
+
8
+ # Example: this machine's hnoss runs a bigger local model, and its default
9
+ # fallback differs.
10
+ # agents:
11
+ # hnoss: { model: "llama.cpp/qwen3.6-35b-q4_k_s" }
12
+ # brokk: { model: opencode-go/deepseek-v4.1-flash }
13
+ # providers:
14
+ # llama.cpp:
15
+ # base_url: "http://127.0.0.1:8080/v1"
16
+ # default_model: opencode-go/deepseek-v4.1-flash
@@ -0,0 +1,38 @@
1
+ # App repositories — PUBLIC map (the five surfaces)
2
+ #
3
+ # The fork path: a fresh clone has no private hoard (no
4
+ # `$YMIR_HOME/hodd/identity/projects.yaml`), so bin/ymir-install.sh's `apps`
5
+ # step falls back to THIS file to clone the five app repos. The hoard registry
6
+ # stays authoritative when present; this file is the fork's road.
7
+ #
8
+ # Block shape must match the installer's awk (repo: apps/<path> + git: dict).
9
+
10
+ - id: hlidskjalf
11
+ name: Hlidskjalf
12
+ repo: apps/hlidskjalf
13
+ posture: direct-PR
14
+ git: { host: github.com, owner: zerwiz, repo: hlidskjalf, remote: origin, default_branch: main, auth: gh }
15
+
16
+ - id: hlidskjalf-mobile
17
+ name: Hlidskjalf Mobile
18
+ repo: apps/hlidskjalf-mobile
19
+ posture: direct-PR
20
+ git: { host: github.com, owner: zerwiz, repo: hlidskjalf-mobile, remote: origin, default_branch: main, auth: gh }
21
+
22
+ - id: odrerir
23
+ name: Óðrerir
24
+ repo: apps/odrerir
25
+ posture: direct-PR
26
+ git: { host: github.com, owner: zerwiz, repo: odrerir, remote: origin, default_branch: main, auth: gh }
27
+
28
+ - id: sessrumnir
29
+ name: Sessrúmnir
30
+ repo: apps/sessrumnir
31
+ posture: direct-PR
32
+ git: { host: github.com, owner: zerwiz, repo: sessrumnir, remote: origin, default_branch: main, auth: gh }
33
+
34
+ - id: smidja
35
+ name: Smíðja factory
36
+ repo: apps/smidja-factory
37
+ posture: direct-PR
38
+ git: { host: github.com, owner: zerwiz, repo: smidja, remote: origin, default_branch: main, auth: gh }
@@ -83,7 +83,7 @@ the configuration you intend to keep.
83
83
  Always record **the context the run was measured at**. A decode figure without
84
84
  its context is not a measurement.
85
85
 
86
- ### The four traps that produce believable, useless numbers
86
+ ### The traps that produce believable, useless numbers
87
87
 
88
88
  | Trap | Reads as | Is |
89
89
  |---|---|---|
@@ -91,6 +91,9 @@ its context is not a measurement.
91
91
  | **Load is not run** | a model that loads, written down as working | it may die on the first real request |
92
92
  | **Context-blind comparison** | two runs "differing by config" | they also differed in context; attention cost tracks the context in use |
93
93
  | **Asserted > observed** | a tidy explanation for a slow run | the explanation was never tested against an alternative |
94
+ | **Anonymous load on unified memory** | a model that loads fine, and later "the machine crashed" | on a unified-memory host the GPU's memory **is** system RAM. An anonymous (non-`mmap`) load makes the weights unreclaimable, so under pressure the kernel OOM-kills **something else** — usually the desktop, not the model. Load file-backed. |
95
+ | **Backend chosen by reputation** | "ROCm is the AMD backend, so use ROCm" | on some iGPU targets a backend returns **silently wrong** logits — fast, plausible, incorrect. Backend choice is a measurement, not a default. |
96
+ | **Reasoning configured through the chat template** | a model that thinks forever, or degenerates, "because the model is weak" | the engine's **native** reasoning budget and the chat-template keyword are different mechanisms with different behaviour. Configure reasoning at the engine. |
94
97
 
95
98
  ### The fifth trap — model-host port drift
96
99
 
@@ -272,3 +275,71 @@ pi -p --model "llamacpp-igpu/qwen3.5-4b@q4_k_s" "Reply with exactly: IGPU OK"
272
275
  `--model` takes `provider/id`, matching the static entries in
273
276
  `.pi/agent/models.json` (§2). Screen the result by hand — a model that answers a
274
277
  question you did not ask has told you more than one that answers yours.
278
+
279
+ ## 11. Reasoning is a resource you must configure — not a feature you inherit
280
+
281
+ A reasoning model left to think without bound does not fail gracefully. It fails
282
+ **totally**: no answer at all, after minutes of device time. Three outcome classes
283
+ have been observed from the same model on the same request, differing *only* in how
284
+ reasoning was configured:
285
+
286
+ | Outcome | Shape |
287
+ |---|---|
288
+ | **Clean** | bounded reasoning, then a correct answer |
289
+ | **Degenerate** | reasoning collapses into repetition — plausible-looking, worthless |
290
+ | **Unterminated** | the model never leaves its reasoning; the response body is empty |
291
+
292
+ Three rules follow.
293
+
294
+ 1. **Prefer the engine's native reasoning-budget flag.** Where an engine exposes
295
+ both a native budget and a chat-template keyword, they are **not** the same
296
+ mechanism. One bounds the thought; the other can truncate it mid-flight and
297
+ derail the model. Use the native one.
298
+ 2. **A budget is a correctness control, not merely a cost control.** The clean
299
+ outcome above was *caused* by the budget. Without it the model is not slower —
300
+ it is **wrong, or silent**.
301
+ 3. **Read the output, not the counter.** A generation can report a healthy
302
+ tokens-per-second figure while emitting multilingual noise or a repetition
303
+ loop. Verify by reading the text.
304
+
305
+ **Test procedure.** Same prompt, three configurations — unbounded, budgeted,
306
+ and reasoning-off. Score what came back, not how fast it came. A model that is fast
307
+ and empty is not faster.
308
+
309
+ **For agents that need an answer, not a monologue:** when a harness reports an
310
+ empty completion or a repetition loop from a reasoning model, the first suspect is
311
+ the reasoning configuration, not the model's capability.
312
+
313
+ ## 12. A model service unit must never raise itself
314
+
315
+ A service unit that loads large weights must be started **by explicit hand**, never
316
+ by login. This is a systemd-and-quadlet lesson, not a vendor one.
317
+
318
+ - **`[Install] WantedBy=default.target` is the switch** — not the restart policy.
319
+ A unit carrying it is started when the target is reached, which for a user unit
320
+ means **every login**. `Restart=` says nothing about this.
321
+ - **Podman quadlet units are *generated* units**, and `systemctl --user disable`
322
+ is a **no-op** on them. So an autostart armed this way **cannot be turned off
323
+ afterwards** — not by `disable`, and not by any wrapper script that calls it.
324
+ Confirm by checking the unit's state (`generated`) before trusting a disable.
325
+ - **The fix is in the file, not the command line:** omit the `[Install]` section
326
+ entirely, then `daemon-reload`. Start the unit on demand.
327
+ - **Always cap the unit.** `MemoryMax=` (with `MemorySwapMax=0`, `OOMPolicy=stop`)
328
+ makes a bad load die **inside its own cgroup** instead of taking down the user
329
+ session — which is what happens when the kernel's global OOM killer picks the
330
+ victim.
331
+ - **`Restart=never` is not a valid systemd value.** The correct value is
332
+ `Restart=no`. An invalid value is silently ignored, which makes the
333
+ configuration a lie even when the effect happens to match the intent.
334
+
335
+ **Verification, not assumption.** After disarmament, list the generator's
336
+ `default.target.wants` directory and confirm the heavy units are **absent by name**.
337
+ A unit that still appears there can still raise itself.
338
+
339
+ ```bash
340
+ ls /run/user/1000/systemd/generator/default.target.wants/
341
+ ```
342
+
343
+ **Light infrastructure is a legitimate exception** — an embedding server that runs
344
+ on the CPU and cannot exhaust device memory may be allowed to start at login. Record
345
+ the exception and its reason beside the unit; an undocumented exception is drift.
package/.pi/mcp.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "mcpServers": {
3
3
  "engram": {
4
- "command": "/home/zerwizomar/.local/bin/engram-mcp",
4
+ "command": "/home/zerwiz/.local/bin/engram-mcp",
5
5
  "args": [
6
6
  "--db",
7
- "/home/zerwizomar/ymir/.agents/memory/kaia.engram"
7
+ "/home/zerwiz/Ymir/.agents/memory/kaia.engram"
8
8
  ]
9
9
  }
10
10
  },
package/CHANGELOG.md CHANGED
@@ -1,4 +1,46 @@
1
1
 
2
+ ## 2026-09-17 — "ymir: command not found" is a PATH fault, and here is the cure
3
+
4
+ - **The command is installed; the shell is not looking.** The published manifest carries `bin: {ymir, ymir-install}`, so the file is there — in npm's global bin directory, which an ordinary Linux install puts under `~/.npm-global` and a shell profile often never adds.
5
+ - **The README answers it where a stuck user looks**: `npm prefix -g`, the `ls` that proves the command exists, the one-line `export PATH`, and the `EACCES` cure that sets a prefix the user owns instead of reaching for `sudo`.
6
+
7
+ ## 2026-09-17 — the model that raised itself, and the workhorse that replaced it
8
+
9
+ - **A model raised itself at login and killed the session.** `qwen3-6-35b-a3b`
10
+ carried `[Install] WantedBy=default.target`, so systemd started it at
11
+ 12:36:33; with `--no-mmap` on a unified-memory APU the weights were
12
+ unreclaimable, memory and swap drained, and the kernel's global OOM killer took
13
+ `gnome-shell` — and the Ymir stack with it. `local-models.md` §4 gains
14
+ **three traps** from this (anonymous load on unified memory; backend chosen by
15
+ reputation rather than measurement; reasoning configured through the chat
16
+ template), and a new **§12** states the rule: a model service unit must never
17
+ raise itself.
18
+ - **`§11 — Reasoning is a resource you must configure`** is new. Unbounded
19
+ reasoning fails *totally* — no answer at all — not merely worse. The same model
20
+ on the same request produced clean, degenerate (repetition), or unterminated
21
+ output depending only on how reasoning was configured. Prefer the engine's
22
+ native budget flag; the chat-template keyword is a different mechanism.
23
+ - **Seated a new local workhorse** (a 176B-parameter MoE, Vulkan backend, MTP
24
+ speculative decoding, file-backed load). Measured before seating: prefill and
25
+ decode both at parity with the reference stack for this silicon. The per-host
26
+ record belongs in the hoard, not here — §6.
27
+ - **Ran a 32-run A/B on guidance during reasoning** (counsel at the moment of
28
+ failure vs counsel up front vs pause alone vs bare). Result: counsel delivered
29
+ *at the failure point* more than doubled rule-adherence over the pause-only
30
+ control and completed work that bare and up-front-counsel arms abandoned
31
+ entirely. Caveats, scoring traps, and the full table live in the private
32
+ record; the *generic* lesson — the artifact must be extracted, scoring must be
33
+ comment-aware, and the thought must be closed on resume — is recorded where the
34
+ product work lives.
35
+ - **Proposed, not applied:** a boot-cmdline correction to bring the TTM page pool
36
+ below system RAM (it is currently set *above* it, which the reference stack for
37
+ this silicon names as the cause of an unkillable driver deadlock). Needs root
38
+ and a reboot; runbook with rollback and post-reboot verification is in the hoard.
39
+
40
+ galdr-reread: `.agents/skills/galdr-ymirsystem/assets/local-models.md` — §4's
41
+ trap table grew from four to seven and its heading no longer claims a count;
42
+ **§11** (reasoning as a configured resource) and **§12** (a model unit must never
43
+ raise itself) are new sections.
2
44
 
3
45
  ## 2026-09-17 — the fork stands the machine
4
46
 
@@ -83,7 +125,6 @@
83
125
  - **The consent shows the plan again.** `--colour` renders on stderr and I had sent *both* streams to `/dev/null`, so the plan was invisible at the very moment it was being accepted.
84
126
  - **The seat can mend its own runtime**, and says why when it cannot — npm gates Electron postinstall, so a fresh install otherwise ends with a window that cannot open.
85
127
 
86
-
87
128
  ## 2026-09-17 — one well, in the hoard: every reader of Kaia's memory resolves the hoard store
88
129
 
89
130
  - **The memory is ONE store and it lives in the hoard** —
@@ -168,7 +209,6 @@ contract unchanged).
168
209
  old voice through the `0.1.8-alpha` pin.
169
210
  - **`@zerwiz/ymir@0.1.13`** is the packet that carries them.
170
211
 
171
-
172
212
  ## 2026-09-17 — 0.1.12: the icons reach the live tree, and a missing surface is a failure
173
213
 
174
214
  - **The launcher entries name the door** (`Exec=ymir hlidskjalf`, …) instead of an absolute path into whichever tree minted them — the fault that made every icon do nothing.
package/README.md CHANGED
@@ -14,22 +14,10 @@
14
14
 
15
15
  ![Ymir — the single-tenant agent OS](assets/ymir-banner-03.png)
16
16
 
17
- Before the worlds there was nothing but cold mist and embers of fire. From
18
- their meeting in the Void Ginnungagap came the first being: **Ymir**, the
19
- ancestor of everything. The gods slew him and made the world from his body.
20
-
21
- That is what this platform is. **Ymir is the substrate** — a single machine, a
22
- single repo — the primordial body from which every realm of work is carved.
23
- Every service, every tool this fleet ships is shaped from Ymir's frame and
24
- lives on it; nothing is painted onto Ymir, everything is cut *from* him.
25
-
26
- It is not lean. It is a single-operator agentic **distro**: a fleet of named
27
- agents (Brokk at the bellows, **Eindri** in sealed sandboxes), a memory well at
28
- the root, an audit ledger a rune cannot un-carve, one tenant and its
29
- workspaces, and a control plane you actually look at. You are the
30
- **Allfather**; every agent reports to Brokk; Brokk reports to you.
31
- Everything — development, marketing, business strategy, life — runs from one
32
- repository.
17
+ Ymir is a lean, single-operator agentic OS. You are the **Allfather**; **Brokk** is
18
+ your primary agent; **Eindri** are the isolated workers it dispatches. Everything
19
+ development, marketing, business strategy, life runs from one repository, with an
20
+ audit ledger, a memory well, one tenant and its workspaces, and a control plane you actually look at.
33
21
 
34
22
  ---
35
23
 
@@ -658,14 +646,14 @@ git clone https://github.com/zerwiz/ymir.git ~/Ymir && cd ~/Ymir && bin/ymir-ins
658
646
  npm install -g @zerwiz/ymir # the CLI, global
659
647
  ```
660
648
 
661
- **Who can install this today — everyone.** The distro is public; the four
662
- commands above are open, and the npm road is the smoothest: `npm i -g
663
- @zerwiz/ymir` stands the platform and its four surfaces (Hlidskjalf, Óðrerir,
664
- Sessrúmnir, Smíðja), and `ymir raise` lifts the hall. The ship is measured:
665
- the seat wears the cloth of the halls — stone and bone, bronze and blood —
666
- with no remnant of the fork it grew from.
649
+ **Who can install this today.** The Ymir distro is private while it is young —
650
+ so `curl`, `npx` and `git clone` work for the author and invited users, not for
651
+ the public (an unknown clone returns 404). If you would like access, ask:
652
+ **zerwiz.org**. When the distro opens, this note goes away and the four commands
653
+ above become open to everyone.
667
654
 
668
- **Install now.** The installer is honest about what it cannot do, and says so the installer is honest about what it cannot do, and says so rather
655
+ **Early adopters and contributors can install now but it is rough.** Expect
656
+ sharp edges: the installer is honest about what it cannot do, and says so rather
669
657
  than pretending. Bring a Linux host (or let the Windows/macOS bootstraps give
670
658
  you one — see *Bringing your own machine* above), and read what the installer
671
659
  prints before you trust it.
@@ -712,6 +700,34 @@ when the work will take a while, tells you plainly:
712
700
  Your patience is noted, and it is earned.
713
701
  ```
714
702
 
703
+ ### "`ymir`: command not found" — it is almost always PATH
704
+
705
+ The command is installed; npm puts it in a directory your shell may not look in.
706
+ The package declares it (`bin: {ymir, ymir-install}`), so this is not a missing
707
+ file — it is a missing path.
708
+
709
+ ```bash
710
+ npm prefix -g # where npm puts global packages (e.g. ~/.npm-global)
711
+ ls "$(npm prefix -g)/bin/ymir" # the command is there
712
+ export PATH="$(npm prefix -g)/bin:$PATH" # this session
713
+ echo 'export PATH="$(npm prefix -g)/bin:$PATH"' >> ~/.bashrc # every session after
714
+ ```
715
+
716
+ On macOS with Homebrew, npm's prefix is usually `/opt/homebrew` and already on
717
+ the path; on Linux a global install as an ordinary user lands under `~/.npm-global`
718
+ (or whatever `npm config get prefix` says), which is exactly the directory that is
719
+ easy to miss. Windows uses `%APPDATA%\npm`.
720
+
721
+ **And if the install itself is refused** — a `EACCES` on `/usr/lib/node_modules` —
722
+ do not reach for `sudo`: point npm at a prefix you own once, and every Ymir
723
+ install afterwards is painless.
724
+
725
+ ```bash
726
+ npm config set prefix "$HOME/.npm-global"
727
+ export PATH="$HOME/.npm-global/bin:$PATH"
728
+ npm install -g @zerwiz/ymir
729
+ ```
730
+
715
731
  ### The packages — what is on npm
716
732
 
717
733
  Six names were published; five serve. The distro **depends on the four
@@ -0,0 +1,4 @@
1
+ fm-branch-eligible-owner-v1
2
+ 1760629
3
+ linux-starttime=13963152 cmdline-hex=Usage:od[--port<n>][--host<addr>][--no-open]StartthelocaldaemonandopenthewebUI.odtoolslive-artifacts<create|list|update|refresh>[options]Manageliveartifactsthroughdaemonwrappercommands.odtoolsdirections[--id<id>|--label<label>][--json]Listthebuilt-indesigndirections,orprintonedirection'sfullpalette/fontstacks/posturespecforbindinginto:root.odartifactscreate--name<path>--input<file>[--project<id-or-name>]Createanormalprojectartifactthroughthelocaldaemon.odtoolsconnectors<list|execute|github-design-context>[options]Discoverandexecuteconfiguredconnectors.odtoolsdesign-systemsread--path<manifest-declared-path>Readactivedesign-systempull-layerfilesthroughdaemonwrappercommands.odmcplive-artifactsStarttheMCPserverexposinglive-artifactandconnectortools.odresearchsearch--query<text>[--max-sources5][--daemon-url<url>]Runagent-callableTavilyresearchthroughthelocaldaemon.odplugin<list|info|install|uninstall|apply|doctor|replay|trust>[args]Discover,install,andapplypluginsthroughthelocaldaemon.odpluginpublish-repo<folder>Create/updatetheauthor'sGitHubrepoforalocalpluginfolder.odpluginopen-design-pr<folder>Pushacommunity-catalogbranchandopentheOpenDesignPRform.odautomation<list|get|create|update|run|runs|pause|resume|delete>[args]DrivetheAutomationssurfaceheadlessly.SamestoreastheUI'sAutomationstab,soanexternalagent(hermes,openclaw,...)canschedule,trigger,orharvestresultsfromaroutinewithoutopeningthewebUI.odmessage-center<list|read|read-all>[args]Readandacknowledgemessage-centerinboxitemsthroughthesamedaemonendpointsthebellUIuses.odamr<login|status>[args]StartVelabrowsersign-inorinspectthecurrentVelaaccountthroughthelocalOpenDesigndaemon.odmemorytree<list|view|edit|move>[args]Inspectandeditthememorytreethatisinjectedintoagentprompts.odshare<open-design|url>[options]Buildlocalizedsocial-sharetargetsfortheOpenDesignrepooradeployedprojectURL.Use--jsonforscriptedintegrations.odui<list|show|respond|revoke|prefill>[args]ReadandanswerGenUIsurfaces(form/choice/confirmation/oauth-prompt)headlessly.odchatnew--project<id>[--seed-from<cid>][--fork-after<mid>][--title"<t>"][--json]CreateaSideChat:anewconversationthatinheritsanotherconversation'scontextbycopyingitsmessages(--seed-from),optionallystoppingatonemessage(--fork-after).Mirrorsthewebchatforkaction.oddiagnosticsexport[<path>][--json]Bundledaemon/web/desktoplogs,machineinfo,andrecentcrashreportsintoazipforsupporttickets.SameoutputasSettings→About→Exportdiagnostics.odexport<file>--project<id>--format<html|pdf|image|pptx>[--out<path>]ProgrammaticallyexportanHTML/deckartifacttoHTML,PDF,image,orPPTX(nomodel/agentcalls).MirrorsthewebDownloadmenu;rasterizationusesthedesktopruntime'sbundledChromium.odlint<file.html|->[--fail-on<p0|p1|p2|none>][--json]Runthedaemon'santi-slopartifactlinteragainstanHTMLfileorstdin(nomodel/agentcalls;headless-safe).Exits1whenfindingsmeetthe--fail-onthreshold,soitcangatecron/CIrenderpipelines."$OD_NODE_BIN""$OD_BIN"tools...Recommendedagent-runtimeform;avoidsrelyingonuserPATHforodornode.odmediagenerate--surface<image|video|audio>--model<id>[opts]Generateamediaartifactandwriteitintotheactiveproject.Designedtobeinvokedbyacodeagent-picksupOD_DAEMON_URLandOD_PROJECT_IDfromtheenvthatthedaemoninjectedonspawn.odmediascaffold--composition-dir.hyperframes-cache/<id>CreateadeterministicHyperFramescompositionwithoutnpxorglobalskillinstallation,beforedispatchingitthroughmediagenerate.odmcp[--daemon-url<url>]RunastdioMCPserverthatproxiesprojecttoolcallstoarunningOpenDesigndaemon.Wireitintoacodingagent(ClaudeCode,Cursor,VSCode,Zed,Windsurf)inanotherrepotopullfilesfromalocalOpenDesignprojectandcreateproject-scopedartifactswithoutexportingazip.Options:--port<n>Porttolistenon(default:7456,env:OD_PORT).--host<addr>Interfaceaddresstobindto(default:127.0.0.1,env:OD_BIND_HOST).SettoaspecificIP(e.g.aTailscaleaddress)torestrictaccesstothatinterfaceonly.--no-openDonotopenthebrowserafterstart.Whatthedaemondoes:*scansPATHforinstalledcode-agentCLIs(claude,codex,devin,opencode,cursor-agent,...)*servesthechatUIathttp://<host>:<port>*proxiesmessages(text+images)totheselectedagentviachild-processspawn*exposesproject-scopedmediascaffold/generateAPIs—theunifiedpaththattheagentcallsvia`odmediascaffold`and`odmediagenerate`.
4
+ 1
@@ -0,0 +1 @@
1
+ {"file":"/home/zerwiz/.pi/agent/sessions/--home-zerwiz-firstmate--/2026-09-04T13-43-14-520Z_01a06ca8-c358-7166-8de7-f2dced4fc993.jsonl","index":428}
@@ -0,0 +1 @@
1
+ /home/zerwiz/firstmate/state/branch-session/2026-09-04T16-49-38-671Z_01a06d53-6b6f-7619-930d-e6dfd9a4a29e.jsonl
@@ -0,0 +1 @@
1
+ f1b6dca4f07161ff283508249d5a1526
@@ -0,0 +1 @@
1
+ 5386cd8e1346b9f0559bf8df63aba235
@@ -0,0 +1 @@
1
+ 8b3e69307a35d6c32b32b6372db14dbf
@@ -0,0 +1 @@
1
+ 1b42e1472af079e799717464cda336a7
@@ -0,0 +1 @@
1
+ b11adb7ce9310f6835e9bb9bd279750c
@@ -0,0 +1,2 @@
1
+ epoch=1789090073
2
+ cursor=
@@ -0,0 +1 @@
1
+ 1760629
@@ -0,0 +1,2 @@
1
+ sha256:f03ff1bbbc43f5085d7d31844990f913a79d97e4152410873771c993914132f4
2
+ 1194070
@@ -0,0 +1,2 @@
1
+ sha256:813f3a9c4a87e9254ebe8c770c998da5a6102798e4170d54d006527b5c1514b3
2
+ 1194070
@@ -0,0 +1,2 @@
1
+ 1760629
2
+ sha256:ce837cca038ce619fb05622ad7ce8bded3aacaa55f9542233995b896878d43b2
@@ -0,0 +1 @@
1
+ 1760629
@@ -0,0 +1 @@
1
+ f1b6dca4f07161ff283508249d5a1526
@@ -0,0 +1 @@
1
+ 8b3e69307a35d6c32b32b6372db14dbf
@@ -0,0 +1 @@
1
+ b11adb7ce9310f6835e9bb9bd279750c
@@ -0,0 +1 @@
1
+ 1788541317
@@ -0,0 +1 @@
1
+ 1788541052
@@ -0,0 +1 @@
1
+ delivered
@@ -0,0 +1 @@
1
+ NOTICE: auto-detected herdr runtime (HERDR_ENV=1) - spawning into the EXPERIMENTAL herdr backend. Set config/backend or pass --backend tmux to opt out.
@@ -0,0 +1,10 @@
1
+ state=done
2
+ pid=1761846
3
+ started=1789089167
4
+ finished=1789089168
5
+ rc=0
6
+ locked=1
7
+ phases=probe,sweeps
8
+ generation=1789089167.1761698.1761006
9
+ lock_pid=1760629
10
+ report_published=1
@@ -0,0 +1,6 @@
1
+ v1 phase gh-auth 66 779
2
+ v1 phase fleet-sync 853 1
3
+ v1 phase secondmate-liveness 856 6
4
+ v1 phase secondmate-sync 867 33
5
+ v1 phase handoff-delivery 907 1
6
+ v1 stage network-checks 1 955 probe_sweeps
@@ -0,0 +1 @@
1
+ 1760629 off
@@ -0,0 +1 @@
1
+ 32
@@ -0,0 +1,22 @@
1
+ arm_pid=3540616 watcher_pid=3540691 origin=started started_at=1788222160 ended_at=1788223124 exit_code=143 signal=TERM reason=arm-interrupted beacon_age=16 lock_before=pid:3540691|identity:linux-starttime=22802703 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=none
2
+ arm_pid=1013276 watcher_pid=1013356 origin=started started_at=1788540546 ended_at=1788540547 exit_code=0 signal=none reason=actionable-check beacon_age=0 lock_before=pid:1013356|identity:linux-starttime=922627 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1013844
3
+ arm_pid=1013770 watcher_pid=1013844 origin=started started_at=1788540547 ended_at=1788540578 exit_code=0 signal=none reason=actionable-signal beacon_age=31 lock_before=pid:1013844|identity:linux-starttime=922678 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1015796
4
+ arm_pid=1015722 watcher_pid=1015796 origin=started started_at=1788540578 ended_at=1788540609 exit_code=0 signal=none reason=actionable-stale beacon_age=0 lock_before=pid:1015796|identity:linux-starttime=925763 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1018084
5
+ arm_pid=1018010 watcher_pid=1018084 origin=started started_at=1788540610 ended_at=1788540748 exit_code=0 signal=none reason=actionable-signal beacon_age=31 lock_before=pid:1018084|identity:linux-starttime=928938 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1027614
6
+ arm_pid=1027539 watcher_pid=1027614 origin=started started_at=1788540748 ended_at=1788540781 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1027614|identity:linux-starttime=942795 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1030957
7
+ arm_pid=1030883 watcher_pid=1030957 origin=started started_at=1788540781 ended_at=1788540877 exit_code=0 signal=none reason=actionable-stale beacon_age=0 lock_before=pid:1030957|identity:linux-starttime=946116 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1036097
8
+ arm_pid=1036023 watcher_pid=1036097 origin=started started_at=1788540877 ended_at=1788540957 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1036097|identity:linux-starttime=955731 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1039924
9
+ arm_pid=1039850 watcher_pid=1039924 origin=started started_at=1788540957 ended_at=1788540973 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1039924|identity:linux-starttime=963675 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1041607
10
+ arm_pid=1041533 watcher_pid=1041607 origin=started started_at=1788540973 ended_at=1788541052 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1041607|identity:linux-starttime=965306 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1048066
11
+ arm_pid=1047992 watcher_pid=1048066 origin=started started_at=1788541052 ended_at=1788541144 exit_code=0 signal=none reason=actionable-signal beacon_age=30 lock_before=pid:1048066|identity:linux-starttime=973176 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1053785
12
+ arm_pid=1053711 watcher_pid=1053785 origin=started started_at=1788541144 ended_at=1788541207 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1053785|identity:linux-starttime=982431 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1056909
13
+ arm_pid=1056835 watcher_pid=1056909 origin=started started_at=1788541207 ended_at=1788541284 exit_code=0 signal=none reason=actionable-signal beacon_age=30 lock_before=pid:1056909|identity:linux-starttime=988699 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1061606
14
+ arm_pid=1061532 watcher_pid=1061606 origin=started started_at=1788541284 ended_at=1788541316 exit_code=0 signal=none reason=actionable-stale beacon_age=0 lock_before=pid:1061606|identity:linux-starttime=996434 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1064076
15
+ arm_pid=1064002 watcher_pid=1064076 origin=started started_at=1788541316 ended_at=1788541592 exit_code=0 signal=none reason=actionable-signal beacon_age=31 lock_before=pid:1064076|identity:linux-starttime=999632 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1075491
16
+ arm_pid=1075417 watcher_pid=1075491 origin=started started_at=1788541592 ended_at=1788541684 exit_code=0 signal=none reason=actionable-signal beacon_age=30 lock_before=pid:1075491|identity:linux-starttime=1027192 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1080764
17
+ arm_pid=1080690 watcher_pid=1080764 origin=started started_at=1788541685 ended_at=1788541716 exit_code=0 signal=none reason=actionable-stale beacon_age=1 lock_before=pid:1080764|identity:linux-starttime=1036442 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:1083267
18
+ arm_pid=1333537 watcher_pid=1333623 origin=started started_at=1788606323 ended_at=1788606323 exit_code=0 signal=none reason=actionable-check beacon_age=0 lock_before=pid:none|identity:none lock_after=pid:none|identity:none successor=started:1334223
19
+ arm_pid=3342034 watcher_pid=3342116 origin=started started_at=1788788524 ended_at=1788788526 exit_code=0 signal=none reason=actionable-check beacon_age=0 lock_before=pid:3342116|identity:linux-starttime=25720597 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=started:3343039
20
+ arm_pid=3342907 watcher_pid=3343039 origin=started started_at=1788788527 ended_at=1788803447 exit_code=143 signal=TERM reason=arm-interrupted beacon_age=16 lock_before=pid:3343039|identity:linux-starttime=25720901 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 lock_after=pid:none|identity:none successor=none
21
+ arm_pid=3154284 watcher_pid=3154719 origin=started started_at=1788979636 ended_at=1788979637 exit_code=0 signal=none reason=actionable-check beacon_age=0 lock_before=pid:none|identity:none lock_after=pid:none|identity:none successor=started:3156824
22
+ arm_pid=3156729 watcher_pid=3156824 origin=started started_at=1788979638 ended_at=1788981700 exit_code=143 signal=TERM reason=arm-interrupted beacon_age=15 lock_before=pid:3156824|identity:linux-starttime=3010708 cmdline-hex=Usage:od[--port<n>][--host<addr>][--no-open]StartthelocaldaemonandopenthewebUI.odtoolslive-artifacts<create|list|update|refresh>[options]Manageliveartifactsthroughdaemonwrappercommands.odtoolsdirections[--id<id>|--label<label>][--json]Listthebuilt-indesigndirections,orprintonedirection'sfullpalette/fontstacks/posturespecforbindinginto:root.odartifactscreate--name<path>--input<file>[--project<id-or-name>]Createanormalprojectartifactthroughthelocaldaemo lock_after=pid:none|identity:none successor=none
@@ -0,0 +1,19 @@
1
+ 1013356 linux-starttime=922627 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 check: rearm-resurface
2
+ 1013844 linux-starttime=922678 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
3
+ 1015796 linux-starttime=925763 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2
4
+ 1018084 linux-starttime=928938 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
5
+ 1027614 linux-starttime=942795 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2
6
+ 1030957 linux-starttime=946116 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2
7
+ 1036097 linux-starttime=955731 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2 (unread firstmate instruction: /home/zerwiz/firstmate/state/server-knowledge.inbox/001.msg still unhandled after 3 doorbell delivery attempts with an idle pane; inspect the worker)
8
+ 1039924 linux-starttime=963675 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2
9
+ 1041607 linux-starttime=965306 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wR:p2
10
+ 1048066 linux-starttime=973176 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
11
+ 1053785 linux-starttime=982431 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: firstmate:fm-server-knowledge
12
+ 1056909 linux-starttime=988699 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
13
+ 1061606 linux-starttime=996434 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: default:wF:p5
14
+ 1064076 linux-starttime=999632 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
15
+ 1075491 linux-starttime=1027192 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
16
+ 1080764 linux-starttime=1036442 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 stale: firstmate:fm-server-knowledge
17
+ 1333623 linux-starttime=7500421 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 check: rearm-resurface
18
+ 3342116 linux-starttime=25720597 cmdline-hex=62617368002f686f6d652f7a657277697a2f66697273746d6174652f62696e2f666d2d77617463682e736800 check: rearm-resurface
19
+ 3154719 linux-starttime=3010534 cmdline-hex=Usage:od[--port<n>][--host<addr>][--no-open]StartthelocaldaemonandopenthewebUI.odtoolslive-artifacts<create|list|update|refresh>[options]Manageliveartifactsthroughdaemonwrappercommands.odtoolsdirections[--id<id>|--label<label>][--json]Listthebuilt-indesigndirections,orprintonedirection'sfullpalette/fontstacks/posturespecforbindinginto:root.odartifactscreate--name<path>--input<file>[--project<id-or-name>]Createanormalprojectartifactthroughthelocaldaemon.odtoolsconnectors<list|execute|github-design-context>[options]Discoverandexecuteconfiguredconnectors.odtoolsdesign-systemsread--path<manifest-declared-path>Readactivedesign-systempull-layerfilesthroughdaemonwrappercommands.odmcplive-artifactsStarttheMCPserverexposinglive-artifactandconnectortools.odresearchsearch--query<text>[--max-sources5][--daemon-url<url>]Runagent-callableTavilyresearchthroughthelocaldaemon.odplugin<list|info|install|uninstall|apply|doctor|replay|trust>[args]Discover,install,andapplypluginsthroughthelocaldaemon.odpluginpublish-repo<folder>Create/updatetheauthor'sGitHubrepoforalocalpluginfolder.odpluginopen-design-pr<folder>Pushacommunity-catalogbranchandopentheOpenDesignPRform.odautomation<list|get|create|update|run|runs|pause|resume|delete>[args]DrivetheAutomationssurfaceheadlessly.SamestoreastheUI'sAutomationstab,soanexternalagent(hermes,openclaw,...)canschedule,trigger,orharvestresultsfromaroutinewithoutopeningthewebUI.odmessage-center<list|read|read-all>[args]Readandacknowledgemessage-centerinboxitemsthroughthesamedaemonendpointsthebellUIuses.odamr<login|status>[args]StartVelabrowsersign-inorinspectthecurrentVelaaccountthroughthelocalOpenDesigndaemon.odmemorytree<list|view|edit|move>[args]Inspectandeditthememorytreethatisinjectedintoagentprompts.odshare<open-design|url>[options]Buildlocalizedsocial-sharetargetsfortheOpenDesignrepooradeployedprojectURL.Use--jsonforscriptedintegrations.odui<list|show|respond|revoke|prefill>[args]ReadandanswerGenUIsurfaces(form/choice/confirmation/oauth-prompt)headlessly.odchatnew--project<id>[--seed-from<cid>][--fork-after<mid>][--title"<t>"][--json]CreateaSideChat:anewconversationthatinheritsanotherconversation'scontextbycopyingitsmessages(--seed-from),optionallystoppingatonemessage(--fork-after).Mirrorsthewebchatforkaction.oddiagnosticsexport[<path>][--json]Bundledaemon/web/desktoplogs,machineinfo,andrecentcrashreportsintoazipforsupporttickets.SameoutputasSettings→About→Exportdiagnostics.odexport<file>--project<id>--format<html|pdf|image|pptx>[--out<path>]ProgrammaticallyexportanHTML/deckartifacttoHTML,PDF,image,orPPTX(nomodel/agentcalls).MirrorsthewebDownloadmenu;rasterizationusesthedesktopruntime'sbundledChromium.odlint<file.html|->[--fail-on<p0|p1|p2|none>][--json]Runthedaemon'santi-slopartifactlinteragainstanHTMLfileorstdin(nomodel/agentcalls;headless-safe).Exits1whenfindingsmeetthe--fail-onthreshold,soitcangatecron/CIrenderpipelines."$OD_NODE_BIN""$OD_BIN"tools...Recommendedagent-runtimeform;avoidsrelyingonuserPATHforodornode.odmediagenerate--surface<image|video|audio>--model<id>[opts]Generateamediaartifactandwriteitintotheactiveproject.Designedtobeinvokedbyacodeagent-picksupOD_DAEMON_URLandOD_PROJECT_IDfromtheenvthatthedaemoninjectedonspawn.odmediascaffold--composition-dir.hyperframes-cache/<id>CreateadeterministicHyperFramescompositionwithoutnpxorglobalskillinstallation,beforedispatchingitthroughmediagenerate.odmcp[--daemon-url<url>]RunastdioMCPserverthatproxiesprojecttoolcallstoarunningOpenDesigndaemon.Wireitintoacodingagent(ClaudeCode,Cursor,VSCode,Zed,Windsurf)inanotherrepotopullfilesfromalocalOpenDesignprojectandcreateproject-scopedartifactswithoutexportingazip.Options:--port<n>Porttolistenon(default:7456,env:OD_PORT).--host<addr>Interfaceaddresstobindto(default:127.0.0.1,env:OD_BIND_HOST).SettoaspecificIP(e.g.aTailscaleaddress)torestrictaccesstothatinterfaceonly.--no-openDonotopenthebrowserafterstart.Whatthedaemondoes:*scansPATHforinstalledcode-agentCLIs(claude,codex,devin,opencode,cursor-agent,...)*servesthechatUIathttp://<host>:<port>*proxiesmessages(text+images)totheselectedagentviachild-processspawn*exposesproject-scopedmediascaffold/generateAPIs—theunifiedpaththattheagentcallsvia`odmediascaffold`and`odmediagenerate`. check: rearm-resurface
@@ -0,0 +1,38 @@
1
+ [2026-09-01T03:32:52+0300] absorbed heartbeat (no captain-relevant change)
2
+ [2026-09-04T19:49:38+0300] absorbed heartbeat (no captain-relevant change)
3
+ [2026-09-04T19:50:10+0300] absorbed non-terminal stale timer reset: default:wR:p2
4
+ [2026-09-04T19:51:42+0300] absorbed benign signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
5
+ [2026-09-04T19:52:30+0300] steer-inbox delivery attempt: server-knowledge 001.msg result=0
6
+ [2026-09-04T19:53:02+0300] absorbed non-terminal stale timer reset: default:wR:p2
7
+ [2026-09-04T19:54:06+0300] steer-inbox delivery attempt: server-knowledge 001.msg result=0
8
+ [2026-09-04T19:54:38+0300] absorbed non-terminal stale timer reset: default:wR:p2
9
+ [2026-09-04T19:55:41+0300] steer-inbox delivery attempt: server-knowledge 001.msg result=0
10
+ [2026-09-04T19:56:14+0300] absorbed non-terminal stale timer reset: default:wR:p2
11
+ [2026-09-04T19:57:32+0300] absorbed non-terminal stale timer reset: default:wR:p2
12
+ [2026-09-04T19:59:51+0300] absorbed heartbeat (no captain-relevant change)
13
+ [2026-09-04T20:00:08+0300] absorbed non-terminal stale timer reset: firstmate:fm-server-knowledge
14
+ [2026-09-04T20:01:57+0300] absorbed non-terminal stale timer reset: default:wF:p5
15
+ [2026-09-04T20:08:37+0300] absorbed non-terminal stale timer reset: firstmate:fm-server-knowledge
16
+ [2026-09-04T20:09:37+0300] absorbed benign signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
17
+ [2026-09-04T20:09:53+0300] absorbed heartbeat (no captain-relevant change)
18
+ [2026-09-04T20:10:38+0300] absorbed benign signal: /home/zerwiz/firstmate/state/server-knowledge.turn-ended
19
+ [2026-09-05T14:05:24+0300] absorbed heartbeat (no captain-relevant change)
20
+ [2026-09-05T14:25:33+0300] absorbed heartbeat (no captain-relevant change)
21
+ [2026-09-07T16:42:09+0300] absorbed heartbeat (no captain-relevant change)
22
+ [2026-09-07T17:02:12+0300] absorbed heartbeat (no captain-relevant change)
23
+ [2026-09-07T17:42:21+0300] absorbed heartbeat (no captain-relevant change)
24
+ [2026-09-07T19:02:33+0300] absorbed heartbeat (no captain-relevant change)
25
+ [2026-09-09T21:47:19+0300] absorbed heartbeat (no captain-relevant change)
26
+ [2026-09-09T22:07:19+0300] absorbed heartbeat (no captain-relevant change)
27
+ [2026-09-09T22:53:26+0300] absorbed heartbeat (no captain-relevant change)
28
+ [2026-09-10T00:13:28+0300] absorbed heartbeat (no captain-relevant change)
29
+ [2026-09-10T02:13:36+0300] absorbed heartbeat (no captain-relevant change)
30
+ [2026-09-10T04:13:38+0300] absorbed heartbeat (no captain-relevant change)
31
+ [2026-09-10T14:07:20+0300] absorbed heartbeat (no captain-relevant change)
32
+ [2026-09-10T16:07:33+0300] absorbed heartbeat (no captain-relevant change)
33
+ [2026-09-10T18:07:45+0300] absorbed heartbeat (no captain-relevant change)
34
+ [2026-09-10T20:07:56+0300] absorbed heartbeat (no captain-relevant change)
35
+ [2026-09-10T22:08:03+0300] absorbed heartbeat (no captain-relevant change)
36
+ [2026-09-11T00:08:04+0300] absorbed heartbeat (no captain-relevant change)
37
+ [2026-09-11T02:08:05+0300] absorbed heartbeat (no captain-relevant change)
38
+ [2026-09-11T04:08:05+0300] absorbed heartbeat (no captain-relevant change)
@@ -0,0 +1 @@
1
+ /home/zerwiz/firstmate
@@ -0,0 +1 @@
1
+ 3526251
@@ -0,0 +1 @@
1
+ linux-starttime=3407402 cmdline-hex=Usage:od[--port<n>][--host<addr>][--no-open]StartthelocaldaemonandopenthewebUI.odtoolslive-artifacts<create|list|update|refresh>[options]Manageliveartifactsthroughdaemonwrappercommands.odtoolsdirections[--id<id>|--label<label>][--json]Listthebuilt-indesigndirections,orprintonedirection'sfullpalette/fontstacks/posturespecforbindinginto:root.odartifactscreate--name<path>--input<file>[--project<id-or-name>]Createanormalprojectartifactthroughthelocaldaemon.odtoolsconnectors<list|execute|github-design-context>[options]Discoverandexecuteconfiguredconnectors.odtoolsdesign-systemsread--path<manifest-declared-path>Readactivedesign-systempull-layerfilesthroughdaemonwrappercommands.odmcplive-artifactsStarttheMCPserverexposinglive-artifactandconnectortools.odresearchsearch--query<text>[--max-sources5][--daemon-url<url>]Runagent-callableTavilyresearchthroughthelocaldaemon.odplugin<list|info|install|uninstall|apply|doctor|replay|trust>[args]Discover,install,andapplypluginsthroughthelocaldaemon.odpluginpublish-repo<folder>Create/updatetheauthor'sGitHubrepoforalocalpluginfolder.odpluginopen-design-pr<folder>Pushacommunity-catalogbranchandopentheOpenDesignPRform.odautomation<list|get|create|update|run|runs|pause|resume|delete>[args]DrivetheAutomationssurfaceheadlessly.SamestoreastheUI'sAutomationstab,soanexternalagent(hermes,openclaw,...)canschedule,trigger,orharvestresultsfromaroutinewithoutopeningthewebUI.odmessage-center<list|read|read-all>[args]Readandacknowledgemessage-centerinboxitemsthroughthesamedaemonendpointsthebellUIuses.odamr<login|status>[args]StartVelabrowsersign-inorinspectthecurrentVelaaccountthroughthelocalOpenDesigndaemon.odmemorytree<list|view|edit|move>[args]Inspectandeditthememorytreethatisinjectedintoagentprompts.odshare<open-design|url>[options]Buildlocalizedsocial-sharetargetsfortheOpenDesignrepooradeployedprojectURL.Use--jsonforscriptedintegrations.odui<list|show|respond|revoke|prefill>[args]ReadandanswerGenUIsurfaces(form/choice/confirmation/oauth-prompt)headlessly.odchatnew--project<id>[--seed-from<cid>][--fork-after<mid>][--title"<t>"][--json]CreateaSideChat:anewconversationthatinheritsanotherconversation'scontextbycopyingitsmessages(--seed-from),optionallystoppingatonemessage(--fork-after).Mirrorsthewebchatforkaction.oddiagnosticsexport[<path>][--json]Bundledaemon/web/desktoplogs,machineinfo,andrecentcrashreportsintoazipforsupporttickets.SameoutputasSettings→About→Exportdiagnostics.odexport<file>--project<id>--format<html|pdf|image|pptx>[--out<path>]ProgrammaticallyexportanHTML/deckartifacttoHTML,PDF,image,orPPTX(nomodel/agentcalls).MirrorsthewebDownloadmenu;rasterizationusesthedesktopruntime'sbundledChromium.odlint<file.html|->[--fail-on<p0|p1|p2|none>][--json]Runthedaemon'santi-slopartifactlinteragainstanHTMLfileorstdin(nomodel/agentcalls;headless-safe).Exits1whenfindingsmeetthe--fail-onthreshold,soitcangatecron/CIrenderpipelines."$OD_NODE_BIN""$OD_BIN"tools...Recommendedagent-runtimeform;avoidsrelyingonuserPATHforodornode.odmediagenerate--surface<image|video|audio>--model<id>[opts]Generateamediaartifactandwriteitintotheactiveproject.Designedtobeinvokedbyacodeagent-picksupOD_DAEMON_URLandOD_PROJECT_IDfromtheenvthatthedaemoninjectedonspawn.odmediascaffold--composition-dir.hyperframes-cache/<id>CreateadeterministicHyperFramescompositionwithoutnpxorglobalskillinstallation,beforedispatchingitthroughmediagenerate.odmcp[--daemon-url<url>]RunastdioMCPserverthatproxiesprojecttoolcallstoarunningOpenDesigndaemon.Wireitintoacodingagent(ClaudeCode,Cursor,VSCode,Zed,Windsurf)inanotherrepotopullfilesfromalocalOpenDesignprojectandcreateproject-scopedartifactswithoutexportingazip.Options:--port<n>Porttolistenon(default:7456,env:OD_PORT).--host<addr>Interfaceaddresstobindto(default:127.0.0.1,env:OD_BIND_HOST).SettoaspecificIP(e.g.aTailscaleaddress)torestrictaccesstothatinterfaceonly.--no-openDonotopenthebrowserafterstart.Whatthedaemondoes:*scansPATHforinstalledcode-agentCLIs(claude,codex,devin,opencode,cursor-agent,...)*servesthechatUIathttp://<host>:<port>*proxiesmessages(text+images)totheselectedagentviachild-processspawn*exposesproject-scopedmediascaffold/generateAPIs—theunifiedpaththattheagentcallsvia`odmediascaffold`and`odmediagenerate`.
@@ -0,0 +1 @@
1
+ /home/zerwiz/firstmate/bin/fm-watch.sh
@@ -0,0 +1 @@
1
+ /home/zerwiz/firstmate