@zerwiz/ymir 0.1.4 → 0.1.7

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 (865) hide show
  1. package/.agents/README.md +291 -0
  2. package/.agents/agents/bragi-marketer.md +111 -0
  3. package/.agents/agents/brokk.md +352 -0
  4. package/.agents/agents/forseti-reviewer.md +93 -0
  5. package/.agents/agents/frigg-consent.md +77 -0
  6. package/.agents/agents/groa-update.md +77 -0
  7. package/.agents/agents/hnoss-designer.md +69 -0
  8. package/.agents/agents/huginn-researcher.md +99 -0
  9. package/.agents/agents/jord-projects.md +78 -0
  10. package/.agents/agents/kvasir-scout.md +91 -0
  11. package/.agents/agents/mimir-planner.md +92 -0
  12. package/.agents/agents/muninn-stow.md +77 -0
  13. package/.agents/agents/saga-bearings.md +78 -0
  14. package/.agents/agents/sindri-developer.md +114 -0
  15. package/.agents/agents/snotra-documenter.md +105 -0
  16. package/.agents/agents/syn-recovery.md +78 -0
  17. package/.agents/agents/tyr-check.md +78 -0
  18. package/.agents/agents/urdh-hold.md +77 -0
  19. package/.agents/agents/volundr-smith.md +80 -0
  20. package/.agents/agents/vor-diagnostics.md +77 -0
  21. package/.agents/assets/agents/naming.md +50 -0
  22. package/.agents/assets/agents/registry.md +93 -0
  23. package/.agents/assets/agents/runtime.md +36 -0
  24. package/.agents/assets/agents/toon-tasks-cli.md +42 -0
  25. package/.agents/assets/templates/company_entity.template.md +37 -0
  26. package/.agents/backend/README.md +74 -0
  27. package/.agents/backend/backends/cmux.sh +649 -0
  28. package/.agents/backend/backends/herdr-eventwait.py +157 -0
  29. package/.agents/backend/backends/herdr-workspace-move.py +114 -0
  30. package/.agents/backend/backends/herdr.sh +3386 -0
  31. package/.agents/backend/backends/orca.sh +290 -0
  32. package/.agents/backend/backends/tmux.sh +357 -0
  33. package/.agents/backend/backends/zellij.sh +700 -0
  34. package/.agents/backend/fm-afk-launch.sh +654 -0
  35. package/.agents/backend/fm-afk-return.sh +241 -0
  36. package/.agents/backend/fm-afk-start.sh +172 -0
  37. package/.agents/backend/fm-arm-command-policy.mjs +960 -0
  38. package/.agents/backend/fm-arm-pretool-check.sh +200 -0
  39. package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
  40. package/.agents/backend/fm-backend.sh +981 -0
  41. package/.agents/backend/fm-backlog-handoff.sh +909 -0
  42. package/.agents/backend/fm-backlog-receive.sh +187 -0
  43. package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
  44. package/.agents/backend/fm-bearings-board.sh +204 -0
  45. package/.agents/backend/fm-bearings-snapshot.sh +546 -0
  46. package/.agents/backend/fm-bootstrap.sh +1568 -0
  47. package/.agents/backend/fm-branch-outcome.sh +203 -0
  48. package/.agents/backend/fm-branch-prompt.sh +101 -0
  49. package/.agents/backend/fm-brief.sh +452 -0
  50. package/.agents/backend/fm-busy-event.sh +234 -0
  51. package/.agents/backend/fm-busy-lib.sh +986 -0
  52. package/.agents/backend/fm-captain-hold.sh +1001 -0
  53. package/.agents/backend/fm-cd-command-policy.mjs +153 -0
  54. package/.agents/backend/fm-cd-pretool-check.sh +190 -0
  55. package/.agents/backend/fm-check-lib.sh +74 -0
  56. package/.agents/backend/fm-check-register.sh +42 -0
  57. package/.agents/backend/fm-check-unregister.sh +52 -0
  58. package/.agents/backend/fm-classify-lib.sh +1770 -0
  59. package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
  60. package/.agents/backend/fm-composer-lib.sh +1416 -0
  61. package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
  62. package/.agents/backend/fm-config-push.sh +254 -0
  63. package/.agents/backend/fm-control-lib.sh +251 -0
  64. package/.agents/backend/fm-control.sh +878 -0
  65. package/.agents/backend/fm-crew-state.sh +625 -0
  66. package/.agents/backend/fm-cursor-lib.sh +243 -0
  67. package/.agents/backend/fm-decision-hold.sh +232 -0
  68. package/.agents/backend/fm-doc-audience-check.sh +269 -0
  69. package/.agents/backend/fm-dod-lib.sh +67 -0
  70. package/.agents/backend/fm-ensure-agents-md.sh +253 -0
  71. package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
  72. package/.agents/backend/fm-extension.mjs +2577 -0
  73. package/.agents/backend/fm-extension.sh +16 -0
  74. package/.agents/backend/fm-ff-lib.sh +420 -0
  75. package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
  76. package/.agents/backend/fm-fleet-sync.sh +458 -0
  77. package/.agents/backend/fm-fleet-view.sh +96 -0
  78. package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
  79. package/.agents/backend/fm-guard.sh +242 -0
  80. package/.agents/backend/fm-harness.sh +195 -0
  81. package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
  82. package/.agents/backend/fm-herdr-lab.sh +346 -0
  83. package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
  84. package/.agents/backend/fm-home-seed.sh +984 -0
  85. package/.agents/backend/fm-home-summary-refresh.sh +255 -0
  86. package/.agents/backend/fm-hook-host-lib.sh +36 -0
  87. package/.agents/backend/fm-inactive-reconcile.sh +531 -0
  88. package/.agents/backend/fm-inbox.sh +399 -0
  89. package/.agents/backend/fm-install-actionlint.sh +84 -0
  90. package/.agents/backend/fm-install-herdr.sh +96 -0
  91. package/.agents/backend/fm-install-shellcheck.sh +84 -0
  92. package/.agents/backend/fm-install-treehouse.sh +95 -0
  93. package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
  94. package/.agents/backend/fm-lease-lib.sh +218 -0
  95. package/.agents/backend/fm-lease.sh +189 -0
  96. package/.agents/backend/fm-line-cap-lib.sh +51 -0
  97. package/.agents/backend/fm-lint-workflows.sh +137 -0
  98. package/.agents/backend/fm-lint.sh +591 -0
  99. package/.agents/backend/fm-lock-lib.sh +104 -0
  100. package/.agents/backend/fm-lock.sh +107 -0
  101. package/.agents/backend/fm-marker-lib.sh +12 -0
  102. package/.agents/backend/fm-merge-local.sh +74 -0
  103. package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
  104. package/.agents/backend/fm-nm-run-lib.sh +124 -0
  105. package/.agents/backend/fm-on.sh +125 -0
  106. package/.agents/backend/fm-operational-input.sh +253 -0
  107. package/.agents/backend/fm-peek.sh +46 -0
  108. package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
  109. package/.agents/backend/fm-pr-check.sh +135 -0
  110. package/.agents/backend/fm-pr-lib.sh +1016 -0
  111. package/.agents/backend/fm-pr-merge.sh +707 -0
  112. package/.agents/backend/fm-pr-poll.sh +110 -0
  113. package/.agents/backend/fm-primary-scope-lib.sh +33 -0
  114. package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
  115. package/.agents/backend/fm-procevent-lavish.sh +628 -0
  116. package/.agents/backend/fm-procevent-lib.sh +892 -0
  117. package/.agents/backend/fm-procevent-quota.sh +290 -0
  118. package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
  119. package/.agents/backend/fm-procevent-when.sh +504 -0
  120. package/.agents/backend/fm-procevent.sh +1466 -0
  121. package/.agents/backend/fm-project-mode.sh +92 -0
  122. package/.agents/backend/fm-project-origin-lib.sh +180 -0
  123. package/.agents/backend/fm-promote.sh +282 -0
  124. package/.agents/backend/fm-public-followup-emit.sh +260 -0
  125. package/.agents/backend/fm-public-followup-lib.sh +398 -0
  126. package/.agents/backend/fm-public-followup.sh +1330 -0
  127. package/.agents/backend/fm-push-transition-lib.sh +168 -0
  128. package/.agents/backend/fm-quota-axi-lib.sh +93 -0
  129. package/.agents/backend/fm-quota-choose.sh +384 -0
  130. package/.agents/backend/fm-remote-delta-read.sh +189 -0
  131. package/.agents/backend/fm-remote-doctor.sh +800 -0
  132. package/.agents/backend/fm-remote-entrypoint.sh +193 -0
  133. package/.agents/backend/fm-remote-file.sh +234 -0
  134. package/.agents/backend/fm-remote-home-provision.sh +259 -0
  135. package/.agents/backend/fm-remote-home-seed.sh +259 -0
  136. package/.agents/backend/fm-remote-inherit-push.sh +90 -0
  137. package/.agents/backend/fm-remote-inherit.sh +179 -0
  138. package/.agents/backend/fm-remote-job-lib.sh +1241 -0
  139. package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
  140. package/.agents/backend/fm-remote-job-worker.sh +1124 -0
  141. package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
  142. package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
  143. package/.agents/backend/fm-review-diff.sh +158 -0
  144. package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
  145. package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
  146. package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
  147. package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
  148. package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
  149. package/.agents/backend/fm-secondmate-report.sh +88 -0
  150. package/.agents/backend/fm-send.sh +1059 -0
  151. package/.agents/backend/fm-session-lock-lib.sh +176 -0
  152. package/.agents/backend/fm-session-start.sh +970 -0
  153. package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
  154. package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
  155. package/.agents/backend/fm-sessionstart-run.sh +145 -0
  156. package/.agents/backend/fm-spawn.sh +3153 -0
  157. package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
  158. package/.agents/backend/fm-startup-memory-budget.sh +94 -0
  159. package/.agents/backend/fm-startup-network.sh +642 -0
  160. package/.agents/backend/fm-stow-cascade.sh +251 -0
  161. package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
  162. package/.agents/backend/fm-supervise-daemon.sh +1732 -0
  163. package/.agents/backend/fm-supervision-instructions.sh +215 -0
  164. package/.agents/backend/fm-supervision-lib.sh +90 -0
  165. package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
  166. package/.agents/backend/fm-tangle-lib.sh +53 -0
  167. package/.agents/backend/fm-task-inbox-lib.sh +402 -0
  168. package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
  169. package/.agents/backend/fm-teardown.sh +2922 -0
  170. package/.agents/backend/fm-test-isolation-proof.sh +588 -0
  171. package/.agents/backend/fm-test-run.sh +2191 -0
  172. package/.agents/backend/fm-timeout-lib.sh +141 -0
  173. package/.agents/backend/fm-timing-lib.sh +179 -0
  174. package/.agents/backend/fm-tmux-lib.sh +291 -0
  175. package/.agents/backend/fm-tool-update-check.sh +898 -0
  176. package/.agents/backend/fm-trace-context-lib.sh +227 -0
  177. package/.agents/backend/fm-transition-lib.sh +103 -0
  178. package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
  179. package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
  180. package/.agents/backend/fm-turnend-guard.sh +432 -0
  181. package/.agents/backend/fm-update.sh +110 -0
  182. package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
  183. package/.agents/backend/fm-voice-client.py +1373 -0
  184. package/.agents/backend/fm-voice-relay.py +1256 -0
  185. package/.agents/backend/fm-wake-drain.sh +592 -0
  186. package/.agents/backend/fm-wake-grant.sh +127 -0
  187. package/.agents/backend/fm-wake-lib.sh +1849 -0
  188. package/.agents/backend/fm-watch-arm.sh +602 -0
  189. package/.agents/backend/fm-watch-checkpoint.sh +109 -0
  190. package/.agents/backend/fm-watch.sh +1962 -0
  191. package/.agents/backend/fm-x-dismiss.sh +116 -0
  192. package/.agents/backend/fm-x-followup.sh +286 -0
  193. package/.agents/backend/fm-x-lib.sh +1000 -0
  194. package/.agents/backend/fm-x-link.sh +234 -0
  195. package/.agents/backend/fm-x-poll.sh +185 -0
  196. package/.agents/backend/fm-x-reply.sh +385 -0
  197. package/.agents/backend/fm_voice_frame.py +166 -0
  198. package/.agents/backend/fm_voice_records.py +574 -0
  199. package/.agents/backend/model-bridge.py +360 -0
  200. package/.agents/backend/opencode-go-bridge.py +30 -0
  201. package/.agents/bus/README.md +12 -0
  202. package/.agents/bus/messages.json +1 -0
  203. package/.agents/config/agents.machine.example.yaml +16 -0
  204. package/.agents/config/agents.yaml.example +72 -0
  205. package/.agents/config/crew-dispatch.json +22 -0
  206. package/.agents/config/cron.yaml +11 -0
  207. package/.agents/config/eindri-dispatch.json +67 -0
  208. package/.agents/config/eindri-harness +1 -0
  209. package/.agents/config/startup-memory-budget +1 -0
  210. package/.agents/filebrowser/.filebrowser.json +6 -0
  211. package/.agents/filebrowser/README.md +11 -0
  212. package/.agents/gateway/README.md +12 -0
  213. package/.agents/github/README.md +15 -0
  214. package/.agents/github/webhooks/.gitkeep +0 -0
  215. package/.agents/github/workflows/.gitkeep +0 -0
  216. package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
  217. package/.agents/harness/opencode/plugins/package.json +4 -0
  218. package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
  219. package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
  220. package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
  221. package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
  222. package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
  223. package/.agents/memory/README.md +46 -0
  224. package/.agents/memory/runes_audit.md +5 -0
  225. package/.agents/migrations/0001-hodd-layout.sh +38 -0
  226. package/.agents/migrations/0002-a2a-mcp.sh +27 -0
  227. package/.agents/migrations/0003-private-data-separation.sh +121 -0
  228. package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
  229. package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
  230. package/.agents/sandbox/Dockerfile.utgard +19 -0
  231. package/.agents/sandbox/README.md +14 -0
  232. package/.agents/sandbox/utgard.config.json +14 -0
  233. package/.agents/skills/README.md +59 -0
  234. package/.agents/skills/bragi-marketing/README.md +3 -0
  235. package/.agents/skills/bragi-marketing/SKILL.md +82 -0
  236. package/.agents/skills/eindri-homes/README.md +3 -0
  237. package/.agents/skills/eindri-homes/SKILL.md +291 -0
  238. package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
  239. package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
  240. package/.agents/skills/frigg-consent/README.md +3 -0
  241. package/.agents/skills/frigg-consent/SKILL.md +56 -0
  242. package/.agents/skills/galdr-ymirsystem/README.md +3 -0
  243. package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
  244. package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
  245. package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
  246. package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
  247. package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
  248. package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
  249. package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
  250. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
  251. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
  252. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
  253. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
  254. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
  255. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
  256. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
  257. package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
  258. package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
  259. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
  260. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
  261. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
  262. package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
  263. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
  264. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
  265. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
  266. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
  267. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
  268. package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
  269. package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
  270. package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
  271. package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
  272. package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
  273. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
  274. package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
  275. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
  276. package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
  277. package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
  278. package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
  279. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
  280. package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
  281. package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
  282. package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
  283. package/.agents/skills/gjallarhorn-relay/README.md +3 -0
  284. package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
  285. package/.agents/skills/groa-update/SKILL.md +90 -0
  286. package/.agents/skills/hamr-adapters/README.md +3 -0
  287. package/.agents/skills/hamr-adapters/SKILL.md +123 -0
  288. package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
  289. package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
  290. package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
  291. package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
  292. package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
  293. package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
  294. package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
  295. package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
  296. package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
  297. package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
  298. package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
  299. package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
  300. package/.agents/skills/herdr-panes/README.md +3 -0
  301. package/.agents/skills/herdr-panes/SKILL.md +92 -0
  302. package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
  303. package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
  304. package/.agents/skills/hnoss-design/DESIGN.md +19 -0
  305. package/.agents/skills/hnoss-design/README.md +3 -0
  306. package/.agents/skills/hnoss-design/SKILL.md +83 -0
  307. package/.agents/skills/hvild-afk/README.md +3 -0
  308. package/.agents/skills/hvild-afk/SKILL.md +241 -0
  309. package/.agents/skills/jord-projects/README.md +3 -0
  310. package/.agents/skills/jord-projects/SKILL.md +92 -0
  311. package/.agents/skills/lifecycle/SKILL.md +56 -0
  312. package/.agents/skills/lifecycle/smoke_test.sh +57 -0
  313. package/.agents/skills/lifecycle/start.sh +21 -0
  314. package/.agents/skills/lifecycle/status.sh +35 -0
  315. package/.agents/skills/lifecycle/stop.sh +16 -0
  316. package/.agents/skills/muninn-stow/README.md +3 -0
  317. package/.agents/skills/muninn-stow/SKILL.md +309 -0
  318. package/.agents/skills/no-mistakes/SKILL.md +379 -0
  319. package/.agents/skills/nornir-schedule/README.md +3 -0
  320. package/.agents/skills/nornir-schedule/SKILL.md +25 -0
  321. package/.agents/skills/nornir-schedule/assets/events.md +137 -0
  322. package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
  323. package/.agents/skills/nsr-compliance/README.md +3 -0
  324. package/.agents/skills/nsr-compliance/SKILL.md +29 -0
  325. package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
  326. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
  327. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
  328. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
  329. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
  330. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
  331. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
  332. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
  333. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
  334. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
  335. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
  336. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
  337. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
  338. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
  339. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
  340. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
  341. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
  342. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
  343. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
  344. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
  345. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
  346. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
  347. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
  348. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  349. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
  350. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
  351. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
  352. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
  353. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
  354. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
  355. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
  356. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
  357. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
  358. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
  359. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
  360. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
  361. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
  362. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
  363. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
  364. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
  365. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
  366. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
  367. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
  368. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
  369. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
  370. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
  371. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
  372. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
  373. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
  374. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
  375. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
  376. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
  377. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
  378. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
  379. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
  380. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
  381. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
  382. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
  383. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
  384. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
  385. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
  386. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
  387. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
  388. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
  389. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
  390. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
  391. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
  392. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
  393. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
  394. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
  395. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
  396. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
  397. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
  398. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
  399. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
  400. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
  401. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
  402. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
  403. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
  404. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
  405. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
  406. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
  407. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
  408. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
  409. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
  410. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
  411. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
  412. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
  413. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
  414. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
  415. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
  416. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
  417. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
  418. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
  419. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
  420. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
  421. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
  422. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
  423. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
  424. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
  425. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
  426. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
  427. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
  428. package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
  429. package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
  430. package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
  431. package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
  432. package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
  433. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
  434. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
  435. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
  436. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
  437. package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
  438. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
  439. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
  440. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
  441. package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
  442. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
  443. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
  444. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
  445. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
  446. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
  447. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
  448. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
  449. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  450. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
  451. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
  452. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
  453. package/.agents/skills/pr-ops/README.md +3 -0
  454. package/.agents/skills/pr-ops/SKILL.md +109 -0
  455. package/.agents/skills/ratatoskr-a2a/README.md +3 -0
  456. package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
  457. package/.agents/skills/rules-check-drift/SKILL.md +81 -0
  458. package/.agents/skills/saga-bearings/README.md +3 -0
  459. package/.agents/skills/saga-bearings/SKILL.md +26 -0
  460. package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
  461. package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
  462. package/.agents/skills/saga-bearings/assets/recap.md +56 -0
  463. package/.agents/skills/syn-recovery/README.md +3 -0
  464. package/.agents/skills/syn-recovery/SKILL.md +54 -0
  465. package/.agents/skills/tyr-check/README.md +3 -0
  466. package/.agents/skills/tyr-check/SKILL.md +218 -0
  467. package/.agents/skills/urdh-hold/README.md +3 -0
  468. package/.agents/skills/urdh-hold/SKILL.md +25 -0
  469. package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
  470. package/.agents/skills/urdh-hold/assets/hold.md +54 -0
  471. package/.agents/skills/vor-diagnostics/README.md +3 -0
  472. package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
  473. package/.agents/skills/ymir-host/README.md +3 -0
  474. package/.agents/skills/ymir-host/SKILL.md +35 -0
  475. package/.agents/skills/ymir-host/assets/desktop.md +36 -0
  476. package/.agents/skills/ymir-host/assets/install.md +69 -0
  477. package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
  478. package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
  479. package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
  480. package/.agents/skills/ymir-host/assets/update.md +64 -0
  481. package/.agents/tests/assets/board-render-harness.mjs +117 -0
  482. package/.agents/tests/cmux-test-safety.sh +51 -0
  483. package/.agents/tests/fixtures.sh +291 -0
  484. package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
  485. package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
  486. package/.agents/tests/fm-afk-launch.test.sh +961 -0
  487. package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
  488. package/.agents/tests/fm-afk-return.test.sh +283 -0
  489. package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
  490. package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
  491. package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
  492. package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
  493. package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
  494. package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
  495. package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
  496. package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
  497. package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
  498. package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
  499. package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
  500. package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
  501. package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
  502. package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
  503. package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
  504. package/.agents/tests/fm-backend-orca.test.sh +1357 -0
  505. package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
  506. package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
  507. package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
  508. package/.agents/tests/fm-backend.test.sh +1142 -0
  509. package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
  510. package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
  511. package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
  512. package/.agents/tests/fm-bearings-board.test.sh +414 -0
  513. package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
  514. package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
  515. package/.agents/tests/fm-bootstrap.test.sh +1178 -0
  516. package/.agents/tests/fm-branch-supervision.test.sh +552 -0
  517. package/.agents/tests/fm-brief.test.sh +785 -0
  518. package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
  519. package/.agents/tests/fm-busy-state.test.sh +465 -0
  520. package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
  521. package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
  522. package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
  523. package/.agents/tests/fm-check-unregister.test.sh +198 -0
  524. package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
  525. package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
  526. package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
  527. package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
  528. package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
  529. package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
  530. package/.agents/tests/fm-composer-ghost.test.sh +716 -0
  531. package/.agents/tests/fm-composer-lib.test.sh +666 -0
  532. package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
  533. package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
  534. package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
  535. package/.agents/tests/fm-control.test.sh +910 -0
  536. package/.agents/tests/fm-crew-state.test.sh +1610 -0
  537. package/.agents/tests/fm-cursor-harness.test.sh +404 -0
  538. package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
  539. package/.agents/tests/fm-cursor-primary.test.sh +708 -0
  540. package/.agents/tests/fm-daemon.test.sh +2740 -0
  541. package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
  542. package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
  543. package/.agents/tests/fm-extension-binding.test.sh +2187 -0
  544. package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
  545. package/.agents/tests/fm-fleet-sync.test.sh +721 -0
  546. package/.agents/tests/fm-gate-refuse.test.sh +356 -0
  547. package/.agents/tests/fm-gitignore-config.test.sh +89 -0
  548. package/.agents/tests/fm-gotmp.test.sh +230 -0
  549. package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
  550. package/.agents/tests/fm-grok-harness.test.sh +117 -0
  551. package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
  552. package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
  553. package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
  554. package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
  555. package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
  556. package/.agents/tests/fm-herdr-lab.test.sh +243 -0
  557. package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
  558. package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
  559. package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
  560. package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
  561. package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
  562. package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
  563. package/.agents/tests/fm-kimi-harness.test.sh +687 -0
  564. package/.agents/tests/fm-lint-workflows.test.sh +532 -0
  565. package/.agents/tests/fm-lint.test.sh +1023 -0
  566. package/.agents/tests/fm-muse-harness.test.sh +932 -0
  567. package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
  568. package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
  569. package/.agents/tests/fm-on.test.sh +507 -0
  570. package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
  571. package/.agents/tests/fm-operational-input.test.sh +160 -0
  572. package/.agents/tests/fm-peek-remote.test.sh +110 -0
  573. package/.agents/tests/fm-pending-reply.test.sh +1288 -0
  574. package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
  575. package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
  576. package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
  577. package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
  578. package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
  579. package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
  580. package/.agents/tests/fm-pr-merge.test.sh +2135 -0
  581. package/.agents/tests/fm-procevent-quota.test.sh +225 -0
  582. package/.agents/tests/fm-procevent-when.test.sh +406 -0
  583. package/.agents/tests/fm-procevent.test.sh +1745 -0
  584. package/.agents/tests/fm-project-origin.test.sh +110 -0
  585. package/.agents/tests/fm-public-followup.test.sh +2272 -0
  586. package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
  587. package/.agents/tests/fm-quota-choose.test.sh +626 -0
  588. package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
  589. package/.agents/tests/fm-remote-doctor.test.sh +625 -0
  590. package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
  591. package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
  592. package/.agents/tests/fm-remote-job.test.sh +768 -0
  593. package/.agents/tests/fm-remote-reply.test.sh +520 -0
  594. package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
  595. package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
  596. package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
  597. package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
  598. package/.agents/tests/fm-review-diff.test.sh +176 -0
  599. package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
  600. package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
  601. package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
  602. package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
  603. package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
  604. package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
  605. package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
  606. package/.agents/tests/fm-send-inbox.test.sh +352 -0
  607. package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
  608. package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
  609. package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
  610. package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
  611. package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
  612. package/.agents/tests/fm-send-settle.test.sh +147 -0
  613. package/.agents/tests/fm-send-strict.test.sh +241 -0
  614. package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
  615. package/.agents/tests/fm-session-start.test.sh +2515 -0
  616. package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
  617. package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
  618. package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
  619. package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
  620. package/.agents/tests/fm-spawn-batch.test.sh +148 -0
  621. package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
  622. package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
  623. package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
  624. package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
  625. package/.agents/tests/fm-startup-network.test.sh +712 -0
  626. package/.agents/tests/fm-stow-cascade.test.sh +370 -0
  627. package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
  628. package/.agents/tests/fm-supervision-events.test.sh +156 -0
  629. package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
  630. package/.agents/tests/fm-tangle-guard.test.sh +277 -0
  631. package/.agents/tests/fm-task-delivery.test.sh +420 -0
  632. package/.agents/tests/fm-task-inbox.test.sh +513 -0
  633. package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
  634. package/.agents/tests/fm-teardown.test.sh +2665 -0
  635. package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
  636. package/.agents/tests/fm-test-fixtures.test.sh +132 -0
  637. package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
  638. package/.agents/tests/fm-test-run.test.sh +1196 -0
  639. package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
  640. package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
  641. package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
  642. package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
  643. package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
  644. package/.agents/tests/fm-transition-lib.test.sh +54 -0
  645. package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
  646. package/.agents/tests/fm-update.test.sh +304 -0
  647. package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
  648. package/.agents/tests/fm-voice-relay.test.sh +4741 -0
  649. package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
  650. package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
  651. package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
  652. package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
  653. package/.agents/tests/fm-wake-queue.test.sh +1224 -0
  654. package/.agents/tests/fm-watch-arm.test.sh +821 -0
  655. package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
  656. package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
  657. package/.agents/tests/fm-watch-triage.test.sh +3889 -0
  658. package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
  659. package/.agents/tests/fm-x-mode.test.sh +3042 -0
  660. package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
  661. package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
  662. package/.agents/tests/herdr-test-safety.sh +42 -0
  663. package/.agents/tests/lib.sh +315 -0
  664. package/.agents/tests/remote-herdr-fixture.sh +125 -0
  665. package/.agents/tests/secondmate-helpers.sh +193 -0
  666. package/.agents/tests/smoke.test.sh +93 -0
  667. package/.agents/tests/wake-helpers.sh +338 -0
  668. package/.agents/tests/zellij-test-safety.sh +60 -0
  669. package/.agents/tools/README.md +10 -0
  670. package/.agents/tools/bin/tasks-cli +267 -0
  671. package/.agents/tools/tasks-cli.ts +216 -0
  672. package/AGENTS.md +498 -0
  673. package/CHANGELOG.md +1913 -0
  674. package/LICENSE +1 -1
  675. package/NOTICE +63 -0
  676. package/README.md +114 -60
  677. package/RULES/01-domains.md +51 -0
  678. package/RULES/02-agents.md +78 -0
  679. package/RULES/03-houses.md +61 -0
  680. package/RULES/04-hoard.md +97 -0
  681. package/RULES/05-platforms.md +67 -0
  682. package/RULES/06-append-only.md +108 -0
  683. package/RULES/07-config.md +101 -0
  684. package/RULES/08-delivery-gate.md +75 -0
  685. package/RULES/09-electron.md +58 -0
  686. package/RULES/README.md +22 -0
  687. package/bin/README.md +107 -0
  688. package/bin/a2a-mcp.sh +133 -0
  689. package/bin/a2a-serve.py +103 -0
  690. package/bin/a2a-serve.sh +8 -0
  691. package/bin/a2a-talk.sh +50 -0
  692. package/bin/a2abridge-ensure.sh +108 -0
  693. package/bin/agent-run.sh +43 -0
  694. package/bin/agents-config.sh +256 -0
  695. package/bin/apodex-smoke-test.sh +105 -0
  696. package/bin/bifrost-bridge.sh +131 -0
  697. package/bin/bifrost-ingress.sh +77 -0
  698. package/bin/bootstrap-macos.sh +112 -0
  699. package/bin/bootstrap-windows.ps1 +112 -0
  700. package/bin/branch-guard.sh +64 -0
  701. package/bin/brokk +73 -0
  702. package/bin/brokk-classify-lib.sh +1770 -0
  703. package/bin/brokk-lease-lib.sh +222 -0
  704. package/bin/brokk-lease.sh +193 -0
  705. package/bin/brokk-lint.sh +65 -0
  706. package/bin/brokk-send.sh +51 -0
  707. package/bin/brokk-update.sh +9 -0
  708. package/bin/brokk-wake-grant.sh +127 -0
  709. package/bin/brokk-wake-lib.sh +1849 -0
  710. package/bin/changelog-assemble.sh +154 -0
  711. package/bin/changelog-guard.sh +197 -0
  712. package/bin/crash-sense.sh +173 -0
  713. package/bin/design-check.sh +80 -0
  714. package/bin/design-icon.sh +153 -0
  715. package/bin/desktop-place.sh +224 -0
  716. package/bin/docs-guard.sh +39 -0
  717. package/bin/editor-place.sh +225 -0
  718. package/bin/eindri-acclaim.sh +47 -0
  719. package/bin/eindri-control.sh +28 -0
  720. package/bin/eindri-role.sh +83 -0
  721. package/bin/eindri-seat.sh +83 -0
  722. package/bin/eindri-seen.sh +54 -0
  723. package/bin/eindri-send.sh +15 -0
  724. package/bin/eindri-start.sh +98 -0
  725. package/bin/eindri-watch.sh +57 -0
  726. package/bin/einherjar-spawn.sh +576 -0
  727. package/bin/eir-doctor.sh +158 -0
  728. package/bin/erindi-brief.sh +271 -0
  729. package/bin/feature-inventory.sh +73 -0
  730. package/bin/fleet-apply.sh +81 -0
  731. package/bin/github-deploy.sh +94 -0
  732. package/bin/gjallarhorn-expose.sh +136 -0
  733. package/bin/gjallarhorn-notify.sh +71 -0
  734. package/bin/gjallarhorn-purge.sh +67 -0
  735. package/bin/gjallarhorn-tunnel.sh +85 -0
  736. package/bin/gleipnir-lock-lib.sh +284 -0
  737. package/bin/groa-update.sh +130 -0
  738. package/bin/hall-snapshot.sh +111 -0
  739. package/bin/hamr-harness.sh +246 -0
  740. package/bin/heimdall-ssh-keys.sh +374 -0
  741. package/bin/herdr-agents.py +44 -0
  742. package/bin/herdr-ensure.sh +104 -0
  743. package/bin/herdr-run.sh +452 -0
  744. package/bin/hermes-ensure.sh +88 -0
  745. package/bin/hlidskjalf-agents.sh +172 -0
  746. package/bin/hlidskjalf-usage.sh +196 -0
  747. package/bin/hoard-guard.sh +135 -0
  748. package/bin/hoard-lib.sh +105 -0
  749. package/bin/hodd.sh +102 -0
  750. package/bin/host-sense.sh +199 -0
  751. package/bin/huginn-research-worker.sh +121 -0
  752. package/bin/local-model-lock.sh +70 -0
  753. package/bin/mimir-bridge.py +259 -0
  754. package/bin/mimir-bridge.sh +100 -0
  755. package/bin/mimir-ingest.sh +131 -0
  756. package/bin/mimir-reflect.sh +27 -0
  757. package/bin/mimir.sh +113 -0
  758. package/bin/mjollnir-webhook.sh +72 -0
  759. package/bin/mjollnir.sh +104 -0
  760. package/bin/model-hardware.sh +96 -0
  761. package/bin/model-resolve.sh +160 -0
  762. package/bin/models-detect.sh +178 -0
  763. package/bin/nornir-cron-start.sh +162 -0
  764. package/bin/nornir-job-daily-briefing.sh +191 -0
  765. package/bin/nornir-job-git-sync.sh +152 -0
  766. package/bin/nornir-job-hall-snapshot.sh +28 -0
  767. package/bin/nornir-job-memory-housekeeping.sh +114 -0
  768. package/bin/nornir-job-nsr-compliance.sh +54 -0
  769. package/bin/nornir-job-observer.sh +166 -0
  770. package/bin/nornir-job-skillopt-sleep.sh +76 -0
  771. package/bin/npm-publish.sh +136 -0
  772. package/bin/omarchy-hook-install.sh +60 -0
  773. package/bin/omarchy-install.sh +161 -0
  774. package/bin/omarchy-plugins.sh +187 -0
  775. package/bin/omarchy-sense.sh +162 -0
  776. package/bin/perm-guard.sh +30 -0
  777. package/bin/pi-agent.sh +68 -0
  778. package/bin/pi-ensure.sh +77 -0
  779. package/bin/pi-local.sh +37 -0
  780. package/bin/pi-model-agnostic.sh +71 -0
  781. package/bin/pi-seat.sh +63 -0
  782. package/bin/prereq-ensure.sh +166 -0
  783. package/bin/private-guard.sh +58 -0
  784. package/bin/project-git.sh +69 -0
  785. package/bin/public-guard.sh +71 -0
  786. package/bin/ratatoskr.sh +49 -0
  787. package/bin/realm-lib.sh +32 -0
  788. package/bin/repo-scrub.sh +62 -0
  789. package/bin/rodd-operational-input.sh +250 -0
  790. package/bin/runes-append.sh +198 -0
  791. package/bin/saga-session-start.sh +172 -0
  792. package/bin/saga-sessionstart-run.sh +79 -0
  793. package/bin/saga-wake-drain.sh +41 -0
  794. package/bin/secret-guard.sh +63 -0
  795. package/bin/sessrumnir-ensure.sh +100 -0
  796. package/bin/sessrumnir-sync.sh +237 -0
  797. package/bin/sessrumnir.sh +104 -0
  798. package/bin/skillopt-setup.sh +76 -0
  799. package/bin/skuld-branch-outcome.sh +203 -0
  800. package/bin/skuld-branch-prompt.sh +101 -0
  801. package/bin/smidja-bootstrap.sh +94 -0
  802. package/bin/smidja-observe.sh +86 -0
  803. package/bin/syn-arm-pretool-check.sh +57 -0
  804. package/bin/syn-asset-pretool-check.sh +89 -0
  805. package/bin/syn-cd-pretool-check.sh +28 -0
  806. package/bin/syn-guard-pretool-check.sh +83 -0
  807. package/bin/syn-spawn-pretool-check.sh +58 -0
  808. package/bin/syn-turnend-guard.sh +36 -0
  809. package/bin/syn-watch-arm.sh +99 -0
  810. package/bin/tailscale-sync.sh +203 -0
  811. package/bin/telegram-bot.sh +82 -0
  812. package/bin/toolchain.sh +74 -0
  813. package/bin/ui-truth-check.sh +75 -0
  814. package/bin/utgard.sh +111 -0
  815. package/bin/valhalla.sh +115 -0
  816. package/bin/valknut-load.sh +298 -0
  817. package/bin/vor-crew-state.sh +124 -0
  818. package/bin/wedge-notify.sh +60 -0
  819. package/bin/workspace-provision.sh +80 -0
  820. package/bin/workspace-rag.sh +163 -0
  821. package/bin/wyrd-db.sh +47 -0
  822. package/bin/yggdrasil.sh +152 -0
  823. package/bin/ymir-edit.sh +145 -0
  824. package/bin/ymir-install.sh +806 -0
  825. package/bin/ymir-invite.sh +93 -0
  826. package/bin/ymir-isolation.sh +88 -0
  827. package/bin/ymir-migrate.sh +61 -0
  828. package/bin/ymir-plan.sh +356 -0
  829. package/bin/ymir-platform.sh +348 -0
  830. package/bin/ymir-say.sh +110 -0
  831. package/bin/ymir-setup-auth.sh +119 -0
  832. package/bin/ymir-validate.sh +193 -0
  833. package/bin/ymir.js +74 -16
  834. package/docs/Architecture.md +339 -0
  835. package/docs/design.md +351 -0
  836. package/docs/installations/README.md +63 -0
  837. package/docs/installations/ymir-home.md +93 -0
  838. package/docs/integration.md +105 -0
  839. package/docs/lore.md +1060 -0
  840. package/docs/research/agent-harnesses.md +290 -0
  841. package/docs/runbooks/README.md +19 -0
  842. package/docs/runbooks/a2a.md +91 -0
  843. package/docs/runbooks/agent-permissions.md +99 -0
  844. package/docs/runbooks/agents.md +57 -0
  845. package/docs/runbooks/models.md +69 -0
  846. package/docs/runbooks/realm-onboarding.md +60 -0
  847. package/docs/runbooks/secrets-and-hoard.md +60 -0
  848. package/docs/runbooks/updates-and-migrations.md +110 -0
  849. package/docs/runbooks/worktrees-isolation.md +72 -0
  850. package/docs/session-start.md +105 -0
  851. package/docs/skillopt-integration.md +321 -0
  852. package/docs/sync-system.md +66 -0
  853. package/docs/workspaces.md +104 -0
  854. package/docs/ymir-rut.md +260 -0
  855. package/package.json +54 -14
  856. package/packaging/build.sh +74 -0
  857. package/packaging/macos/Ymir Installer.command +43 -0
  858. package/packaging/windows/ymir-setup.nsi +74 -0
  859. package/scripts/README.md +22 -0
  860. package/scripts/electron.sh +269 -0
  861. package/scripts/lower.sh +34 -0
  862. package/scripts/raise.sh +42 -0
  863. package/scripts/start.sh +217 -0
  864. package/scripts/stop.sh +113 -0
  865. package/install.sh +0 -35
@@ -0,0 +1,763 @@
1
+ # Installation & First Setup — stand the whole system up
2
+
3
+ > **Purpose:** Everything Galdr must know to install, provision, and repair
4
+ > Ymir for an operator who does not have it. The code is authoritative; this
5
+ > page is the map.
6
+
7
+ One command sets up the whole system for the user; it self-heals what it can and
8
+ reports what it cannot. It **asks for consent first** — with a plan it computes on
9
+ this host, not a recited paragraph — and it **validates at the end** that what it
10
+ claims is actually running.
11
+
12
+ ```
13
+ bin/ymir-install.sh # the first setup (idempotent; asks to proceed)
14
+ bin/ymir-install.sh --plan # the plan, probed — changes nothing (--json too)
15
+ bin/ymir-install.sh --check # report only, no writes, no prompt
16
+ bin/ymir-install.sh --yes # non-interactive (accept the plan)
17
+ bin/ymir-install.sh --skip-engines --skip-services
18
+ bin/ymir-install.sh --no-desktop # don't open the desktop apps at the end
19
+ bin/ymir-install.sh --status # alias of --check
20
+ ```
21
+
22
+ ## The plan comes first — `bin/ymir-plan.sh`
23
+
24
+ The consent a real install asks for is a **computed plan**, one row per step, each
25
+ carrying its state and the reason for it. A hardcoded paragraph cannot know the
26
+ host: the old one named an Omarchy version on a Mac, promised a workspace tree that
27
+ already stood, and never mentioned that no application had been installed at all.
28
+
29
+ ```
30
+ bin/ymir-plan.sh # the plan (TOON)
31
+ bin/ymir-plan.sh --json # the same, for automation
32
+ bin/ymir-plan.sh --phase 5 # one phase
33
+ bin/ymir-plan.sh --blocked # only what cannot proceed, and why
34
+ ```
35
+
36
+ ```
37
+ plan_states[5]{state,means}:
38
+ "DO","a change will be made"
39
+ "SKIP","already satisfied — nothing to do"
40
+ "INFO","a fact about this host, discovered; no change implied"
41
+ "BLOCKED","cannot run — the reason names what is missing"
42
+ "CONSENT","needs the operator's word (a credential, an invite, the shells)"
43
+ ```
44
+
45
+ ```
46
+ plan_phases[9]{n,name,gate}:
47
+ "0","resolve","this host, the container engine, the code root, and the home"
48
+ "1","code","the tree is intact — and holds nothing of the operator's"
49
+ "2","home","the operator's world, outside the tree"
50
+ "3","runtimes","git/python3 · bun/uv/mcp<2> · pi · hermes · the terminal backend"
51
+ "4","engines","treehouse · no-mistakes · sandcastle · the Utgard image"
52
+ "5","apps","hlidskjalf · odrerir · sessrumnir · smidja — web build required, shell gated"
53
+ "6","wire","the way in (auth · invite) and the launcher entries"
54
+ "7","raise","every port listening, then the desktop apps"
55
+ "8","verify","what stands, honestly"
56
+ ```
57
+
58
+ `ymir-install.sh` prints the plan at the consent prompt; `--plan`/`--dry-run` prints
59
+ it and exits without writing. The plan is recomputed on every run, so it cannot
60
+ drift behind the code the way a paragraph did. `bin/ymir-plan.sh` is the ward for
61
+ the law below: its phase-1 `purity` row names any of the operator's things found in
62
+ the code tree.
63
+
64
+ ## Where things live — the package is code, the home is the operator's
65
+
66
+ **Law (Rule 04):** the package carries the **core systems** — everything needed to
67
+ run the programs. Everything the **operator** owns goes to `$YMIR_HOME`: their
68
+ info, their records, their documents, their settings, their state, their
69
+ credentials. A packaged install (npm) treats its tree as read-only; the next
70
+ upgrade replaces it, so anything of theirs kept there is kept at its peril.
71
+
72
+ ```
73
+ roots[5]{root,resolves_from,holds}:
74
+ "ymir_home_root","$YMIR_HOME → the choice recorded at installation → one documented default","everything private the operator owns"
75
+ "hoard_root","$YMIR_HOARD → <home>/hodd","docs · secrets · identity · tenants · memory"
76
+ "hoard_data_dir","$YMIR_DATA_DIR → <hoard>/data","this machine's records: operator, fleet, machines, the host profile"
77
+ "hoard_state_dir","$YMIR_STATE_DIR → <home>/state","runtime state: pids, logs, locks, caches"
78
+ "hoard_settings_dir","$YMIR_SETTINGS_DIR → <home>/config","settings: agents.yaml, cron.yaml, tailscale-sync, the wedge channel"
79
+ ```
80
+
81
+ Plus `hoard_local_env` → `$YMIR_HOME/.env.local`: the operator's **credentials**
82
+ (`HLIDSKJALF_AUTH`, OAuth keys, tokens), never in the tree.
83
+
84
+ **The home is chosen, not assumed.** A real interactive install asks once
85
+ (`step_home`), records the answer as machine state under `~/.config/ymir/home`
86
+ (the same place `engram-python` and `accounts.json` live), and every later script
87
+ resolves it through `bin/hoard-lib.sh`. `--check` never writes; `--yes` takes what
88
+ is recorded, else the documented default.
89
+
90
+ ```bash
91
+ bin/hoard-lib.sh # the lib (source-safe; functions only)
92
+ ymir_home_root HOME # → the home
93
+ hoard_settings_dir SETTINGS # → <home>/config
94
+ hoard_local_env ENVFILE # → <home>/.env.local
95
+ ```
96
+
97
+ **Rule for new code:** never write `$ROOT/data`, `$ROOT/state`, `$ROOT/config`,
98
+ `$ROOT/.env.local` or `$ROOT/workspace`. Resolve the root through the lib. A script
99
+ that points an operator's thing into the tree is the bug the `purity` row exists to
100
+ catch.
101
+
102
+ ### Carrying an existing tree home — migration 0005
103
+
104
+ Every *writer* resolves the home now, but an installation made before this change
105
+ still holds the operator's things in the tree. `.agents/migrations/0005-roots-out-of-tree.sh`
106
+ carries them:
107
+
108
+ ```
109
+ what moves from to
110
+ ------------------ --------------------- ----------------------------
111
+ this machine's data/ <hoard>/data
112
+ records
113
+ runtime state state/ <home>/state
114
+ (pids · logs · (including the (running services keep their open
115
+ locks · the applied-migrations fds across the move — `mv` keeps
116
+ applied-marker) marker) the inode)
117
+ credentials the local env file $YMIR_HOME/.env.local (0600)
118
+ settings .agents/config/* <home>/config
119
+ that git does NOT track
120
+ ```
121
+
122
+ One name, two files — the migration decides by evidence, never by assumption:
123
+
124
+ ```
125
+ collision[3]{case,what_happens,nothing_lost}:
126
+ "identical content","the tree's copy is removed","the content is provably at home already"
127
+ "different content","the home's keeps the name; the tree's is carried beside it as <name>.stale-<UTC>","both are real, so both are kept — never merged, never discarded"
128
+ "not a plain file","left in place and reported","a directory is not silently swallowed"
129
+ ```
130
+
131
+ Templates and defaults never move: `*.example` (and `*.example.*`), `.gitkeep`, and
132
+ any settings file **git tracks** — that is the distro's shipped default, not the
133
+ operator's. The plan's `purity` row applies the same rule, asking git about the
134
+ real path (the tree's `config` is a symlink into `.agents/config`, and git tracks
135
+ what the index holds, not the link). Idempotent: a second run changes nothing.
136
+
137
+ ```bash
138
+ bin/ymir-migrate.sh status # pending / applied
139
+ bin/ymir-migrate.sh apply --dry-run # name the migration, touch nothing
140
+ bin/ymir-migrate.sh apply # carry it
141
+ ```
142
+
143
+ Stop the runtime first if you want no stale pid files; nothing is lost either way.
144
+
145
+ ## The app packages — how the four surfaces arrive
146
+
147
+ The distro depends on the surfaces as their own npm packages, so one
148
+ `npm install -g @zerwiz/ymir` fetches them into the tree:
149
+
150
+ ```
151
+ app_packages[4]{package,repo,what}:
152
+ "@zerwiz/hlidskjalf","zerwiz/hlidskjalf","the control plane — dist/ ships built, served on :3888"
153
+ "@zerwiz/odrerir","zerwiz/odrerir","the live hall — dist/ ships built"
154
+ "@zerwiz/sessrumnir","zerwiz/sessrumnir","the seat-hall desktop — out/ ships built (a fork of pi-desktop)"
155
+ "@zerwiz/smidja-factory","zerwiz/smidja","the smithy and its visualizer — the factory plus the UI's source, built at install"
156
+ ```
157
+
158
+ They are **optionalDependencies**, deliberately: a broken app package must never
159
+ stop the CORE from installing, and a package not yet on the registry is skipped by
160
+ npm and starts arriving the moment it is published. The plan's phase-5 rows report
161
+ each surface separately — installed, declared-but-not-fetched, or no package at all
162
+ — so a silent skip cannot hide.
163
+
164
+ A global install nests them under the distro's own `node_modules`
165
+ (`<prefix>/lib/node_modules/@zerwiz/ymir/node_modules/@zerwiz/<app>`); a local one
166
+ hoists them to `node_modules/@zerwiz/<app>`. The plan checks both shapes.
167
+
168
+ ```
169
+ bin/npm-publish.sh # the platform only
170
+ bin/npm-publish.sh --all # the platform + every app package
171
+ bin/npm-publish.sh --dry-run --all # what would go out, and from where
172
+ bin/npm-publish.sh --unpublish @zerwiz/ymir@0.1.5 # take ONE version back
173
+ ```
174
+
175
+ **A version can be taken back, and the window is short.** npm permits unpublishing
176
+ **one version for 72 hours** after it was published; past that it is npm support's
177
+ door. So `--unpublish` demands a spec that names the version — never a bare name —
178
+ and the row says where the CDN may still serve the tarball for a while afterwards.
179
+ Publishing a newer version is the other half of the repair: it moves the `latest`
180
+ tag off the bad build at once, even before the removal propagates.
181
+
182
+ **A `files[]` entry that names a directory overrides `.gitignore`.** This is how
183
+ `@zerwiz/ymir@0.1.5` shipped the memory well: `files: [".agents/"]` packed that
184
+ subtree *including* the gitignored stores, and the repo stayed clean while the
185
+ artefact did not. Name what ships, exclude what must not, and prove it with
186
+ `npm pack --dry-run` — the repo's cleanliness says nothing about the tarball.
187
+
188
+ The app repos are cloned into `apps/` by the install's `apps` step (from the
189
+ registry's `repo: apps/<path>` blocks), which is where `--all` reads their
190
+ manifests. The token comes from the hoard, never from `~/.npmrc`.
191
+
192
+ ## The steps
193
+
194
+ ```
195
+ install[23]{step,what,self-heals}:
196
+ "panes","the run shown in a herdr pane","bin/herdr-run.sh sits a pane beside the caller when inside herdr; inline otherwise — a pane that cannot be raised never loses the work"
197
+ "prereqs","git python3 bun docker|podman gh · mcp<2","bin/prereq-ensure.sh installs bun+uv+mcp in user space; engram is an honest optional SKIP"
198
+ "memory-well","the engram engine (Mimirsbrunn)","optional; reported with the exact next command, never a fake fix"
199
+ "home","the home the operator CHOOSES, recorded under ~/.config/ymir/home","asks once, records the answer; --check never writes, --yes takes what is recorded, else the documented default"
200
+ "tree","workspace/{work,personal}/<domains>, companies/, workspaces.yaml, projects.yaml, and the hoard OUTSIDE the repo (secrets/ · docs/ · identity/ · tenants/ at the hoard root under the chosen home)","creates if missing; hoard_root resolves through bin/hoard-lib.sh so no script can point the hoard inside the checkout (Rule 04), and an empty secrets/platform.env (0600) is seeded so bin/hodd.sh emit resolves"
201
+ "apps","the app repos (the app split) — hlidskjalf · hlidskjalf-mobile · odrerir · sessrumnir · smidja","reads $HOARD/identity/projects.yaml (never guesses a remote); clones a missing apps/<path> from its registered git{} block, fast-forwards a present one, and stamps the smithy engine (apps/smidja) from the cloned factory's templates"
202
+ "engines","treehouse · sandcastle · no-mistakes","installs treehouse + no-mistakes from their installers"
203
+ "hermes","the Nous Research agent runtime","installs via bin/hermes-ensure.sh when absent"
204
+ "sessrumnir","the Sessrúmnir desktop GUI (its own repo; lands via the `apps` step at apps/sessrumnir)","bin/sessrumnir-ensure.sh installs deps + builds on first run (deps are never committed); launch via bin/sessrumnir.sh"
205
+ "backend","Þjazi — herdr (protocol 14+) or tmux","bin/herdr-ensure.sh detects/tests version, installs via the pinned installer or falls back to tmux"
206
+ "host","this machine — sensed on EVERY host","bin/host-sense.sh senses the setup on ANY host (Rule 05); the Omarchy layer then RECORDS it (bin/omarchy-sense.sh observe), places the apps (bin/desktop-place.sh), installs the post-update hook and the wedge-alarm channel, and (on Omarchy) offers the suggested shell plugins — listed, never installed unbidden; seeds the private config/agents.yaml from its example"
207
+ "sandbox","utgard-runner:latest image","builds via bin/utgard.sh build on Docker or rootless Podman; distinguishes an unreachable engine from a build failure"
208
+ "memory","engram store + harness MCP registrations","raises the bridge; reports MCP coverage"
209
+ "smidja","smidja/smidja_data/smidja.db","bin/smidja-bootstrap.sh creates it from the tracer schema + a bootstrap session"
210
+ "visualizer","the Smíðja visualizer UI (Vue, served on :8437)","builds ./dist with bun when absent — the API serves the UI from dist, and without it the API answers but shows no interface"
211
+ "loaders","agents/skills into the harnesses","runs bin/valknut-load.sh"
212
+ "gates","the git delivery gates — secret-guard (pre-commit), branch-guard + changelog-guard (pre-push)","bin/secret-guard.sh --install and bin/changelog-guard.sh --install seat the versioned guards into .git/hooks, so the gate is live from the first commit of a fresh clone; idempotent"
213
+ "marks","each app's rune icon + .desktop entry into the operator's own desktop, and the Ymir contract into pi's agent home","bin/design-icon.sh mint --all + install writes to $HOME/.local/share (never a session sandbox), so every app is dockable and pinnable; the contract symlink means every pi session, in ANY folder, loads Brokk"
214
+ "invite","the way in for anyone else — an invite code","bin/ymir-invite.sh ensure mints one only when nothing is live, so the step is idempotent; the code is printed at the end of the run and again in workspace/INSTALL.md"
215
+ "register","workspace/INSTALL.md","writes the record"
216
+ "services","gate API, SPA, Nornir, bridges, visualizer","raises via scripts/start.sh (which builds the visualizer UI when ./dist is absent)"
217
+ "desktop","Hlidskjalf + Smíðja desktop apps","bin/desktop-place.sh puts each on its OWN numbered desktop (preferring EMPTY ones); scripts/electron.sh start --both self-heals the Electron binary"
218
+ "validate","the running system","bin/ymir-validate.sh — live port/store/process checks"
219
+ ```
220
+
221
+ **25** `step_*` functions are defined (`home` asks, `tree` builds). A step is not a row: one step may emit
222
+ several. `prereqs` also emits `memory-well`, `host` also emits `agents-config`,
223
+ `smidja` also emits `visualizer`, and `spa` also emits `hlidskjalf`. `--check`
224
+ skips the runtime-only steps (`services`, `desktop`, `validate`), which have
225
+ nothing to report when the runtime is not raised, so a real run prints those
226
+ three in addition. The exact set is whatever the host honestly has — never
227
+ assume the count:
228
+
229
+ ```bash
230
+ bash bin/ymir-install.sh --check | grep -cE '^ "' # the honest count, on your host
231
+ ```
232
+
233
+ ## Configuration is never hardcoded (Rule 07)
234
+
235
+ Every port, host, endpoint, path, and credential is resolved from env/config with
236
+ **one documented default** — never a literal in shipped runtime. Ports read
237
+ `HLIDSKJALF_PORT` / `HLIDSKJALF_API_PORT` / `SMIDJA_VIZ_API_PORT`, the SPA bind
238
+ host reads `HLIDSKJALF_HOST`, and a deployment overrides them in its env file
239
+ (Quadlet/Compose), never by patching the core. Law: `RULES/07-config.md`.
240
+
241
+ ## Container engine: Docker **or** rootless Podman
242
+
243
+ The core never assumes an engine binary. `bin/ymir-platform.sh` resolves whichever
244
+ this host can reach (`YMIR_CONTAINER_ENGINE` forces one) and exposes:
245
+
246
+ - `ymir_container_engine` / `ymir_container_engine_name` — `docker` or `podman`.
247
+ - `ymir_engine_is_podman` — true even when a `docker` binary fronts Podman (the
248
+ podman-docker shim).
249
+ - `ymir_volume_suffix` — `:Z` whenever SELinux is enforcing (Docker and Podman
250
+ both need the relabel), else empty.
251
+ - `ymir_rootless_podman` — rootless Podman needs `--userns=keep-id` so a bind
252
+ mount lands owned by the invoking user.
253
+
254
+ `bin/utgard.sh`, `bin/einherjar-spawn.sh`, `bin/valhalla.sh`, `bin/ymir-validate.sh`,
255
+ this installer, and `bin/prereq-ensure.sh` all use these; none names an engine
256
+ directly. **Quadlet**-managed containers (Podman + systemd) surface as
257
+ `systemd --user` units, which the process hall lists. A host-managed deployment
258
+ layer (Quadlet, compose, bare) sits **over** this agnostic core — never inside it.
259
+
260
+ ## The visualizer UI
261
+
262
+ The Smíðja visualizer **API** runs on `:8437` and serves its **UI** from
263
+ `apps/visualizer/dist`. A fresh clone has no `dist`, so the API answers but shows
264
+ "No ./dist build found" — an install gap. The installer (and `scripts/start.sh`)
265
+ now build it when absent:
266
+
267
+ ```bash
268
+ (cd .agents/skills/smidja-factory/apps/visualizer && bun run build) # vue-tsc + vite
269
+ ```
270
+
271
+ `bin/ymir-validate.sh` reports `visualizer` FAIL when `./dist` is missing **and**
272
+ when the build exists but nothing is listening on `:8437`. A PASS means the UI is
273
+ built *and* the API is up — so a built-but-dead visualizer (a bad `CMD_DB`, a
274
+ crashed API) can no longer read as green.
275
+
276
+ ## Desktop placement (Omarchy desktops, not monitors)
277
+
278
+ On Omarchy the numbered **desktops** (1 2 3 4 5 …) are the "screens" an operator
279
+ switches between. `bin/desktop-place.sh` gives each Ymir app its **own** desktop,
280
+ **preferring an empty one**, so the apps open separated and reachable with
281
+ `Super+<n>` rather than stacking on the active desktop.
282
+
283
+ ```
284
+ bin/desktop-place.sh plan # which desktop each app would take
285
+ bin/desktop-place.sh apply # write the rules + hyprctl reload
286
+ bin/desktop-place.sh status # what is installed
287
+ ```
288
+
289
+ It writes `~/.config/hypr/ymir-desktops.lua` using Omarchy's own idiom —
290
+ `o.window({ class = "^ymir-hlidskjalf$" }, { workspace = "2" })` — and adds one
291
+ `require("hypr.ymir-desktops")` line to the user's `hyprland.lua`. It **never**
292
+ touches `/usr/share/omarchy/`. Verify with `hyprctl configerrors` (must be empty).
293
+ On a non-Omarchy host the step is a clean SKIP.
294
+
295
+ ## The Þjazi backend (herdr-first)
296
+
297
+ Ymir spawns agents into terminal panes, so a terminal backend must exist. Ymir is
298
+ **herdr-first**: `herdr` (Þjazi) is preferred, `tmux` is the accepted reference
299
+ backend, and a missing backend is reported — never a silent fallback.
300
+
301
+ ```
302
+ backend_priority[3]{rank,backend,note}:
303
+ "1","herdr","preferred; protocol 14+ for panes, 0.8.0+ for presentation spaces"
304
+ "2","tmux","verified reference backend; always acceptable"
305
+ "3","none","spawn is refused with a plain reason"
306
+ ```
307
+
308
+ ```
309
+ bin/herdr-ensure.sh status # what is present, and does it meet the floor
310
+ bin/herdr-ensure.sh ensure --install # install via the pinned, SHA-verified installer
311
+ ```
312
+
313
+ `ensure` installs through `.agents/backend/fm-install-herdr.sh` (exact version +
314
+ protocol check), and falls back to reporting `tmux` when herdr cannot be fetched.
315
+ Selection order for the running system: `config/backend` → `BROKK_BACKEND` →
316
+ `HERDR_ENV=1` → else tmux. Full reference: the `ymir` skill, `assets/thjazi.md`.
317
+
318
+ ## Suggested Omarchy plugins (offered, never forced)
319
+
320
+ Omarchy's shell is plugin-shaped, and a few registry plugins are Ymir's own organs
321
+ rendered on the desktop. `bin/omarchy-plugins.sh` suggests them and installs only
322
+ what the Allfather accepts.
323
+
324
+ ```
325
+ bin/omarchy-plugins.sh list # what Ymir suggests, and why
326
+ bin/omarchy-plugins.sh installed # reads omarchy's own plugin list
327
+ bin/omarchy-plugins.sh suggest # the offer (no install)
328
+ bin/omarchy-plugins.sh add <id> # install one, with consent
329
+ ```
330
+
331
+ The core three are Ymir's organs: **Herdr Watch** (Þjazi in the bar), **Hermes
332
+ Deck** (our worker runtime), **Skill Manager** (the Galdr family across harnesses).
333
+ Installation uses Omarchy's own verb — `omarchy plugin add <repo> --enable` — never
334
+ a raw clone.
335
+
336
+ **These run unsandboxed inside the shell.** The registry "validates listings, not
337
+ plugin security", so nothing installs without an explicit yes (`--yes` for
338
+ non-interactive callers; without it a non-interactive `add` refuses with exit 3).
339
+ The installer only *offers*.
340
+
341
+ ## Consent
342
+ A real install prints **the plan it computed** (`bin/ymir-plan.sh`) and waits for
343
+ `[y/N]`. Declining changes nothing (exit 3). `--check` and `--plan` never prompt.
344
+ A non-interactive caller without `--yes` is refused rather than silently
345
+ proceeding.
346
+
347
+ The plan names every step with its state and the reason for it — including the
348
+ home the operator is asked to choose, the four app surfaces and whether each can
349
+ be installed at all, the terminal backend, and what will be skipped and why. The
350
+ state vocabulary is `DO · SKIP · INFO · BLOCKED · CONSENT`.
351
+
352
+ `--check` writes nothing — and that includes the migrations. `bin/ymir-migrate.sh
353
+ apply` **moves private data**, so the step chain runs it only on a real run;
354
+ a preview leaves the home exactly as it found it. (It used to apply them even
355
+ under `--check`, which moved a home during a "report only" pass.)
356
+
357
+ ## The operator's way in (auth) — `bin/ymir-setup-auth.sh`
358
+
359
+ A fresh checkout seeds **no credential**, so the gate has no way in until the
360
+ operator sets one. `step_auth` (interactive install prompts; `--yes`/non-tty
361
+ defers) covers two doors:
362
+
363
+ ```bash
364
+ bin/ymir-setup-auth.sh status # which door (if any) is configured
365
+ bin/ymir-setup-auth.sh set [--user U] # a local password -> HLIDSKJALF_AUTH in .env.local
366
+ bin/ymir-setup-auth.sh github # GitHub sign-in -> GITHUB_CLIENT_ID + GITHUB_CLIENT_SECRET
367
+ ```
368
+
369
+ Both write `.env.local` (0600, gitignored); a secret is never printed or put in a
370
+ child process's argv. The gate reads `HLIDSKJALF_AUTH` (`user:pass`) and the
371
+ GitHub OAuth keys (`/api/auth/github`; sign-in names a login but never grants
372
+ access on its own — an account/invite is still required). Restart the gate after
373
+ setting a credential. One login is meant to cover every surface — see the shared
374
+ session below.
375
+
376
+ ## Letting someone else in (invites)
377
+
378
+ One operator owns the instance. The installer mints an **invite code**
379
+ (`step_invite`) and prints it at the end of the run; share that code and someone
380
+ else can create their own account at the gate login screen. Registration is
381
+ closed unless a live code exists, so an instance is never accidentally open.
382
+
383
+ ```bash
384
+ bin/ymir-invite.sh mint [--limit N] # a new code (default ceiling 5 accounts)
385
+ bin/ymir-invite.sh list # every code, what is spent, who is in
386
+ bin/ymir-invite.sh revoke <CODE> # take one back, now
387
+ bin/ymir-invite.sh where # where the accounts live on this machine
388
+ ```
389
+
390
+ Accounts are stored in `~/.config/ymir/accounts.json` (mode `0600`), machine
391
+ state that never enters the repo, with argon2id hashes only. The operator's own
392
+ credentials stay `HLIDSKJALF_AUTH` in `.env.local` — invites are for everyone
393
+ *else*. Full surface: the galdr `hlidskjalf-ui.md` asset.
394
+
395
+ ## Validation
396
+
397
+ After the runtime is up, `bin/ymir-validate.sh` observes the result: prerequisites,
398
+ the Utgard image, the gate API (`:3889`), the SPA (`:3888`), Bifrost (`:4603`),
399
+ Nornir cron, `smidja.db`, the desktop apps, the well (`:4602`), and the audit
400
+ ledger. A FAIL means the install is not usable; a WARN means a documented-optional
401
+ part is off. `--json` for machine consumption.
402
+
403
+ ## What the system adopts (engines)
404
+
405
+ | Engine | Norse shell | Role |
406
+ |---|---|---|
407
+ | **treehouse** (`kunchenguid/treehouse`) | Yggdrasil | reusable worktree pool |
408
+ | **sandcastle** (`mattpocock/sandcastle`) | Utgard | Docker/Podman/Vercel sandboxes |
409
+ | **no-mistakes** (`kunchenguid/no-mistakes`) | Mjollnir · Glitnir | clean-PR validation gate |
410
+ | **Hermes** (`NousResearch/hermes-agent`, MIT) | — (product name) | worker agent runtime: own brain, memory, skills, subagents, sandbox backends |
411
+ | **pi-desktop** (`FaqFirebase/pi-desktop`, Apache-2.0) | **Sessrúmnir** (cloned from its own repo to `apps/sessrumnir` at install) | desktop GUI for the Pi/OMP coding agents — the seat-hall, themed with the Ymir way-of palette |
412
+
413
+ ## Missing dependencies
414
+
415
+ - **Fixable in user space** (no sudo): `bun`, `uv`, `mcp<2>` — via
416
+ `bin/prereq-ensure.sh`. `treehouse`, `no-mistakes`, **Hermes**, and the **Þjazi
417
+ backend** (herdr, or tmux) are installed by their own ensure/steps.
418
+ - **Needs a system package** (reported with the exact command): `git`,
419
+ `python3`, `docker`, `gh`.
420
+ - **Optional, honest SKIP:** the `engram` memory engine. The published PyPI
421
+ `engram` is **not** Ymir's engine (it is an unrelated scientific package), so
422
+ the installer reports the well as off rather than installing the wrong thing.
423
+ - **Offline:** engine/Hermes/herdr installers fail gracefully and are reported;
424
+ re-run when the network returns.
425
+
426
+ ## Hermes specifically (`bin/hermes-ensure.sh`)
427
+
428
+ ```
429
+ hermes-ensure.sh status # hermes[1]{installed,version,path,method}
430
+ hermes-ensure.sh ensure --install # install if absent, then report
431
+ hermes-ensure.sh install # curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
432
+ ```
433
+
434
+ A user who lacks Hermes gets it at setup (`hermes` step). Config/identity
435
+ (`hermes setup`, auth) stays the user's own; Ymir guarantees only the runtime.
436
+
437
+ ## Sessrúmnir specifically (`bin/sessrumnir-ensure.sh`, `bin/sessrumnir.sh`)
438
+
439
+ ```
440
+ sessrumnir-ensure.sh status # sessrumnir[1]{dir,deps,built,electron}
441
+ sessrumnir-ensure.sh ensure --install # install deps + build when absent, then report
442
+ sessrumnir-ensure.sh install # npm install + electron-binary heal + npm run build
443
+ sessrumnir.sh start [path] # launch the seat-hall (deps installed on first run)
444
+ sessrumnir.sh status | stop
445
+ ```
446
+
447
+ Deps are never committed; the ensure step installs them on first run, exactly as
448
+ `scripts/electron.sh` does for the other desktop apps. The external engine keeps
449
+ its product name `pi-desktop`; the GUI the user sees is Sessrúmnir, themed with
450
+ Ymir's deep-navy palette. The Omarchy launcher entry is rendered from
451
+ `apps/sessrumnir/resources/ymir-sessrumnir.desktop.in` by `bin/desktop-place.sh`
452
+ (placement + `SUPER+B`).
453
+
454
+ ## Neutral tenant defaults — a fresh Ymir is a distro, not the company
455
+
456
+ A fresh install ships **no company of its own**. `bin/ymir-install.sh` seeds one
457
+ `personal` workspace and an **empty** projects registry (a commented example
458
+ only); it never writes a company slug, a company remote, or a `work (company: …)`
459
+ line. The runtime resolves the active realm **neutrally** through
460
+ `bin/realm-lib.sh` (`ymir_active_realm`): `data/realm.md` (first line) → the first
461
+ non-example tenant under `svartalfaheim/` → `default`. **No script may fall back
462
+ to a company slug.** The reference tenant the distro was built for lives at
463
+ `svartalfaheim/examples/wayof/` — an example to copy, never the default. A `work`
464
+ workspace must name its own company: `workspace-provision.sh` requires
465
+ `--company <slug>`.
466
+
467
+ ## Per-workspace provisioning
468
+
469
+ ```
470
+ bin/workspace-provision.sh <name> --kind work|personal [--domains a,b,c] [--company <slug>]
471
+ ```
472
+
473
+ Creates `workspace/<name>/<domains>/`, registers it in `workspaces.yaml`, and
474
+ for a **work** workspace attaches it to the tenant container
475
+ `svartalfaheim/<company>/`. `--company` is required for a work workspace — the
476
+ company is the operator's to name; Ymir ships no default.
477
+
478
+ ## Verify
479
+
480
+ ```
481
+ bin/ymir-install.sh --check # all steps OK/WARN
482
+ bin/ymir-validate.sh # the running system actually works
483
+ bin/herdr-ensure.sh status # the Þjazi backend and its protocol floor
484
+ bin/host-sense.sh # sense THIS machine (any host)
485
+ bin/omarchy-sense.sh status # the Omarchy recording (Omarchy hosts)
486
+ bin/saga-session-start.sh # the session digest
487
+ bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh
488
+ ```
489
+
490
+ On **every** host the installer senses the machine with `bin/host-sense.sh`. On
491
+ an **Omarchy** host the layer also *records* it (`bin/omarchy-sense.sh observe`)
492
+ and installs a `post-update` hook so Ymir re-learns it every time Omarchy
493
+ updates. On a non-Omarchy host that layer step is a clean SKIP.
494
+
495
+ Rule: the installer is **idempotent** — running it again changes nothing but
496
+ fills gaps. It never overwrites real user data.
497
+
498
+ ## Node dependencies in a fresh clone — the postinstall trap
499
+
500
+ A clone never carries `node_modules`. Two components need them, and each has its
501
+ own package manager:
502
+
503
+ ```bash
504
+ # Hlidskjalf (npm + package-lock.json) — what scripts/start.sh runs
505
+ cd apps/hlidskjalf && npm install --no-audit --no-fund
506
+ npm run typecheck && npm run build # dist/ is what the SPA serves
507
+
508
+ # Smiðja visualizer (bun + bun.lock)
509
+ cd .agents/skills/smidja-factory/apps/visualizer && bun install && bun run build
510
+ ```
511
+
512
+ The visualizer's `dist/` is not optional: its API serves the UI from `./dist`,
513
+ and without a build it answers the API but prints *"No ./dist build found"*.
514
+
515
+ ### The trap: install scripts can be skipped silently
516
+
517
+ Newer npm versions gate package install scripts (`allowScripts`). When a script
518
+ is not approved the install still reports success, so you get a **half-broken
519
+ tree that passes its own build**:
520
+
521
+ ```
522
+ 2 packages have install scripts not yet covered by allowScripts:
523
+ electron@33.4.11 (postinstall: node install.js)
524
+ esbuild@0.25.12 (postinstall: node install.js)
525
+ ```
526
+
527
+ - `esbuild` survives it (its binary arrives through the platform-specific
528
+ package), so `npm run build` succeeds and everything looks healthy.
529
+ - **`electron` does not.** Its postinstall downloads the ~100 MB runtime; without
530
+ it `node_modules/electron/dist/` is left partial and `path.txt` is never
531
+ written, so the desktop shell cannot start — while the web app builds perfectly.
532
+
533
+ Detect it:
534
+
535
+ ```bash
536
+ npm install-scripts ls # what is unapproved
537
+ node_modules/electron/dist/electron --version # fails if skipped
538
+ cat node_modules/electron/path.txt # absent if skipped
539
+ ```
540
+
541
+ Fix it:
542
+
543
+ ```bash
544
+ npm install-scripts approve electron esbuild
545
+ npm rebuild electron
546
+ ```
547
+
548
+ If the rebuild still exits **silently** and `dist/` stays partial, the download
549
+ is cached but was not re-extracted — complete it by hand, which is all the
550
+ package's own installer does:
551
+
552
+ ```bash
553
+ ZIP=$(ls ~/.cache/electron/*/electron-v*-linux-x64.zip | head -1)
554
+ rm -rf node_modules/electron/dist && mkdir -p node_modules/electron/dist
555
+ unzip -q -o "$ZIP" -d node_modules/electron/dist
556
+ printf 'electron' > node_modules/electron/path.txt # the linux binary name
557
+ chmod +x node_modules/electron/dist/electron
558
+ ```
559
+
560
+ **Verify the install as a whole**, not just that a build passed: the electron and
561
+ esbuild binaries report versions, both `dist/` directories exist, and
562
+ `bin/ymir-install.sh --check` reports the visualizer and smidja green.
563
+
564
+ ## Platform support — Linux, macOS, Windows
565
+
566
+ Ymir runs on Linux (native), macOS (native) and Windows (through **WSL2**, with
567
+ MSYS/Git Bash as best-effort). The runtime is bash, so Windows means a POSIX
568
+ shell: WSL2 is the supported path, and it is also the only one where the Linux
569
+ GPU and service paths behave normally.
570
+
571
+ ### One place knows the difference
572
+
573
+ `bin/ymir-platform.sh` is the portability layer. It defines functions only and is
574
+ sourced, never executed:
575
+
576
+ ```bash
577
+ . "$ROOT/bin/ymir-platform.sh" # scripts already do this via the shim block
578
+ ```
579
+
580
+ | Need | Function | Why it exists |
581
+ |---|---|---|
582
+ | Which OS | `ymir_os` → `linux` \| `macos` \| `wsl` \| `msys` | branching, once |
583
+ | CPU count | `ymir_nproc` | `nproc` is GNU; macOS uses `sysctl -n hw.ncpu` |
584
+ | Resolve a path | `ymir_readlink_f` | BSD `readlink` has no `-f`; mirrors GNU semantics including the "parent must exist" rule |
585
+ | File facts | `ymir_stat_mtime`, `ymir_stat_size`, `ymir_stat_id`, `ymir_stat_birth`, `ymir_stat_mode` | GNU `stat -c` vs BSD `stat -f`, and birth time exists on both but differently |
586
+ | Timing | `ymir_epoch_ns` | BSD `date` has no `%N` |
587
+ | A pid's command line | `ymir_pid_cmdline`, `ymir_pid_matches` | `/proc` is Linux-only; falls back to `ps -o command=` |
588
+ | Signal a process by pattern | `ymir_kill_matching` | `pkill` is absent on some MSYS/WSL images; falls back to `ps` + `kill` |
589
+ | Detach a process | `ymir_detach` | `setsid` is absent on macOS; falls back to `nohup` |
590
+ | Exclusive lock | `ymir_lock` | `flock` is Linux; falls back to an atomic `mkdir` lock |
591
+ | Services | `ymir_service_backend`, `ymir_service_active` | `systemd` on Linux, `launchd` on macOS, neither elsewhere |
592
+ | GPUs | `ymir_gpu_name`, `ymir_gpu_mem_used` | never assume NVIDIA: `nvidia-smi`, then `rocm-smi`, then Apple's unified memory |
593
+ | Paths | `ymir_tmp`, `ymir_expand_tilde` | `TMPDIR`/`TEMP` vary; a leading `~` must be expanded explicitly |
594
+
595
+ Scripts that need any of these carry a short shim block near the top that finds
596
+ and sources the library, then marks it loaded so a second source is a no-op:
597
+
598
+ ```bash
599
+ if [ -z "${YMIR_PLATFORM_LOADED:-}" ]; then
600
+ _ymir_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
601
+ for _ymir_c in "$_ymir_dir/ymir-platform.sh" "$(dirname "$_ymir_dir")/bin/ymir-platform.sh"; do
602
+ [ -r "$_ymir_c" ] && { . "$_ymir_c"; YMIR_PLATFORM_LOADED=1; break; }
603
+ done
604
+ unset _ymir_dir _ymir_c
605
+ fi
606
+ ```
607
+
608
+ ### Rules for new code
609
+
610
+ 1. **Never call `readlink -f`, `stat -c`, `nproc`, `setsid`, `flock`, `date +%N`
611
+ or read `/proc` directly.** Use the shim.
612
+ 2. **Never assume NVIDIA.** Ask the shim; a machine may be AMD, Intel or Apple.
613
+ 3. **Never hardcode a home directory.** Use `$HOME`, or `ymir_expand_tilde` for a
614
+ user-supplied path, and keep machine-specific values in generated config
615
+ rather than in the tree.
616
+ 4. **Never assume a desktop.** `.desktop` files, `systemctl` and window managers
617
+ are Linux-shaped; a launcher must be generated for the host, not shipped as
618
+ one file for all.
619
+ 5. **Test the fallback, not just the happy path.** Most of these functions exist
620
+ because the Linux path already worked; the risk is the other branch.
621
+
622
+ Standalone tools that ship outside a Ymir checkout (for example
623
+ `.agents/skills/galdr-ymirsystem/scripts/bench-one.sh`) carry their own small portable
624
+ helpers instead of sourcing the library, so they run anywhere on their own.
625
+
626
+ ### Machine config is rendered, never shipped
627
+
628
+ Two files must contain **absolute** paths (the engram MCP server's binary and its
629
+ database), so a tracked copy would hand every operator the previous one's home —
630
+ exactly what `/home/<user>/...` did in this tree. They follow the `.env.example`
631
+ pattern instead:
632
+
633
+ | Shipped (tracked) | Rendered (gitignored) |
634
+ |---|---|
635
+ | `opencode.json.example` | `opencode.json` |
636
+ | `.pi/mcp.json.example` | `.pi/mcp.json` |
637
+
638
+ Placeholders `__YMIR_HOME__` and `__YMIR_ROOT__` are substituted with `$HOME` and
639
+ the checkout root by `bin/valknut-load.sh` (its `render_config`, run for both
640
+ `--pi` and `--opencode`). It is idempotent: identical content is left alone and
641
+ reported as `unchanged`.
642
+
643
+ Rule: **if a config must hold an absolute path, it is generated from an
644
+ `.example`, not committed.** The same applies to launchers — a `.desktop` file
645
+ is one OS's answer and must be produced for the host, not shipped for all.
646
+
647
+ ## Omarchy-first: the core is portable, the desktop is Omarchy's
648
+
649
+ Ymir is an **Omarchy-first** system. That is a design statement, not a
650
+ restriction — it says which desktop integration is first-class, not which
651
+ machines may run the runtime.
652
+
653
+ **Two layers, deliberately separate:**
654
+
655
+ | Layer | Runs on | What it owns |
656
+ |---|---|---|
657
+ | **Portable core** | Linux, macOS, Windows (WSL2; MSYS best-effort) | the runtime — session digest, lock, watch, cron, skills — the installer's user-space prerequisites, the capability shim, generated machine config |
658
+ | **Omarchy layer** | Omarchy only | recording the host (`omarchy-sense observe`), placing each app on its own numbered Hyprland desktop (`desktop-place`), the launcher entries (`.desktop`), the suggested shell plugins, the post-update hook |
659
+
660
+ The core never grows a Hyprland branch, and the Omarchy layer is never stretched
661
+ into pretending it is portable. An Omarchy-specific step is gated on the host and
662
+ reports a clean skip anywhere else:
663
+
664
+ ```bash
665
+ [ -d /usr/share/omarchy ] && ... || add host OK "... (not an Omarchy host)"
666
+ ```
667
+
668
+ That is why the only Omarchy branches left in the core installer are the ones
669
+ that call the layer (`step_omarchy`) and desktop placement (`step_desktop`):
670
+ `step_host` senses the host portably with `host-sense`, and everywhere else the
671
+ same code path runs on any host.
672
+
673
+ The **consent preamble** the installer prints before it acts says the same thing —
674
+ *"learn this machine (OS, desktop, packages, configs, monitors, scale — Omarchy
675
+ hosts recorded first-class)"* — so the operator is told what will happen in the
676
+ portable terms the code now uses, not the Omarchy-only terms it used before.
677
+
678
+ ### What the Omarchy layer installs
679
+
680
+ ```bash
681
+ bin/omarchy-sense.sh observe # learn packages, configs, Omarchy version
682
+ bin/omarchy-plugins.sh add # the suggested shell plugins (never forced)
683
+ bin/omarchy-hook-install.sh install # re-learn after every `omarchy update`
684
+ bin/desktop-place.sh apply # Hyprland desktops + launcher entries
685
+ ```
686
+
687
+ `desktop-place.sh apply` does both halves of the desktop integration: it writes
688
+ the Hyprland window rules that give each Ymir app its own numbered desktop, and
689
+ it renders the launcher templates into `~/.local/share/applications/`. The
690
+ templates (`apps/hlidskjalf/electron/*.desktop.in`) carry `__YMIR_ROOT__` rather
691
+ than an absolute path, because where the checkout lives is a fact about the
692
+ machine, not about Ymir.
693
+
694
+ **Rule:** `RULES/05-platforms.md` — a core change updates every
695
+ platform layer in the same change.
696
+
697
+ **Rule for a new desktop feature:** if it is Omarchy-specific, it belongs in the
698
+ Omarchy layer and is gated; if it is core, it must work on every platform. Do not
699
+ blur the two — a branch of Hyprland logic inside a core script is how a portable
700
+ runtime stops being portable.
701
+
702
+ ### A move must carry the memory, not just the code
703
+
704
+ Rule 06 makes this explicit, because a home swap here dropped
705
+ `docs/append-only-log.md`, `docs/masterplan.md`, `docs/plans/` and the private
706
+ business set: the backup carried `state`, `.env.local`, `data`, the realm and
707
+ `workspace` — but not `docs/` or `assets/`. The code arrived; the memory did not.
708
+
709
+ Before and after any migration, re-clone or swap, check the sets **by name**:
710
+
711
+ ```bash
712
+ for f in CHANGELOG.md docs/append-only-log.md workspace/memory/runes_audit.md; do
713
+ [ -e "$f" ] || echo "MISSING append-only artifact: $f"
714
+ done
715
+ ls "$YMIR_HOARD/docs" "$YMIR_HOARD/identity" 2>/dev/null # the private set
716
+ ```
717
+
718
+ A backup is only as good as its file list. If a directory is not named in the
719
+ backup, it is not carried.
720
+
721
+ ### The memory engine is provisioned, not hinted (2026-09-12)
722
+
723
+ `bin/ymir-install.sh` used to *check* for the well engine and, failing, print
724
+ `SKIP "optional — install engine then run bin/mimir-bridge.sh"`. A SKIP never
725
+ blocks, so the well was silently down on every install — and the hint named the
726
+ wrong package, so following it made things worse.
727
+
728
+ Now the installer provisions it: `bin/prereq-ensure.sh engram` installs
729
+ **`engdbram`** (the distribution; the *module* is `engram`) into an interpreter
730
+ that can run it (>=3.11; uv supplies 3.12 when the distro's Python is unsuitable),
731
+ and records that interpreter in `~/.config/ymir/engram-python`. `bin/mimir-bridge.sh`
732
+ reads the same file, so the installer and the bridge always agree.
733
+
734
+ ```bash
735
+ bin/prereq-ensure.sh engram # install and record the interpreter
736
+ bin/mimir-bridge.sh --start # the :4602 face over the engine
737
+ curl -s 127.0.0.1:4602/health # {"status": "up", "store": ".agents/memory/kaia.engram"}
738
+ ```
739
+
740
+ **Never `pip install engram`.** PyPI's `engram` is an unrelated rendering library
741
+ (mitsuba/drjit/torch) whose install pulls gigabytes of CUDA wheels and still
742
+ leaves Ymir with no engine. The prerequisite target exists so nobody has to know
743
+ that: `bin/prereq-ensure.sh engram`.
744
+
745
+ ### The rename sweep broke governed paths, not just prose (2026-09-12)
746
+
747
+ The `smidja` → `smidja-factory` rename left `smidja-factory-factory` behind in
748
+ **seven** places — `scripts/start.sh` (`VIZ_DIR`), `bin/ymir-validate.sh`,
749
+ `bin/ymir-install.sh` (twice: the dist probe and the build dir),
750
+ `bin/saga-session-start.sh` (the governed-path TOON row), `AGENTS.md` (the
751
+ `governed[]` table, twice) and the guard's own `asset_for` pattern.
752
+
753
+ The damage was not cosmetic: a governed path that does not exist makes the
754
+ pretool guard stop matching, so the smidja rule protected nothing while every
755
+ check still passed. A `governed` check now exists in
756
+ `compliance-check.sh` for exactly this class (see `runtime-compliance.md` §G13);
757
+ it reports `all 25 governed paths exist`.
758
+
759
+ `bin/ymir-install.sh` and `bin/ymir-validate.sh` are the two files of this asset
760
+ that the sweep corrected. The visualizer path is
761
+ `.agents/skills/smidja-factory/apps/visualizer` — **not** a doubled
762
+ `smidja-factory-factory`, and not the abandoned `.agents/skills/smidja/` tree
763
+ (stale build output, moved aside).