@zerwiz/ymir 0.1.4 → 0.1.5

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 (850) 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/backends/cmux.sh +649 -0
  27. package/.agents/backend/backends/herdr-eventwait.py +157 -0
  28. package/.agents/backend/backends/herdr-workspace-move.py +114 -0
  29. package/.agents/backend/backends/herdr.sh +3386 -0
  30. package/.agents/backend/backends/orca.sh +290 -0
  31. package/.agents/backend/backends/tmux.sh +357 -0
  32. package/.agents/backend/backends/zellij.sh +700 -0
  33. package/.agents/backend/fm-afk-launch.sh +654 -0
  34. package/.agents/backend/fm-afk-return.sh +241 -0
  35. package/.agents/backend/fm-afk-start.sh +172 -0
  36. package/.agents/backend/fm-arm-command-policy.mjs +960 -0
  37. package/.agents/backend/fm-arm-pretool-check.sh +200 -0
  38. package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
  39. package/.agents/backend/fm-backend.sh +981 -0
  40. package/.agents/backend/fm-backlog-handoff.sh +909 -0
  41. package/.agents/backend/fm-backlog-receive.sh +187 -0
  42. package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
  43. package/.agents/backend/fm-bearings-board.sh +204 -0
  44. package/.agents/backend/fm-bearings-snapshot.sh +546 -0
  45. package/.agents/backend/fm-bootstrap.sh +1568 -0
  46. package/.agents/backend/fm-branch-outcome.sh +203 -0
  47. package/.agents/backend/fm-branch-prompt.sh +101 -0
  48. package/.agents/backend/fm-brief.sh +452 -0
  49. package/.agents/backend/fm-busy-event.sh +234 -0
  50. package/.agents/backend/fm-busy-lib.sh +986 -0
  51. package/.agents/backend/fm-captain-hold.sh +1001 -0
  52. package/.agents/backend/fm-cd-command-policy.mjs +153 -0
  53. package/.agents/backend/fm-cd-pretool-check.sh +190 -0
  54. package/.agents/backend/fm-check-lib.sh +74 -0
  55. package/.agents/backend/fm-check-register.sh +42 -0
  56. package/.agents/backend/fm-check-unregister.sh +52 -0
  57. package/.agents/backend/fm-classify-lib.sh +1770 -0
  58. package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
  59. package/.agents/backend/fm-composer-lib.sh +1416 -0
  60. package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
  61. package/.agents/backend/fm-config-push.sh +254 -0
  62. package/.agents/backend/fm-control-lib.sh +251 -0
  63. package/.agents/backend/fm-control.sh +878 -0
  64. package/.agents/backend/fm-crew-state.sh +625 -0
  65. package/.agents/backend/fm-cursor-lib.sh +243 -0
  66. package/.agents/backend/fm-decision-hold.sh +232 -0
  67. package/.agents/backend/fm-doc-audience-check.sh +269 -0
  68. package/.agents/backend/fm-dod-lib.sh +67 -0
  69. package/.agents/backend/fm-ensure-agents-md.sh +253 -0
  70. package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
  71. package/.agents/backend/fm-extension.mjs +2577 -0
  72. package/.agents/backend/fm-extension.sh +16 -0
  73. package/.agents/backend/fm-ff-lib.sh +420 -0
  74. package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
  75. package/.agents/backend/fm-fleet-sync.sh +458 -0
  76. package/.agents/backend/fm-fleet-view.sh +96 -0
  77. package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
  78. package/.agents/backend/fm-guard.sh +242 -0
  79. package/.agents/backend/fm-harness.sh +195 -0
  80. package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
  81. package/.agents/backend/fm-herdr-lab.sh +346 -0
  82. package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
  83. package/.agents/backend/fm-home-seed.sh +984 -0
  84. package/.agents/backend/fm-home-summary-refresh.sh +255 -0
  85. package/.agents/backend/fm-hook-host-lib.sh +36 -0
  86. package/.agents/backend/fm-inactive-reconcile.sh +531 -0
  87. package/.agents/backend/fm-inbox.sh +399 -0
  88. package/.agents/backend/fm-install-actionlint.sh +84 -0
  89. package/.agents/backend/fm-install-herdr.sh +96 -0
  90. package/.agents/backend/fm-install-shellcheck.sh +84 -0
  91. package/.agents/backend/fm-install-treehouse.sh +95 -0
  92. package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
  93. package/.agents/backend/fm-lease-lib.sh +218 -0
  94. package/.agents/backend/fm-lease.sh +189 -0
  95. package/.agents/backend/fm-line-cap-lib.sh +51 -0
  96. package/.agents/backend/fm-lint-workflows.sh +137 -0
  97. package/.agents/backend/fm-lint.sh +591 -0
  98. package/.agents/backend/fm-lock-lib.sh +104 -0
  99. package/.agents/backend/fm-lock.sh +107 -0
  100. package/.agents/backend/fm-marker-lib.sh +12 -0
  101. package/.agents/backend/fm-merge-local.sh +74 -0
  102. package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
  103. package/.agents/backend/fm-nm-run-lib.sh +124 -0
  104. package/.agents/backend/fm-on.sh +125 -0
  105. package/.agents/backend/fm-operational-input.sh +253 -0
  106. package/.agents/backend/fm-peek.sh +46 -0
  107. package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
  108. package/.agents/backend/fm-pr-check.sh +135 -0
  109. package/.agents/backend/fm-pr-lib.sh +1016 -0
  110. package/.agents/backend/fm-pr-merge.sh +707 -0
  111. package/.agents/backend/fm-pr-poll.sh +110 -0
  112. package/.agents/backend/fm-primary-scope-lib.sh +33 -0
  113. package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
  114. package/.agents/backend/fm-procevent-lavish.sh +628 -0
  115. package/.agents/backend/fm-procevent-lib.sh +892 -0
  116. package/.agents/backend/fm-procevent-quota.sh +290 -0
  117. package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
  118. package/.agents/backend/fm-procevent-when.sh +504 -0
  119. package/.agents/backend/fm-procevent.sh +1466 -0
  120. package/.agents/backend/fm-project-mode.sh +92 -0
  121. package/.agents/backend/fm-project-origin-lib.sh +180 -0
  122. package/.agents/backend/fm-promote.sh +282 -0
  123. package/.agents/backend/fm-public-followup-emit.sh +260 -0
  124. package/.agents/backend/fm-public-followup-lib.sh +398 -0
  125. package/.agents/backend/fm-public-followup.sh +1330 -0
  126. package/.agents/backend/fm-push-transition-lib.sh +168 -0
  127. package/.agents/backend/fm-quota-axi-lib.sh +93 -0
  128. package/.agents/backend/fm-quota-choose.sh +384 -0
  129. package/.agents/backend/fm-remote-delta-read.sh +189 -0
  130. package/.agents/backend/fm-remote-doctor.sh +800 -0
  131. package/.agents/backend/fm-remote-entrypoint.sh +193 -0
  132. package/.agents/backend/fm-remote-file.sh +234 -0
  133. package/.agents/backend/fm-remote-home-provision.sh +259 -0
  134. package/.agents/backend/fm-remote-home-seed.sh +259 -0
  135. package/.agents/backend/fm-remote-inherit-push.sh +90 -0
  136. package/.agents/backend/fm-remote-inherit.sh +179 -0
  137. package/.agents/backend/fm-remote-job-lib.sh +1241 -0
  138. package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
  139. package/.agents/backend/fm-remote-job-worker.sh +1124 -0
  140. package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
  141. package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
  142. package/.agents/backend/fm-review-diff.sh +158 -0
  143. package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
  144. package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
  145. package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
  146. package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
  147. package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
  148. package/.agents/backend/fm-secondmate-report.sh +88 -0
  149. package/.agents/backend/fm-send.sh +1059 -0
  150. package/.agents/backend/fm-session-lock-lib.sh +176 -0
  151. package/.agents/backend/fm-session-start.sh +970 -0
  152. package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
  153. package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
  154. package/.agents/backend/fm-sessionstart-run.sh +145 -0
  155. package/.agents/backend/fm-spawn.sh +3153 -0
  156. package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
  157. package/.agents/backend/fm-startup-memory-budget.sh +94 -0
  158. package/.agents/backend/fm-startup-network.sh +642 -0
  159. package/.agents/backend/fm-stow-cascade.sh +251 -0
  160. package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
  161. package/.agents/backend/fm-supervise-daemon.sh +1732 -0
  162. package/.agents/backend/fm-supervision-instructions.sh +215 -0
  163. package/.agents/backend/fm-supervision-lib.sh +90 -0
  164. package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
  165. package/.agents/backend/fm-tangle-lib.sh +53 -0
  166. package/.agents/backend/fm-task-inbox-lib.sh +402 -0
  167. package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
  168. package/.agents/backend/fm-teardown.sh +2922 -0
  169. package/.agents/backend/fm-test-isolation-proof.sh +588 -0
  170. package/.agents/backend/fm-test-run.sh +2191 -0
  171. package/.agents/backend/fm-timeout-lib.sh +141 -0
  172. package/.agents/backend/fm-timing-lib.sh +179 -0
  173. package/.agents/backend/fm-tmux-lib.sh +291 -0
  174. package/.agents/backend/fm-tool-update-check.sh +898 -0
  175. package/.agents/backend/fm-trace-context-lib.sh +227 -0
  176. package/.agents/backend/fm-transition-lib.sh +103 -0
  177. package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
  178. package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
  179. package/.agents/backend/fm-turnend-guard.sh +432 -0
  180. package/.agents/backend/fm-update.sh +110 -0
  181. package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
  182. package/.agents/backend/fm-voice-client.py +1373 -0
  183. package/.agents/backend/fm-voice-relay.py +1256 -0
  184. package/.agents/backend/fm-wake-drain.sh +592 -0
  185. package/.agents/backend/fm-wake-grant.sh +127 -0
  186. package/.agents/backend/fm-wake-lib.sh +1849 -0
  187. package/.agents/backend/fm-watch-arm.sh +602 -0
  188. package/.agents/backend/fm-watch-checkpoint.sh +109 -0
  189. package/.agents/backend/fm-watch.sh +1962 -0
  190. package/.agents/backend/fm-x-dismiss.sh +116 -0
  191. package/.agents/backend/fm-x-followup.sh +286 -0
  192. package/.agents/backend/fm-x-lib.sh +1000 -0
  193. package/.agents/backend/fm-x-link.sh +234 -0
  194. package/.agents/backend/fm-x-poll.sh +185 -0
  195. package/.agents/backend/fm-x-reply.sh +385 -0
  196. package/.agents/backend/fm_voice_frame.py +166 -0
  197. package/.agents/backend/fm_voice_records.py +574 -0
  198. package/.agents/backend/model-bridge.py +290 -0
  199. package/.agents/backend/opencode-go-bridge.py +30 -0
  200. package/.agents/bus/README.md +12 -0
  201. package/.agents/bus/messages.json +1 -0
  202. package/.agents/config/agents.machine.example.yaml +16 -0
  203. package/.agents/config/agents.yaml +50 -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 +9 -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/config/tailscale-sync.yaml +27 -0
  211. package/.agents/filebrowser/.filebrowser.json +6 -0
  212. package/.agents/filebrowser/README.md +11 -0
  213. package/.agents/gateway/README.md +12 -0
  214. package/.agents/github/README.md +15 -0
  215. package/.agents/github/webhooks/.gitkeep +0 -0
  216. package/.agents/github/workflows/.gitkeep +0 -0
  217. package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
  218. package/.agents/harness/opencode/plugins/package.json +4 -0
  219. package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
  220. package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
  221. package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
  222. package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
  223. package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
  224. package/.agents/memory/README.md +46 -0
  225. package/.agents/memory/kaia.engram +0 -0
  226. package/.agents/memory/kaia.engram-shm +0 -0
  227. package/.agents/memory/kaia.engram-wal +0 -0
  228. package/.agents/memory/runes_audit.md +5 -0
  229. package/.agents/memory/well/episodes.jsonl +367 -0
  230. package/.agents/memory/well/workspace.jsonl +27 -0
  231. package/.agents/migrations/0001-hodd-layout.sh +38 -0
  232. package/.agents/migrations/0002-a2a-mcp.sh +27 -0
  233. package/.agents/migrations/0003-private-data-separation.sh +111 -0
  234. package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
  235. package/.agents/sandbox/Dockerfile.utgard +19 -0
  236. package/.agents/sandbox/README.md +14 -0
  237. package/.agents/sandbox/utgard.config.json +14 -0
  238. package/.agents/skills/README.md +59 -0
  239. package/.agents/skills/bragi-marketing/README.md +3 -0
  240. package/.agents/skills/bragi-marketing/SKILL.md +82 -0
  241. package/.agents/skills/eindri-homes/README.md +3 -0
  242. package/.agents/skills/eindri-homes/SKILL.md +291 -0
  243. package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
  244. package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
  245. package/.agents/skills/frigg-consent/README.md +3 -0
  246. package/.agents/skills/frigg-consent/SKILL.md +56 -0
  247. package/.agents/skills/galdr-ymirsystem/README.md +3 -0
  248. package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
  249. package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
  250. package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
  251. package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
  252. package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
  253. package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
  254. package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
  255. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
  256. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
  257. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
  258. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
  259. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
  260. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
  261. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
  262. package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
  263. package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
  264. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
  265. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
  266. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
  267. package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
  268. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
  269. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
  270. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
  271. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
  272. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
  273. package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
  274. package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
  275. package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
  276. package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
  277. package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
  278. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
  279. package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
  280. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
  281. package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
  282. package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
  283. package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
  284. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
  285. package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
  286. package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
  287. package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
  288. package/.agents/skills/gjallarhorn-relay/README.md +3 -0
  289. package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
  290. package/.agents/skills/groa-update/SKILL.md +70 -0
  291. package/.agents/skills/hamr-adapters/README.md +3 -0
  292. package/.agents/skills/hamr-adapters/SKILL.md +123 -0
  293. package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
  294. package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
  295. package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
  296. package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
  297. package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
  298. package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
  299. package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
  300. package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
  301. package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
  302. package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
  303. package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
  304. package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
  305. package/.agents/skills/herdr-panes/README.md +3 -0
  306. package/.agents/skills/herdr-panes/SKILL.md +92 -0
  307. package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
  308. package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
  309. package/.agents/skills/hnoss-design/DESIGN.md +19 -0
  310. package/.agents/skills/hnoss-design/README.md +3 -0
  311. package/.agents/skills/hnoss-design/SKILL.md +83 -0
  312. package/.agents/skills/hvild-afk/README.md +3 -0
  313. package/.agents/skills/hvild-afk/SKILL.md +241 -0
  314. package/.agents/skills/jord-projects/README.md +3 -0
  315. package/.agents/skills/jord-projects/SKILL.md +92 -0
  316. package/.agents/skills/lifecycle/SKILL.md +56 -0
  317. package/.agents/skills/lifecycle/smoke_test.sh +52 -0
  318. package/.agents/skills/lifecycle/start.sh +21 -0
  319. package/.agents/skills/lifecycle/status.sh +35 -0
  320. package/.agents/skills/lifecycle/stop.sh +16 -0
  321. package/.agents/skills/muninn-stow/README.md +3 -0
  322. package/.agents/skills/muninn-stow/SKILL.md +309 -0
  323. package/.agents/skills/no-mistakes/SKILL.md +379 -0
  324. package/.agents/skills/nornir-schedule/README.md +3 -0
  325. package/.agents/skills/nornir-schedule/SKILL.md +25 -0
  326. package/.agents/skills/nornir-schedule/assets/events.md +137 -0
  327. package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
  328. package/.agents/skills/nsr-compliance/README.md +3 -0
  329. package/.agents/skills/nsr-compliance/SKILL.md +29 -0
  330. package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
  331. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
  332. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
  333. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
  334. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
  335. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
  336. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
  337. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
  338. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
  339. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
  340. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
  341. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
  342. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
  343. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
  344. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
  345. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
  346. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
  347. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
  348. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
  349. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
  350. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
  351. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
  352. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
  353. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  354. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
  355. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
  356. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
  357. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
  358. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
  359. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
  360. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
  361. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
  362. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
  363. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
  364. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
  365. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
  366. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
  367. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
  368. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
  369. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
  370. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
  371. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
  372. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
  373. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
  374. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
  375. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
  376. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
  377. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
  378. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
  379. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
  380. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
  381. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
  382. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
  383. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
  384. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
  385. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
  386. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
  387. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
  388. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
  389. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
  390. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
  391. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
  392. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
  393. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
  394. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
  395. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
  396. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
  397. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
  398. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
  399. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
  400. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
  401. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
  402. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
  403. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
  404. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
  405. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
  406. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
  407. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
  408. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
  409. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
  410. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
  411. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
  412. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
  413. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
  414. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
  415. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
  416. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
  417. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
  418. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
  419. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
  420. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
  421. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
  422. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
  423. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
  424. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
  425. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
  426. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
  427. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
  428. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
  429. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
  430. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
  431. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
  432. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
  433. package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
  434. package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
  435. package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
  436. package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
  437. package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
  438. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
  439. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
  440. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
  441. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
  442. package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
  443. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
  444. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
  445. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
  446. package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
  447. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
  448. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
  449. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
  450. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
  451. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
  452. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
  453. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
  454. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  455. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
  456. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
  457. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
  458. package/.agents/skills/pr-ops/README.md +3 -0
  459. package/.agents/skills/pr-ops/SKILL.md +109 -0
  460. package/.agents/skills/ratatoskr-a2a/README.md +3 -0
  461. package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
  462. package/.agents/skills/rules-check-drift/SKILL.md +81 -0
  463. package/.agents/skills/saga-bearings/README.md +3 -0
  464. package/.agents/skills/saga-bearings/SKILL.md +26 -0
  465. package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
  466. package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
  467. package/.agents/skills/saga-bearings/assets/recap.md +56 -0
  468. package/.agents/skills/syn-recovery/README.md +3 -0
  469. package/.agents/skills/syn-recovery/SKILL.md +54 -0
  470. package/.agents/skills/tyr-check/README.md +3 -0
  471. package/.agents/skills/tyr-check/SKILL.md +218 -0
  472. package/.agents/skills/urdh-hold/README.md +3 -0
  473. package/.agents/skills/urdh-hold/SKILL.md +25 -0
  474. package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
  475. package/.agents/skills/urdh-hold/assets/hold.md +54 -0
  476. package/.agents/skills/vor-diagnostics/README.md +3 -0
  477. package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
  478. package/.agents/skills/ymir-host/README.md +3 -0
  479. package/.agents/skills/ymir-host/SKILL.md +34 -0
  480. package/.agents/skills/ymir-host/assets/desktop.md +36 -0
  481. package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
  482. package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
  483. package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
  484. package/.agents/skills/ymir-host/assets/update.md +64 -0
  485. package/.agents/tests/assets/board-render-harness.mjs +117 -0
  486. package/.agents/tests/cmux-test-safety.sh +51 -0
  487. package/.agents/tests/fixtures.sh +291 -0
  488. package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
  489. package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
  490. package/.agents/tests/fm-afk-launch.test.sh +961 -0
  491. package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
  492. package/.agents/tests/fm-afk-return.test.sh +283 -0
  493. package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
  494. package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
  495. package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
  496. package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
  497. package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
  498. package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
  499. package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
  500. package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
  501. package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
  502. package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
  503. package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
  504. package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
  505. package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
  506. package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
  507. package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
  508. package/.agents/tests/fm-backend-orca.test.sh +1357 -0
  509. package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
  510. package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
  511. package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
  512. package/.agents/tests/fm-backend.test.sh +1142 -0
  513. package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
  514. package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
  515. package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
  516. package/.agents/tests/fm-bearings-board.test.sh +414 -0
  517. package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
  518. package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
  519. package/.agents/tests/fm-bootstrap.test.sh +1178 -0
  520. package/.agents/tests/fm-branch-supervision.test.sh +552 -0
  521. package/.agents/tests/fm-brief.test.sh +785 -0
  522. package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
  523. package/.agents/tests/fm-busy-state.test.sh +465 -0
  524. package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
  525. package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
  526. package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
  527. package/.agents/tests/fm-check-unregister.test.sh +198 -0
  528. package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
  529. package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
  530. package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
  531. package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
  532. package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
  533. package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
  534. package/.agents/tests/fm-composer-ghost.test.sh +716 -0
  535. package/.agents/tests/fm-composer-lib.test.sh +666 -0
  536. package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
  537. package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
  538. package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
  539. package/.agents/tests/fm-control.test.sh +910 -0
  540. package/.agents/tests/fm-crew-state.test.sh +1610 -0
  541. package/.agents/tests/fm-cursor-harness.test.sh +404 -0
  542. package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
  543. package/.agents/tests/fm-cursor-primary.test.sh +708 -0
  544. package/.agents/tests/fm-daemon.test.sh +2740 -0
  545. package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
  546. package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
  547. package/.agents/tests/fm-extension-binding.test.sh +2187 -0
  548. package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
  549. package/.agents/tests/fm-fleet-sync.test.sh +721 -0
  550. package/.agents/tests/fm-gate-refuse.test.sh +356 -0
  551. package/.agents/tests/fm-gitignore-config.test.sh +89 -0
  552. package/.agents/tests/fm-gotmp.test.sh +230 -0
  553. package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
  554. package/.agents/tests/fm-grok-harness.test.sh +117 -0
  555. package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
  556. package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
  557. package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
  558. package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
  559. package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
  560. package/.agents/tests/fm-herdr-lab.test.sh +243 -0
  561. package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
  562. package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
  563. package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
  564. package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
  565. package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
  566. package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
  567. package/.agents/tests/fm-kimi-harness.test.sh +687 -0
  568. package/.agents/tests/fm-lint-workflows.test.sh +532 -0
  569. package/.agents/tests/fm-lint.test.sh +1023 -0
  570. package/.agents/tests/fm-muse-harness.test.sh +932 -0
  571. package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
  572. package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
  573. package/.agents/tests/fm-on.test.sh +507 -0
  574. package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
  575. package/.agents/tests/fm-operational-input.test.sh +160 -0
  576. package/.agents/tests/fm-peek-remote.test.sh +110 -0
  577. package/.agents/tests/fm-pending-reply.test.sh +1288 -0
  578. package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
  579. package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
  580. package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
  581. package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
  582. package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
  583. package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
  584. package/.agents/tests/fm-pr-merge.test.sh +2135 -0
  585. package/.agents/tests/fm-procevent-quota.test.sh +225 -0
  586. package/.agents/tests/fm-procevent-when.test.sh +406 -0
  587. package/.agents/tests/fm-procevent.test.sh +1745 -0
  588. package/.agents/tests/fm-project-origin.test.sh +110 -0
  589. package/.agents/tests/fm-public-followup.test.sh +2272 -0
  590. package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
  591. package/.agents/tests/fm-quota-choose.test.sh +626 -0
  592. package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
  593. package/.agents/tests/fm-remote-doctor.test.sh +625 -0
  594. package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
  595. package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
  596. package/.agents/tests/fm-remote-job.test.sh +768 -0
  597. package/.agents/tests/fm-remote-reply.test.sh +520 -0
  598. package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
  599. package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
  600. package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
  601. package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
  602. package/.agents/tests/fm-review-diff.test.sh +176 -0
  603. package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
  604. package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
  605. package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
  606. package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
  607. package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
  608. package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
  609. package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
  610. package/.agents/tests/fm-send-inbox.test.sh +352 -0
  611. package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
  612. package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
  613. package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
  614. package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
  615. package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
  616. package/.agents/tests/fm-send-settle.test.sh +147 -0
  617. package/.agents/tests/fm-send-strict.test.sh +241 -0
  618. package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
  619. package/.agents/tests/fm-session-start.test.sh +2515 -0
  620. package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
  621. package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
  622. package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
  623. package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
  624. package/.agents/tests/fm-spawn-batch.test.sh +148 -0
  625. package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
  626. package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
  627. package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
  628. package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
  629. package/.agents/tests/fm-startup-network.test.sh +712 -0
  630. package/.agents/tests/fm-stow-cascade.test.sh +370 -0
  631. package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
  632. package/.agents/tests/fm-supervision-events.test.sh +156 -0
  633. package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
  634. package/.agents/tests/fm-tangle-guard.test.sh +277 -0
  635. package/.agents/tests/fm-task-delivery.test.sh +420 -0
  636. package/.agents/tests/fm-task-inbox.test.sh +513 -0
  637. package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
  638. package/.agents/tests/fm-teardown.test.sh +2665 -0
  639. package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
  640. package/.agents/tests/fm-test-fixtures.test.sh +132 -0
  641. package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
  642. package/.agents/tests/fm-test-run.test.sh +1196 -0
  643. package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
  644. package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
  645. package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
  646. package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
  647. package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
  648. package/.agents/tests/fm-transition-lib.test.sh +54 -0
  649. package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
  650. package/.agents/tests/fm-update.test.sh +304 -0
  651. package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
  652. package/.agents/tests/fm-voice-relay.test.sh +4741 -0
  653. package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
  654. package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
  655. package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
  656. package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
  657. package/.agents/tests/fm-wake-queue.test.sh +1224 -0
  658. package/.agents/tests/fm-watch-arm.test.sh +821 -0
  659. package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
  660. package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
  661. package/.agents/tests/fm-watch-triage.test.sh +3889 -0
  662. package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
  663. package/.agents/tests/fm-x-mode.test.sh +3042 -0
  664. package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
  665. package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
  666. package/.agents/tests/herdr-test-safety.sh +42 -0
  667. package/.agents/tests/lib.sh +315 -0
  668. package/.agents/tests/remote-herdr-fixture.sh +125 -0
  669. package/.agents/tests/secondmate-helpers.sh +193 -0
  670. package/.agents/tests/smoke.test.sh +93 -0
  671. package/.agents/tests/wake-helpers.sh +338 -0
  672. package/.agents/tests/zellij-test-safety.sh +60 -0
  673. package/.agents/tools/README.md +10 -0
  674. package/.agents/tools/bin/tasks-cli +267 -0
  675. package/.agents/tools/tasks-cli.ts +216 -0
  676. package/AGENTS.md +454 -0
  677. package/CHANGELOG.md +881 -0
  678. package/LICENSE +1 -1
  679. package/NOTICE +63 -0
  680. package/README.md +113 -59
  681. package/RULES/01-domains.md +51 -0
  682. package/RULES/02-agents.md +78 -0
  683. package/RULES/03-houses.md +61 -0
  684. package/RULES/04-hoard.md +65 -0
  685. package/RULES/05-platforms.md +67 -0
  686. package/RULES/06-append-only.md +58 -0
  687. package/RULES/07-config.md +45 -0
  688. package/RULES/08-delivery-gate.md +75 -0
  689. package/RULES/README.md +20 -0
  690. package/bin/README.md +107 -0
  691. package/bin/a2a-mcp.sh +98 -0
  692. package/bin/a2a-serve.py +103 -0
  693. package/bin/a2a-serve.sh +8 -0
  694. package/bin/a2a-talk.sh +50 -0
  695. package/bin/a2abridge-ensure.sh +108 -0
  696. package/bin/agent-run.sh +43 -0
  697. package/bin/agents-config.sh +233 -0
  698. package/bin/apodex-smoke-test.sh +92 -0
  699. package/bin/bifrost-bridge.sh +112 -0
  700. package/bin/bifrost-ingress.sh +77 -0
  701. package/bin/bootstrap-macos.sh +107 -0
  702. package/bin/bootstrap-windows.ps1 +112 -0
  703. package/bin/branch-guard.sh +64 -0
  704. package/bin/brokk +73 -0
  705. package/bin/brokk-classify-lib.sh +1770 -0
  706. package/bin/brokk-lease-lib.sh +222 -0
  707. package/bin/brokk-lease.sh +193 -0
  708. package/bin/brokk-lint.sh +65 -0
  709. package/bin/brokk-send.sh +38 -0
  710. package/bin/brokk-update.sh +9 -0
  711. package/bin/brokk-wake-grant.sh +127 -0
  712. package/bin/brokk-wake-lib.sh +1849 -0
  713. package/bin/changelog-guard.sh +165 -0
  714. package/bin/crash-sense.sh +160 -0
  715. package/bin/desktop-place.sh +224 -0
  716. package/bin/docs-guard.sh +39 -0
  717. package/bin/editor-place.sh +207 -0
  718. package/bin/eindri-acclaim.sh +34 -0
  719. package/bin/eindri-control.sh +28 -0
  720. package/bin/eindri-role.sh +83 -0
  721. package/bin/eindri-seen.sh +41 -0
  722. package/bin/eindri-send.sh +15 -0
  723. package/bin/eindri-start.sh +85 -0
  724. package/bin/eindri-watch.sh +57 -0
  725. package/bin/einherjar-spawn.sh +576 -0
  726. package/bin/eir-doctor.sh +112 -0
  727. package/bin/erindi-brief.sh +271 -0
  728. package/bin/fleet-apply.sh +68 -0
  729. package/bin/github-deploy.sh +81 -0
  730. package/bin/gjallarhorn-expose.sh +102 -0
  731. package/bin/gjallarhorn-notify.sh +58 -0
  732. package/bin/gjallarhorn-purge.sh +54 -0
  733. package/bin/gjallarhorn-tunnel.sh +72 -0
  734. package/bin/gleipnir-lock-lib.sh +284 -0
  735. package/bin/groa-update.sh +122 -0
  736. package/bin/hall-snapshot.sh +92 -0
  737. package/bin/hamr-harness.sh +246 -0
  738. package/bin/heimdall-ssh-keys.sh +374 -0
  739. package/bin/herdr-agents.py +44 -0
  740. package/bin/herdr-ensure.sh +104 -0
  741. package/bin/herdr-run.sh +431 -0
  742. package/bin/hermes-ensure.sh +88 -0
  743. package/bin/hoard-lib.sh +25 -0
  744. package/bin/hodd.sh +78 -0
  745. package/bin/host-sense.sh +199 -0
  746. package/bin/huginn-research-worker.sh +108 -0
  747. package/bin/local-model-lock.sh +51 -0
  748. package/bin/mimir-bridge.py +226 -0
  749. package/bin/mimir-bridge.sh +87 -0
  750. package/bin/mimir-ingest.sh +131 -0
  751. package/bin/mimir.sh +113 -0
  752. package/bin/mjollnir-webhook.sh +59 -0
  753. package/bin/mjollnir.sh +85 -0
  754. package/bin/model-hardware.sh +82 -0
  755. package/bin/model-resolve.sh +147 -0
  756. package/bin/models-detect.sh +178 -0
  757. package/bin/nornir-cron-start.sh +162 -0
  758. package/bin/nornir-job-daily-briefing.sh +191 -0
  759. package/bin/nornir-job-git-sync.sh +152 -0
  760. package/bin/nornir-job-memory-housekeeping.sh +114 -0
  761. package/bin/nornir-job-observer.sh +166 -0
  762. package/bin/nornir-job-skillopt-sleep.sh +76 -0
  763. package/bin/omarchy-hook-install.sh +60 -0
  764. package/bin/omarchy-install.sh +148 -0
  765. package/bin/omarchy-plugins.sh +174 -0
  766. package/bin/omarchy-sense.sh +149 -0
  767. package/bin/perm-guard.sh +30 -0
  768. package/bin/pi-agent.sh +68 -0
  769. package/bin/pi-ensure.sh +77 -0
  770. package/bin/pi-local.sh +37 -0
  771. package/bin/pi-seat.sh +63 -0
  772. package/bin/prereq-ensure.sh +166 -0
  773. package/bin/private-guard.sh +38 -0
  774. package/bin/project-git.sh +55 -0
  775. package/bin/public-guard.sh +70 -0
  776. package/bin/ratatoskr.sh +49 -0
  777. package/bin/realm-lib.sh +32 -0
  778. package/bin/repo-scrub.sh +62 -0
  779. package/bin/rodd-operational-input.sh +250 -0
  780. package/bin/runes-append.sh +198 -0
  781. package/bin/saga-session-start.sh +172 -0
  782. package/bin/saga-sessionstart-run.sh +79 -0
  783. package/bin/saga-wake-drain.sh +41 -0
  784. package/bin/secret-guard.sh +63 -0
  785. package/bin/sessrumnir-ensure.sh +100 -0
  786. package/bin/sessrumnir-sync.sh +237 -0
  787. package/bin/sessrumnir.sh +91 -0
  788. package/bin/skillopt-setup.sh +76 -0
  789. package/bin/skuld-branch-outcome.sh +203 -0
  790. package/bin/skuld-branch-prompt.sh +101 -0
  791. package/bin/smidja-bootstrap.sh +90 -0
  792. package/bin/smidja-observe.sh +86 -0
  793. package/bin/syn-arm-pretool-check.sh +57 -0
  794. package/bin/syn-asset-pretool-check.sh +76 -0
  795. package/bin/syn-cd-pretool-check.sh +28 -0
  796. package/bin/syn-guard-pretool-check.sh +83 -0
  797. package/bin/syn-turnend-guard.sh +36 -0
  798. package/bin/syn-watch-arm.sh +99 -0
  799. package/bin/tailscale-sync.sh +190 -0
  800. package/bin/telegram-bot.sh +69 -0
  801. package/bin/toolchain.sh +74 -0
  802. package/bin/utgard.sh +111 -0
  803. package/bin/valhalla.sh +115 -0
  804. package/bin/valknut-load.sh +260 -0
  805. package/bin/vor-crew-state.sh +124 -0
  806. package/bin/wedge-notify.sh +47 -0
  807. package/bin/workspace-provision.sh +80 -0
  808. package/bin/workspace-rag.sh +150 -0
  809. package/bin/wyrd-db.sh +47 -0
  810. package/bin/yggdrasil.sh +152 -0
  811. package/bin/ymir-edit.sh +145 -0
  812. package/bin/ymir-install.sh +641 -0
  813. package/bin/ymir-invite.sh +93 -0
  814. package/bin/ymir-isolation.sh +88 -0
  815. package/bin/ymir-migrate.sh +61 -0
  816. package/bin/ymir-platform.sh +348 -0
  817. package/bin/ymir-say.sh +97 -0
  818. package/bin/ymir-setup-auth.sh +108 -0
  819. package/bin/ymir-validate.sh +173 -0
  820. package/bin/ymir.js +74 -16
  821. package/docs/Architecture.md +339 -0
  822. package/docs/design.md +351 -0
  823. package/docs/installations/README.md +63 -0
  824. package/docs/installations/ymir-home.md +93 -0
  825. package/docs/integration.md +105 -0
  826. package/docs/lore.md +1056 -0
  827. package/docs/research/agent-harnesses.md +290 -0
  828. package/docs/runbooks/README.md +19 -0
  829. package/docs/runbooks/a2a.md +91 -0
  830. package/docs/runbooks/agent-permissions.md +99 -0
  831. package/docs/runbooks/agents.md +57 -0
  832. package/docs/runbooks/models.md +69 -0
  833. package/docs/runbooks/realm-onboarding.md +60 -0
  834. package/docs/runbooks/secrets-and-hoard.md +60 -0
  835. package/docs/runbooks/updates-and-migrations.md +110 -0
  836. package/docs/runbooks/worktrees-isolation.md +72 -0
  837. package/docs/session-start.md +105 -0
  838. package/docs/skillopt-integration.md +321 -0
  839. package/docs/sync-system.md +66 -0
  840. package/docs/workspaces.md +104 -0
  841. package/docs/ymir-rut.md +260 -0
  842. package/package.json +44 -14
  843. package/packaging/build.sh +74 -0
  844. package/packaging/macos/Ymir Installer.command +43 -0
  845. package/packaging/windows/ymir-setup.nsi +74 -0
  846. package/scripts/README.md +22 -0
  847. package/scripts/electron.sh +210 -0
  848. package/scripts/start.sh +167 -0
  849. package/scripts/stop.sh +113 -0
  850. package/install.sh +0 -35
package/CHANGELOG.md ADDED
@@ -0,0 +1,881 @@
1
+ # CHANGELOG
2
+
3
+ ## 2026-09-16 — Omarchy-first, host-aware: Windows and macOS get a door
4
+
5
+ - **`bin/host-sense.sh`** — the one place that looks before anything acts. It
6
+ reports THIS machine: distro and family, kernel, arch, platform (linux · wsl ·
7
+ macos · windows), session (Wayland/X11), desktop, compositor, package manager,
8
+ and what the desktop can actually *do* — `placement`, `launcher`, `tray`. No
9
+ layer may assert a machine it is not standing on.
10
+ - **Omarchy stays first-class, and is now gated.** `bin/omarchy-sense.sh` opens
11
+ by asserting *"Ymir runs on an Omarchy host"*; on any other host it now skips
12
+ cleanly and points at `bin/host-sense.sh`, rather than recording the wrong
13
+ machine. That is Rule 05's own rule: a layer is gated on its host.
14
+ - **Windows has a door:** `bin/bootstrap-windows.ps1` — enables WSL2, installs
15
+ Ubuntu, then hands the work to `bin/ymir-install.sh` inside the distro. It is
16
+ honest about needing elevation and about the one reboot a fresh machine needs.
17
+ - **macOS has a door:** `bin/bootstrap-macos.sh` — raises Ubuntu in a Lima VM and
18
+ installs Ymir inside it, plus `packaging/macos/Ymir Installer.command`, a
19
+ double-clickable launcher for an operator who should not need a terminal.
20
+ - **The installers themselves:** `packaging/build.sh --exe|--mac|--check`, the
21
+ NSIS script `packaging/windows/ymir-setup.nsi` (→ `Ymir-Setup.exe`), and
22
+ `.github/workflows/ymir-installers.yml`, which builds the exe on an Ubuntu
23
+ runner (NSIS is a compiler, not a Windows VM) and the .pkg on a macOS runner
24
+ (pkgbuild is Apple-only). Signing/notarisation stay with the operator, so the
25
+ artefacts ship unsigned.
26
+ - `README.md` gains "Bringing your own machine" — the host table and the build
27
+ commands; its `docs/masterplan.md` pointer is corrected to `$YMIR_HOME/docs/`.
28
+
29
+ ## 2026-09-16 — app packaging prepared under the @ymir scope (Amendment C, part one)
30
+
31
+ - **Scoped names.** `apps/odrerir` was `ymir-odrerir` and `apps/sessrumnir` was
32
+ bare `sessrumnir`; both are now `@ymir/odrerir` and `@ymir/sessrumnir`.
33
+ - **Publishable metadata on all four apps** (hlidskjalf, hlidskjalf-mobile,
34
+ odrerir, sessrumnir): `license`, `repository`, `publishConfig.access: public`,
35
+ a `files` surface, and `prepublishOnly` where a build exists.
36
+ - **Measured with `npm pack --dry-run --ignore-scripts`:** hlidskjalf 1.3 MB /
37
+ 21 files, odrerir 2.3 MB / 15, sessrumnir 4.0 MB / 116, hlidskjalf-mobile
38
+ 2.0 kB / 4 (source only — it has no build script). `dist/ymir.apk` is excluded
39
+ by `!dist/*.apk`: it took the hlidskjalf tarball from 1.3 MB to 14.5 MB, and
40
+ npm is not an APK channel.
41
+ - **`private: true` stays until the Allfather's word** — nothing can publish by
42
+ accident; the flip is one line per app.
43
+ - The app repos were already registered in `$YMIR_HOME/identity/projects.yaml`
44
+ (`zerwiz/{hlidskjalf,hlidskjalf-mobile,odrerir,sessrumnir,smidja}`).
45
+ - `no-mistakes` is initialized for this repo (`no-mistakes init`): the clean-PR
46
+ gate now has its local remote. The vendored skill copy stays — it is the
47
+ canonical tree the skill index names.
48
+
49
+ ## 2026-09-16 — the loader stops deleting: merge, never overwrite
50
+
51
+ - **Root cause of the Apodex-provider loss, mended at the source.** Two writers
52
+ share the untracked `opencode.json`: `bin/valknut-load.sh` (structure, from
53
+ `opencode.json.example`) and `bin/agents-config.sh apply` (the roster —
54
+ providers and per-agent models, from `config/agents.yaml`). The loader
55
+ re-rendered with `sed` + `mv`, so because the example carried only
56
+ `llama.cpp`, **every loader run silently deleted the Apodex provider** that
57
+ lived only in the live file. `config_out` now merges deep and
58
+ `setdefault`-style: missing keys are added, existing ones are never
59
+ overwritten, and the skills path is ensured. Verified by wiping the provider
60
+ by hand: the next run reports `merged(provider.apodex)` and restores it, while
61
+ an unrelated hand-added key survives untouched. Seeding happens only when the
62
+ file is absent.
63
+ - **The changelog guard still bites, without punishing a follow-up.** The
64
+ pre-push guard now accepts either the pushed range touching `CHANGELOG.md` or
65
+ the branch's whole range since it left the trunk touching it — a commit that
66
+ merely lands a file the record already tells needs no micro-entry. A branch
67
+ whose entire range leaves untold is still refused.
68
+ - `bin/valknut-load.sh --status` reports the config outcome
69
+ (`seeded` · `merged(…)` · `unchanged` · `kept`), so a silent stomp can never
70
+ hide behind a "rendered" line again.
71
+ - `harness-integration/README.md` records the two-writer boundary.
72
+
73
+ ## 2026-09-16 — one skills tree, every harness; the config stomp mended
74
+
75
+ - **Every harness now reaches `.agents/skills`.** Pi was already right — its own
76
+ code walks up from the cwd to `.agents/skills` (and `~/.agents/skills`), so it
77
+ discovers Ymir's skills natively with no link and no config; a second root
78
+ under `.pi/` would only double-load. Claude Code, Codex and Cursor read project
79
+ skills from their own directory, so `bin/valknut-load.sh` now binds
80
+ `.claude/skills`, `.codex/skills` and `.cursor/skills` to `../.agents/skills`.
81
+ opencode reaches the tree through `skills.paths`. The install step `loaders`
82
+ runs the loader, so a fresh install gets all of it.
83
+ - **The `harnesses` gate (G14) now asserts the skills surfaces too** — opencode's
84
+ config, Pi's native root, and the three links — so a harness silently loading
85
+ nothing can no longer pass.
86
+ - **Defect mended: the loader was stomping `opencode.json`.** `bin/valknut-load.sh`
87
+ renders `opencode.json` from `opencode.json.example`, and that example carried
88
+ only `llama.cpp` — so a loader run silently **deleted the Apodex provider**,
89
+ which had only ever lived in the generated file. The example now carries Apodex
90
+ as well, with the served id `apodex-1.0-mini`, so a re-render cannot drop it.
91
+ - `bin/valknut-load.sh --status` now reports every surface (agents *and* skills)
92
+ with a true row count instead of a hardcoded header.
93
+ - Assets: `harness-integration/README.md` gains the skill-location table, and
94
+ each per-harness file states its own mechanism.
95
+
96
+ ## 2026-09-16 — Hodd lives outside the repo, and the installer makes it so
97
+
98
+ - **One resolver.** `bin/hoard-lib.sh` (`hoard_root`) is now the single answer to
99
+ *where private data lives*: `$YMIR_HOARD`, else `$YMIR_HOME`, else
100
+ `$HOME/Documents/Ymir` — never the checkout. Rule 07's one documented default,
101
+ in one place.
102
+ - **The inward default is gone.** `bin/mimir-ingest.sh`, `bin/project-git.sh` and
103
+ `bin/workspace-provision.sh` each fell back to `$ROOT/hodd`, so on a machine
104
+ with neither `YMIR_HOARD` nor `YMIR_HOME` exported, memory ingest, the project
105
+ registry and workspace provisioning wrote private data **inside the repo**.
106
+ All three (plus `bin/hodd.sh` and the installer) now resolve through the lib.
107
+ - **The misplaced document is out.** `0003-private-data-separation.md`, which had
108
+ come to rest in the repo at `hodd/docs/plans/`, now lives in the hoard at
109
+ `$YMIR_HOME/docs/plans/`. The repo's `hodd/` holds exactly the guard, the
110
+ README and `AGENTS.example.md` — Rule 04's scaffold set, and nothing else.
111
+ - **Installed, not assumed.** `bin/ymir-install.sh` step `tree` now raises the
112
+ hoard layout *outside* the repo (`bin/hodd.sh init`) and seeds an empty
113
+ `secrets/platform.env` (mode 0600), so `bin/hodd.sh emit secrets/platform.env`
114
+ resolves on a fresh machine instead of failing with "not readable".
115
+ `assets/installation.md` and `assets/memory-well.md` updated in the same change.
116
+
117
+ ## 2026-09-16 — the pane bridge keeps its quoting; Phase 3 verified
118
+
119
+ - **The Apodex plan's last open verification is closed.** Run in a herdr pane —
120
+ `bin/herdr-run.sh run huginn-research -- bin/huginn-research-worker.sh --brief
121
+ "…" --output-dir …` — the worker recalled, dispatched to the Apodex seat, wrote
122
+ its verdict, and observed it into Mimirsbrunn (`status: completed`, verdict
123
+ *"The capital of Norway is Oslo."*). Phase 3 needed a spawn, which the
124
+ read-only session lock had forbidden; it was run once the lock was this
125
+ session's.
126
+ - **Defect found and mended — `bin/herdr-run.sh run` lost its quoting.** A pane
127
+ runs its command through a *shell*, but the bridge handed herdr the raw argv.
128
+ An argument containing spaces reached the pane as separate words, so
129
+ `--brief "In one sentence: …"` arrived as `--brief In one sentence: …` and the
130
+ worker died with `error: unknown arg: one`. Every real brief is multi-word, so
131
+ the documented invocation could never have worked. `run` now quotes each
132
+ argument on the way in (`printf '%q'`), verified by re-running it.
133
+ - Asset updated in the same change: `.agents/skills/ymir-host/assets/thjazi.md`
134
+ carries the quoting rule.
135
+
136
+ ## 2026-09-16 — the skill-loading audit: wrong skills unloaded, the index made true
137
+
138
+ - **Three phantom skills stopped loading.** opencode was loading `galdr-compliance`
139
+ and `galdr-crafter` — both superseded, their work long since moved to
140
+ `tyr-check` — and `NSR`, the NSR scaffolding spec, which sat at
141
+ `assets/nsr/SKILL.md` carrying frontmatter. A recursive scanner walks
142
+ `skills.paths` to *any* depth, so all three were announced to every agent as
143
+ live skills. The two galdr crafters are removed; the NSR spec is renamed
144
+ `assets/nsr/scaffold-spec.md` and stays a document (its sibling templates
145
+ carry no frontmatter and were already inert).
146
+ - **Two gates added, one per failure class** (`compliance-check.sh`):
147
+ - **`harnesses` (G14)** — every link in `.claude/agents`, `.codex/agents`,
148
+ `.cursor/agents`, `.pi/agents`, `.opencode/agent` must land, one hop, in the
149
+ canonical `.agents/agents/` tree (Rule 02), and no nested `SKILL.md` may
150
+ carry frontmatter. One hop deliberately: Galdr's agent file *is* the skill,
151
+ by the dual-surface rule.
152
+ - **`skillindex` (G15)** — every real skill dir must be named in
153
+ `.agents/skills/README.md`, and every `.agents/skills/<name>` path the assets
154
+ cite must exist. Lines marked planned/legacy/superseded/removed/abandoned/
155
+ retired are exempt by intent.
156
+ - **The drift they exposed, mended:** the canonical index listed 23 skills while
157
+ 26 existed (`groa-update`, `lifecycle`, `rules-check-drift` were missing); the
158
+ Galdr and `.agents/assets/agents` registries still described a layout that no
159
+ longer existed (`smidja/`, `gunnlod`, `hamr`, `saga`, `ymir`, `open-design`),
160
+ pointing the agent at files that were not there; dead paths corrected to the
161
+ real names (`smidja-factory`, `saga-bearings`, `urdh-hold`, `nornir-schedule`,
162
+ `ymir-host`, `hamr-adapters`); `brokk-craft` marked planned rather than
163
+ presented as a working command.
164
+ - **`AGENTS.md` gains the invariant:** the delivery gate is enforced in git
165
+ hooks seated by the install step `gates` — `branch-guard` refuses a protected
166
+ branch, `changelog-guard` refuses a push whose range never touches
167
+ `CHANGELOG.md`.
168
+
169
+ ## 2026-09-16 — the delivery gates install themselves; rename drift mended
170
+
171
+ - **Install seam.** `bin/ymir-install.sh` gains step **`gates`** (after
172
+ `loaders`): `bin/secret-guard.sh --install` seats the pre-commit guard and
173
+ `bin/changelog-guard.sh --install` the pre-push (branch + changelog). A fresh
174
+ clone now gets the delivery gate without a manual step — `--check` reports it
175
+ as `gates OK|WARN`, the consent preamble names it, and
176
+ `assets/installation.md` carries the row in the same change.
177
+ - **Drift mended — found by the compliance gate, not by me.** Two symlinks
178
+ still pointed at the retired `galdr-cli` skill, so the last rename was not in
179
+ fact complete: `.agents/agents/galdr.md` (Galdr's agent surface was a **dead
180
+ link**) and `.agents/skills/tyr-check/assets`. Both repointed at
181
+ `galdr-ymirsystem`, which is where the skill and its assets live.
182
+ - **`AGENTS.md` TOON mend.** The `security[4]` block carried a rule wrapped
183
+ across two lines, which the checker counted as a fifth row. Joined to one
184
+ line; the block now declares and holds exactly four.
185
+ - **Compliance.** All ten Galdr gates green: toon · naming · mocks · syntax ·
186
+ json · sync · surfaces · assets · duplicates · governed.
187
+
188
+ ## 2026-09-16 — Smiðja moves into the app tree
189
+
190
+ - **The smithy is an app.** Its 148 source files moved from
191
+ `.agents/skills/smidja-factory/` to `apps/smidja-factory/`, joining
192
+ hlidskjalf, odrerir and sessrumnir under `apps/`.
193
+ - **Path-transparent.** `.agents/skills/smidja-factory` is now a symlink to
194
+ `../../apps/smidja-factory`, so every existing path resolves unchanged —
195
+ `scripts/start.sh`, `bin/ymir-install.sh`, `bin/ymir-validate.sh`, and the
196
+ skill loader (`.agents/skills` is a skills path). `node_modules/` stays
197
+ gitignored and is not carried.
198
+ - **Still open** (recorded, not done): the root `smidja/` runtime tree
199
+ Amendment A would move to `apps/smidja/`, and Amendment C's per-app GitHub
200
+ repos and npm publishing.
201
+
202
+ ## 2026-09-16 — the changelog guard: no push ships untold
203
+
204
+ - **Every push carries a CHANGELOG entry.** `bin/changelog-guard.sh` installs a
205
+ pre-push hook that reads the refs git hands it, resolves the range being
206
+ pushed, and refuses the push when `CHANGELOG.md` is untouched in that range.
207
+ A change that ships is a change that was told; the record can no longer lag
208
+ silently behind the code.
209
+ - **Rule 08 extracted and versioned.** The protected-branch check that lived
210
+ only inside the ad-hoc `.git/hooks/pre-push` is now `bin/branch-guard.sh`, so
211
+ the delivery gate is reproducible: `bin/changelog-guard.sh --install` writes
212
+ the pre-push that runs both guards.
213
+ - **Escape hatch, deliberate and loud.** `YMIR_SKIP_CHANGELOG_GUARD=1 git push`
214
+ when an entry truly does not belong.
215
+ - Checks by hand: `bin/changelog-guard.sh --range A..B`,
216
+ `bin/branch-guard.sh --branch main`.
217
+
218
+ ## 2026-09-16 — Apodex seat verified; the Weave mended
219
+
220
+ - **Correction (cites the entry below, never rewrites it).** The earlier
221
+ entry said *"LM Studio is retired; its :1234 port belongs to Apodex now."*
222
+ That was false as carved. LM Studio still holds `:1234` and is what serves
223
+ the Apodex GGUF; Apodex took the **model seat**, not the server.
224
+ - **Live verification.** `bin/apodex-smoke-test.sh` → PASS (valid tool-capable
225
+ response, exit 0). `bin/huginn-research-worker.sh` with **bare defaults** →
226
+ `status: completed`, verdict written, observed into Mimirsbrunn. The Apodex
227
+ seat (`http://127.0.0.1:1234/v1`) is live.
228
+ - **One model id, everywhere.** The seat serves **`apodex-1.0-mini`**; the
229
+ worker, smoke test, `.env.example`, `opencode.json`, `config/agents.yaml.example`
230
+ and Huginn's profile now all say so. Previously three names drifted
231
+ (`apodex/Apodex-1.0-mini-Q4_K_M`, `apodex/apodex-mini-q4`, the served id) and
232
+ the default worker call failed with `No models loaded`.
233
+ - **Four defects mended.** `bin/huginn-research-worker.sh` made executable
234
+ (was 644 — bare invocation died with `Permission denied`); the smoke test's
235
+ `--serve` GGUF path corrected to
236
+ `~/Models/FlameF0X/Apodex-1.0-mini-Q4_K_M-GGUF/apodex-1.0-mini-q4_k_m.gguf`;
237
+ `bin/models-detect.sh` env var renamed from the typo `APEDEX_URL` to
238
+ `APODEX_URL`.
239
+ - **Weight truth.** The Apodex Q4_K_M weights are **21.7 GB**, not the ~4–6 GB
240
+ the plan assumed — it cannot sit beside a coding model. `AGENTS.md` now says
241
+ so: one local model at a time, by weight.
242
+ - **Smiðja relocated.** `.agents/skills/smidja-factory` is now a symlink to the
243
+ app tree at `apps/smidja-factory/`, which is where the smithy's real files
244
+ live (Amendment A/C of the Apodex plan).
245
+ - Plan (private hoard): `$YMIR_HOME/docs/plans/apodex-integration-into-ymir.md`
246
+ — Amendment E records the live pass, the mended defects, and the one open
247
+ item: the herdr-seat verification (Phase 3), which needs a spawn.
248
+
249
+ ## 2026-09-16 — Apodex joins the Weave (research/planning provider)
250
+
251
+ - **Apodex provider.** Apodex-1.0-mini-Q4_K_M climbs into the machine as
252
+ the research/planning GGUF on `http://127.0.0.1:1234/v1`, seated
253
+ alongside llama.cpp coding models on :8080. LM Studio is retired; its
254
+ :1234 port belongs to Apodex now.
255
+ - **Env template.** `.env.example` gains the `APODEX_*` block; the LM
256
+ Studio block is marked RETIRED with its port claim corrected.
257
+ - **Smoke test.** `bin/apodex-smoke-test.sh` — probe or serve-and-test an
258
+ Apodex seat; exits 0=pass, 1=fail, 2=unavailable. Never mutates config.
259
+ - **Research worker.** `bin/huginn-research-worker.sh` (Apodex-powered
260
+ Eindri): takes a brief, recalls from Mimirsbrunn, dispatches to the
261
+ Apodex chat/completions seat, writes a structured verdict, observes it
262
+ back into the well. Wears the name **Huginn** per the naming law (the
263
+ research seat; Gungnir stays the skill-synthesis engine).
264
+ - **Agents hall.** `.agents/agents/huginn-researcher.md` binds Huginn to
265
+ the apodex model; `config/agents.yaml.example` registers the apodex
266
+ provider and Huginn's seat; `opencode.json` carries the apodex provider
267
+ block alongside llama.cpp; `bin/models-detect.sh` probes and emits the
268
+ apodex provider for the Pi model file (`~/.pi/agent/models.json`).
269
+ - **Install seams.** Apodex rides the existing seams: models-detect merges
270
+ it into the Pi models file at install; agents-config applies it into
271
+ opencode.json. Model provider selection documented in AGENTS.md
272
+ (`## Model Provider Selection`), Apache 2.0 licence noted.
273
+
274
+ ## 2026-09-16 — Gunnlöð joins the hall (SkillOpt integration)
275
+
276
+ - **SkillOpt integration.** `pip install skillopt` into `.venv/`; training
277
+ loop (`skillopt-train`), eval (`skillopt-eval`), and nightly
278
+ self-evolution (`skillopt-sleep`) available for Smíðja prompts and
279
+ Ymir skills. Nightly Nornir job at 00:30 (bin/nornir-job-skillopt-sleep.sh),
280
+ staged artifacts only — Allfather approves before adopt. One-time setup:
281
+ `bin/skillopt-setup.sh`.
282
+ - **Naming.** SkillOpt adopted the name **Gunnlöð** (keeper of the mead of
283
+ poetry — distills trajectories into refined skill artifacts). Added to
284
+ `.agents/assets/agents/naming.md` (platform map, 28 subsystems),
285
+ `.agents/skills/galdr-ymirsystem/assets/registry.md` (skills + external tools),
286
+ `README.md` (System Map + Skills + gratitude), `NOTICE` (MIT attribution).
287
+
288
+ ## 2026-09-13 — the imported names leave the halls (Norse naming purge)
289
+
290
+ - **"firstmate" retargeted to Ymir's own names across every Ymir-owned surface.**
291
+ The upstream distro's nautical vocabulary is gone from the docs, skills, `bin/`,
292
+ config, and the Hlidskjalf review copy: `firstmate` → **Brokk**, `secondmate` →
293
+ **Eindri-home**, `crew`/`crewmate` → **Eindri**, `captain` → **Allfather**
294
+ (`docs/lore.md`, `docs/Architecture.md`, `.agents/agents/brokk.md`,
295
+ `.agents/skills/herdr-panes/assets/{herdr,tmux}-backend.md`,
296
+ `.agents/skills/eindri-homes/assets/control-plane.md`,
297
+ `.agents/skills/saga-bearings/assets/board-template.html`,
298
+ `.agents/skills/ymir-host/assets/thjazi.md`, `bin/README.md`,
299
+ `apps/hlidskjalf/**`).
300
+ - **Engine literals kept.** Every real upstream identifier stays verbatim — the
301
+ Herdr labels (`firstmate`, `2ndmate-<id>`, `firstmate-<id>`), the home marker
302
+ `.fm-secondmate-home`, the envelope `FIRSTMATE_OP: ` and `[fm-from-firstmate]`,
303
+ and all `FM_*`/`fm-*` names — because `.agents/backend/` (the vendored engine)
304
+ and `assets/reference/` (provenance) are untouched.
305
+ - **Licensing.** `NOTICE` now records the upstream **firstmate** distro
306
+ (`github.com/kunchenguid/firstmate`, MIT, © kunchenguid) and a README "Built on"
307
+ section points to it; the MIT copyright/permission notice is retained.
308
+ - **Governed asset:** `galdr-ymirsystem/assets/hlidskjalf-ui.md` records the Allfather
309
+ review copy in the same change. `compliance-check.sh` 10/10 PASS.
310
+
311
+ ## 2026-09-13 — The realm seat, carved (wayof)
312
+
313
+ - **Problem:** the realm tree was bare (only the shipped example), no tenant
314
+ was seated, and the session digest resolved the Allfather's realm to
315
+ `default` — his company and private holdings unreachable by the map.
316
+ - **Seat:** `svartalfaheim/wayof/` carved from the example — `.env.realm`,
317
+ `SECRETS.md`, `AGENTS.md` (persona), `domains/`, `projects/`, the five
318
+ workspace branches, and the 9 company cards seeded from the identity hoard
319
+ (askr · brokkforge · dvalin · mannheim · muninn · runestone · utgard · wayof ·
320
+ ymirlabs), realm field unified to `wayof`, repo paths corrected to this
321
+ machine. `data/realm.md` now pins `wayof` (was drifting between `way-of`,
322
+ `wayof`, and `default`; hoard cards + persona updated to match).
323
+ - **Hood:** `svartalfaheim/wayof/HOOD.md` is the map of the hoard and the
324
+ seat; `bin/saga-session-start.sh` stage 6 (context digest) now prints
325
+ `--- hood ---` whole from the realm seat, so a session opens knowing the
326
+ operator's holdings. Living overviews: `workspace/company/wayof-overview.md`
327
+ and `workspace/company/aigf.md` (hodd stays the private store; the realm
328
+ points at it).
329
+ - **Verified:** `bash -n` green; realm-lib resolves `wayof`; `realm env:
330
+ present`.
331
+
332
+ ## 2026-09-13 — Gleipnir sees when an agent is turned off
333
+
334
+ - **Problem:** the machine lock stuck “held by another Brokk session” forever.
335
+ Nothing released it ( `gleipnir_lock_release` had zero callers; Pi's exit
336
+ hook only stopped the arm child), and liveness was `kill(0)` alone — which
337
+ reports a zombie (dead but unreaped) and a recycled pid as alive, so an
338
+ agent you turned off kept the helm until its pid happened to look gone.
339
+ Worse, the Sessrúmnir desktop RPC session holds the live lock yet never
340
+ arms supervision (no turn ever calls `gna_watch_arm`), stranding every
341
+ other session read-only.
342
+ - **Fix:** `bin/gleipnir-lock-lib.sh` now records the owner's starttime in a
343
+ `brokk.lock.starttime` sidecar and reaps a holder whose `/proc/<pid>/stat`
344
+ state is `Z`/`X` or whose starttime no longer matches (pid reuse) — dead,
345
+ zombie, and recycled holders are cleared at session start/acquire. Gná
346
+ (`gna-pi-watch.ts`) mirrors that liveness, reclaims a stale lock directly in
347
+ `gna_watch_arm` (`missing` no longer punts to saga-session-start.sh), and
348
+ drops its own lock on real process exit (`releaseLockIfOwned`); the turn-end
349
+ guard (`syn-turnend-guard.ts`) uses the same zombie-aware check.
350
+ - **Impact:** turning an agent off — cleanly, by kill (zombie), or after pid
351
+ reuse — frees the machine lock for the next session. The live desktop seat
352
+ still holds it until that app is closed or its own session arms; that is the
353
+ law (one live primary per machine), but it now releases and hands off
354
+ correctly.
355
+ ## 2026-09-13 — the cloth reaches all three halls (Hlidskjalf · Smíðja · the seat)
356
+
357
+ - **One look, one source.** The carved cloth (the landing page's `:root`) now
358
+ dresses every hall, each through its own thin adapter, and `docs/design.md`
359
+ gained §0 *The cloth* plus the re-cut §4.1/§4.2 tables — the contract, not a
360
+ wish. `midgard/design-system/tokens.css` keeps every `--ymir-*` **name** and
361
+ changes only the values: stone `#0e0c09`/`#151209`/`#1a1610`/`#221d14`, bone
362
+ text `#cfc3a9`/`#9a8f75`/`#6b6250`, bronze `#c9973f` accent with `#7d5f2a` as
363
+ the brass rule, blood `#c2584a` danger, steel `#96a0a8` ok, brass bevel
364
+ `inset 0 0 0 1px rgba(201,151,79,.12)`.
365
+ - **Type.** Cormorant (display), Newsreader (body), IBM Plex Mono (data) — the
366
+ landing's three faces — with Noto Sans Runic appended to every stack so runes
367
+ fall through to the rune family. Hlidskjalf loads them from Google Fonts; the
368
+ visualizer bundles them from `@fontsource` (its `@fontsource/play` is gone).
369
+ - **Hlidskjalf:** 24 old-palette `rgba()` literals and every role hex in the
370
+ stylesheets now read tokens (`color-mix(… var(--ymir-ok) …)`); workspace tints
371
+ are cloth (work bronze, personal steel); the `HallsChooser` cards no longer name
372
+ two tokens that never existed (`--ymir-line`/`--ymir-panel`); the login's GitHub
373
+ button is a bone plate; the realm-tint fallbacks in `global.css` follow.
374
+ - **Smíðja's eye:** the default theme is **fensalir** (the titlebar toggle cycles
375
+ fensalir → classic → high-contrast, both overrides still winning); 77 hexes and
376
+ 62 `rgba()`s across the components were recast onto the theme's own tokens; the
377
+ categorical event/lane palettes (`src/lib/events.ts`) were re-cut onto the cloth
378
+ while staying mutually distinct.
379
+ - **Sessrúmnir:** text selection is now a **theme token**
380
+ (`--color-selection-bg`/`-fg`) — the landing's amber `#57411a` on pale bone
381
+ `#f0e6cd` — carried in `fensalir`/`sessrumnir` and derived per theme for
382
+ everyone else; the global rule sits in `@layer base`, and the CodeMirror editor
383
+ needs a second unlayered rule because CodeMirror paints its selection layer with
384
+ unlayered CSS that beats any layered rule. A **To the Hall** button joins the
385
+ status bar (local `:4322` when it answers, else `hall.ymir.zerw.org`, resolved in
386
+ the main process).
387
+ - **Heraldry is not chrome:** the eight house/domain seals and the Emblem keep
388
+ their own colours — exactly as the landing page keeps its house seals.
389
+ - **Geometry is untouched** (radius, spacing, the shell): the carved-slate
390
+ squaring remains an open question for the Allfather.
391
+ - **Verified:** `tsc` clean and `npm run build` green in Hlidskjalf; the
392
+ visualizer builds under `vue-tsc`; Sessrúmnir's build, lint, theme tests and
393
+ semantic-colour check green. Headless passes: Hlidskjalf's gates render with
394
+ **0 console errors** (login, fleet, tasks, processes, reviews, runtime, cron,
395
+ stats), and the visualizer loads with 0 console problems.
396
+
397
+ ## 2026-09-13 — the carved cloth reaches the seat-hall (Sessrúmnir)
398
+
399
+ - **The landing's cloth is now the seat's own look.** Every semantic token in
400
+ `apps/sessrumnir/src/renderer/src/index.css` `@theme` was mapped to its carved
401
+ twin from the landing page's `:root` (`CodeP/ymir-homepage/src/lore.html`):
402
+ stone `#0e0c09` (app) with panels `#151209`/`#1a1610`/`#14100b`, bone text
403
+ `#cfc3a9`/`#9a8f75`/`#6b6250` (faint/ghost as bone washes), bronze
404
+ `#c9973f` accent and `#7d5f2a` brass rule for `border-strong`, blood
405
+ `#c2584a`/`#7c3a30` for error, steel `#96a0a8` for success. Semantic names are
406
+ unchanged — only the values moved.
407
+ - **Fensalir** (the weaving halls) is registered as a built-in theme
408
+ (`themes/fensalir.json`, id `fensalir`, appended to `BUILTIN_THEME_IDS` — an
409
+ additive change that keeps every persisted id resolving). The seat's own
410
+ built-in `sessrumnir` theme was carved to the same cloth, so the default look
411
+ of an existing profile is the cloth on restart. A new test holds the two
412
+ together (`the cloth is one`) and another holds the CSS `@theme` base to the
413
+ theme file (`never drift`).
414
+ - **Cloth is the default, not a cage:** the ThemeEngine's ordering is untouched —
415
+ every other built-in theme, any user theme, and `high-contrast` still win when
416
+ chosen.
417
+ - **Type:** Cormorant (display), Newsreader (body), IBM Plex Mono (mono) bundled
418
+ from `@fontsource*` (offline, `font-src 'self'`), with Inter/JetBrains Mono
419
+ kept as glyph fallbacks; the landing's carved syntax palette (`--cm-*`) rides
420
+ along in the theme files.
421
+ - **Honest repairs on the way:** 29 raw `text-white` literals sat on token
422
+ fills where white cannot be read on bronze (2.6:1). They now read the token
423
+ that means "the rune on the filled plate" — `text-inverse` on `bg-accent`,
424
+ `text-primary` on the dark blood `bg-error` — and the settings toggle knob is
425
+ carved (stone when lit, bone when unlit). No colour literals remain in
426
+ components.
427
+ - **Paper:** `apps/sessrumnir/AGENTS.md` and `README.md` no longer claim the old
428
+ sky-on-navy palette; they describe the cloth and its rules.
429
+
430
+ ## 2026-09-13 — the new tree, the mesh, the seat-hall
431
+
432
+ - **Everything in the new tree:** the Sessrúmnir work plus the orphaned fixes
433
+ were migrated from the `ymir-old` working tree into this canonical tree —
434
+ `apps/sessrumnir/` (deps vendored locally, never committed), the two
435
+ `bin/sessrumnir-*.sh` scripts, `step_sessrumnir` in `bin/ymir-install.sh`,
436
+ the Hoard registry entry, the `installation.md` asset, and the
437
+ `syn-watch-arm.js` continuity fix (re-arm when `.supervision-armed` exists
438
+ even with no task metadata). The superseded self-service register-gate work
439
+ was **not** ported — this tree's committed invite-gate is canonical.
440
+ - **Full install ran green** in the new tree: every step OK, invite minted
441
+ (`YMIR-DBN4-FXEX`), all five services up, `bin/ymir-validate.sh` 11/11 PASS.
442
+ - **Ratatoskr mesh healed:** the `a2abridge` engine (MIT,
443
+ `vbcherepanov/a2abridge` v3.0.0) is installed at `~/.a2abridge/bin/`, its
444
+ directory daemon runs on `127.0.0.1:7777`, and `bin/ratatoskr.sh
445
+ status|doctor` pass. Forged `bin/a2abridge-ensure.sh` (installs the engine,
446
+ patches the systemd unit's unwritable `/var/log` log paths to journal,
447
+ keeps the directory up) and wired it into migration `0002-a2a-mcp.sh`, so
448
+ every install/update heals the mesh instead of leaving a dangling MCP path.
449
+ - **MCP bridges fixed:** `engram-mcp` failed at startup (its Python env
450
+ lacked the `mcp` SDK; mcp 2.x renamed FastMCP, so it is pinned to `mcp<2`)
451
+ — the server now initializes against the `kaia.engram` store. `a2abridge`
452
+ MCP is wired into both pi and opencode via `bin/a2a-mcp.sh install`.
453
+ - **Docs:** `docs/design.md` §5.4 documents the gate exactly as committed
454
+ (operator credential + invite-gated registration + GitHub door + httpOnly
455
+ 30-day session); the hlidskjalf-ui skill gained the `register` surface row.
456
+
457
+ ## 2026-09-13 — Sessrúmnir, the seat-hall
458
+
459
+ - **Sessrúmnir adopted:** the Apache-2.0 **pi-desktop** GUI
460
+ (`FaqFirebase/pi-desktop`, v0.1.7-alpha) is vendored at `apps/sessrumnir/`
461
+ and rebranded **Sessrúmnir** — the seat-hall where the Allfather converses
462
+ with the machine. The external engine keeps its product name; the GUI the
463
+ user sees is Sessrúmnir, themed with the way-of palette (sky `#38bdf8` on
464
+ deep navy) as the new default built-in theme. Window titles, launcher,
465
+ package identity, tray/autostart strings, data-dir name, and the Pi logo
466
+ (now a Sowilo rune bolt) are rebranded; upstream `LICENSE` is preserved and
467
+ `NOTICE` records the adoption.
468
+ - **Forge scripts:** `bin/sessrumnir-ensure.sh` (status/ensure/install — deps
469
+ are never committed, installed on first run with the electron-binary heal
470
+ `scripts/electron.sh` already uses) and `bin/sessrumnir.sh`
471
+ (start/status/stop with a workspace argument).
472
+ - **Install wiring:** `bin/ymir-install.sh` gains a `sessrumnir` step (after
473
+ `hermes`) and lists Sessrúmnir in `workspace/INSTALL.md`; the
474
+ `installation.md` asset's step table, adopted-engines table, and Hermes-style
475
+ section are updated in the same change.
476
+ - **Registry & audit:** the Hoard registry (`hodd/identity/projects.yaml`)
477
+ gains the `sessrumnir` project (upstream remote); the adoption is inscribed
478
+ in Runes.
479
+ - **Not yet installed:** `apps/sessrumnir/node_modules` is absent — run
480
+ `bin/sessrumnir-ensure.sh install` when ready.
481
+
482
+ ### 2026-09-13 — the seat-hall raised
483
+
484
+ - `bin/sessrumnir-ensure.sh install` completed: deps + Electron binary + build
485
+ all green; full test suite **989/989 pass**, typecheck and lint clean (the
486
+ `autostart-linux` test was updated for the new brand name). `bin/sessrumnir.sh
487
+ start` raised the window — Hyprland reports class `sessrumnir`, title
488
+ `Sessrúmnir`, data under `~/.config/sessrumnir`.
489
+
490
+ ## 2026-09-12 — The well actually installs (it never did)
491
+
492
+ - **The memory engine was never installed by the installer.** `bin/prereq-ensure.sh`
493
+ had no `engram` target at all, and `bin/ymir-install.sh` only *checked* for it
494
+ and printed `SKIP "optional — install engine then run bin/mimir-bridge.sh"`. A
495
+ SKIP never blocks, so the well was silently down on every install.
496
+ - **The hint named the wrong package.** PyPI's `engram` is an unrelated
497
+ *rendering* library (mitsuba/drjit/torch): following the hint pulled gigabytes
498
+ of CUDA wheels and still left no engine. The memory engine's distribution is
499
+ **`engdbram`**; its module is `engram`. The pre-swap append-only log had the
500
+ right answer all along (`PyPI engdbram, v2.2.1`).
501
+ - **Now it installs.** `prereq-ensure.sh engram` installs `engdbram` into an
502
+ interpreter that can run it (>=3.11; uv supplies 3.12 here), records that
503
+ interpreter in `~/.config/ymir/engram-python`, and `bin/mimir-bridge.sh` reuses
504
+ it for both the check and the run. The installer provisions rather than hints,
505
+ and reports WARN instead of a silent SKIP when it cannot.
506
+ - **Verified:** `curl 127.0.0.1:4602/health` -> `{"status": "up", "store":
507
+ ".agents/memory/kaia.engram"}`; `.agents/skills/lifecycle/smoke_test.sh` exits 0
508
+ with all five checks green.
509
+
510
+ ## 2026-09-12 — The dashboards stop crash-looping on the iGPU
511
+
512
+ - **`scripts/electron.sh` decides its own GPU path.** Both dashboards appeared to
513
+ work while `coredumpctl` filled with SIGSEGV cores from
514
+ `electron --type=gpu-process`. An iGPU backs its graphics memory with system
515
+ RAM (GTT), a local model served on that same iGPU held 5.8-8.0 GiB of it, and
516
+ the amdgpu driver then failed the desktop's command submissions — which
517
+ Electron turned into a NULL dereference at a constant offset. Only the GPU
518
+ process died, so the windows stayed up and the failure was easy to miss.
519
+ `igpu_vram_small()` now reads the render device's VRAM carve-out and switches
520
+ to software rendering under `YMIR_IGPU_VRAM_SMALL_MIB` (default 2048). The old
521
+ comment promised this auto-detect; now it exists. `YMIR_DESKTOP_DISABLE_GPU`
522
+ still overrides, both ways.
523
+ - **Verified:** with the fix, the amdgpu submission errors stop and the
524
+ gpu-process runs SwiftShader (`--use-angle=swiftshader-webgl`) rather than the
525
+ hardware path; no new cores.
526
+
527
+ ## 2026-09-12 — The editor keeps its own seat
528
+
529
+ - **`open-editor.ts` seats the editor in Þjazi:** inside herdr, `/edit` and
530
+ `ctrl+shift+e` now open the Allfather's editor in its **own tab** of the home
531
+ workspace (`herdr tab create --focus` + `herdr pane run`, label
532
+ `ymir:edit[:<base>]`, recorded in `state/herdr-seats` for `close-all`) instead
533
+ of suspending the pi session — the agent no longer dies when the editor
534
+ opens. Outside herdr the old roads remain: GUI editors launch detached,
535
+ terminal editors suspend the TUI and resume on exit.
536
+ - **`open-editor.ts` shows hidden files:** the picker and `/edit`
537
+ tab-completion now merge the git listing with a bounded walk, so gitignored
538
+ dotfiles (`.env.local`, `.env.realm`, …) are openable too.
539
+
540
+ ## 2026-09-11 — Omarchy-first: host skills, machine learning, native fixes
541
+
542
+ - **New skill `ymir-omarchy`:** Omarchy-native operation — the two laws (never
543
+ edit `/usr/share/omarchy/`; Hyprland owns placement), host detection, the
544
+ monitor/scale coordinate trap, the amdgpu GPU crash and mitigation, desktop-app
545
+ placement, and a safe-customisation table.
546
+ - **New skill `ymir-thjazi`:** Þjazi (herdr-first) — protocol floors (14+ panes,
547
+ 0.8.0 presentation spaces), verification, installation.
548
+ - **Ymir learns the host:** `bin/omarchy-sense.sh` snapshots and *diffs* the
549
+ machine (Omarchy version, explicit packages, config files, monitors, scale) into
550
+ `state/omarchy-setup.json`; `bin/omarchy-hook-install.sh` adds an Omarchy
551
+ `post-update` hook so it re-learns after every `omarchy update`.
552
+ - **Þjazi in the installer:** `bin/herdr-ensure.sh` + new `step_backend`
553
+ (herdr, else tmux — never a silent fallback).
554
+ - **New `step_omarchy`** (SKIP on a non-Omarchy host).
555
+ - **Desktop fixes:** window placement is now LOGICAL and work-area clamped, and
556
+ prefers a non-primary display (the old math used physical pixels on a scale-1.5
557
+ panel and filled the screen). Apps are identified by their command line, not the
558
+ `.bin/electron` shim pid — which fixes the **double-launch** bug. `stop` kills
559
+ every matching pid.
560
+ - **GPU mitigation:** `YMIR_DESKTOP_DISABLE_GPU=1` adds
561
+ `--disable-gpu --disable-gpu-compositing` for small-VRAM iGPUs (the crash was
562
+ `amdgpu: Not enough memory for command submission`, SIGSEGV, not an OOM).
563
+ - **Per-machine state un-shared:** `.agents/memory/kaia.engram*` and
564
+ `well/*.jsonl` were tracked and pushed (one machine's private memory + volatile
565
+ SQLite sidecars). Now gitignored and untracked; the contract is written in
566
+ `.agents/memory/README.md`.
567
+ - **Assets updated:** `installation.md` (15 rows, consent, validation, Omarchy),
568
+ `hlidskjalf-ui.md` (the desktop-apps section).
569
+ - **Verified:** full install green (15 rows; only the docker-group WARN), 9/9
570
+ compliance, both skills registered.
571
+
572
+ ## 2026-09-11 — Load the owning asset before editing a governed path (5 layers)
573
+
574
+ The runtime drifted from its documentation because the asset that governs a
575
+ subsystem was never loaded before the code changed. Five layers now prevent it:
576
+
577
+ - **1. `AGENTS.md`:** a new `governed[6]` table maps each governed path to the
578
+ asset to load first, and `manual[]` gained `installation`, `ui`, `runtime-spec`.
579
+ - **2. Session digest:** `saga-session-start.sh` prints an `ASSET ROUTING` block
580
+ every session, so the mapping is always in context.
581
+ - **3. Router loadable:** `galdr`'s `disable-model-invocation` is removed (it hid
582
+ the one router that owns the assets); `tyr-check` keeps it (deliberate).
583
+ - **4. Enforced seatbelt:** new `bin/syn-asset-pretool-check.sh` denies an
584
+ `edit`/`write` of a governed path until its asset was read (`state/asset-reads`);
585
+ the Pi extension relays it and records asset reads.
586
+ - **5. Compliance gate:** `compliance-check.sh` gains an `assets` check that
587
+ FAILS when a governed path changed without its asset (it caught this very
588
+ change), and `runtime-compliance.md` documents G12 + the routing map.
589
+
590
+ ## 2026-09-11 — Automate the install: consent gate, self-healing prereqs, visualizer-ready
591
+
592
+ - **Consent gate:** a real install now prints its plan and waits for the operator
593
+ to accept (`[y/N]`). Declining changes nothing (exit 3). `--check` still previews
594
+ without asking; non-interactive callers must pass `--yes`.
595
+ - **New `bin/prereq-ensure.sh`:** self-healing prerequisites in USER SPACE —
596
+ installs `bun` and `uv` via their official installers, `mcp<2>` via pip, and can
597
+ fetch a specific Python (e.g. `3.12`) with uv for packages that need one.
598
+ - **New `bin/smidja-bootstrap.sh`:** creates `smidja/smidja_data/smidja.db` from
599
+ the tracer's own schema and seeds a bootstrap session, so the Smíðja visualizer
600
+ has data from the first install. Fixed: it now bootstraps on a bare call
601
+ instead of printing help, and reports failure honestly when the DB is absent.
602
+ - **`bin/ymir-install.sh`:** new `smidja` step; prerequisites delegated to the
603
+ self-healing helper; `engram` reported as an honest optional `SKIP` with the
604
+ exact next command; docker-group-permission and build-failure distinguished.
605
+ - **Verified:** consent refuse/accept/decline paths; smidja db created and read
606
+ back (8 tables, bootstrap session); compliance 8/8.
607
+
608
+ ## 2026-09-11 — Smooth install: provider choice, no forced key, real prereqs
609
+
610
+ - **Model provider is now the operator's choice** (`YMIR_MODEL_PROVIDER`):
611
+ `opencode-go` (needs a key), `lmstudio` (keyless local), or
612
+ `openai-compatible`. The bridge no longer forces `OPENCODE_GO_API_KEY`;
613
+ with no key it auto-selects the keyless local provider so a fresh install works.
614
+ - **New:** `.agents/backend/model-bridge.py` (provider-aware, keyless-capable);
615
+ `opencode-go-bridge.py` kept as a delegating shim so existing references work.
616
+ - **`bin/bifrost-bridge.sh` v2:** `--provider`, provider auto-selection, no hard
617
+ env-file requirement, actionable errors per provider.
618
+ - **`bin/ymir-install.sh`:** installs `bun` for real (user-space, then a package
619
+ hint); installs `mcp<2`; `engram` is now an honest `SKIP` with the Python
620
+ version reason instead of a permanent WARN; distinguishes docker-group
621
+ permission from a build failure.
622
+ - **`scripts/start.sh`:** fixed the early exit that skipped the gate API and all
623
+ services whenever the SPA was already running.
624
+ - **Verified:** compliance 8/8; bridge relays models + chat + 404s; keyless
625
+ start confirmed; `start.sh` raises Gate API, Nornir, Bifrost, visualizer.
626
+
627
+ ## 2026-09-11 — Single-tenant workspaces shipped
628
+
629
+ - **First setup:** `bin/ymir-install.sh` (8 steps) + `bin/workspace-provision.sh`.
630
+ - **Model:** single tenant; workspaces (personal|work) over domains; houses = brands.
631
+ - **UI:** Login onboarding (name/kind/domains), Topbar workspace chip, AccountMenu/Profile relabelled.
632
+ - **Engines:** treehouse → `yggdrasil.sh pool`; sandcastle → `utgard.sh sandcastle`; no-mistakes → Mjollnir gate.
633
+ - **GitHub:** `bin/project-git.sh` reads `workspace/projects.yaml` `git{}`.
634
+ - **Verified:** build green, compliance 8/8, smoke 8/8, lint 4/4.
635
+
636
+
637
+ All significant runtime, policy, and architectural changes for the Ymir platform.
638
+ Entries are appended chronologically; never rewritten.
639
+
640
+ ## 2026-09-11 — Hardcoded per-page feeds (header + stream)
641
+
642
+ - **New:** every gate has its own hardcoded, domain-appropriate rolling feed
643
+ (16 pools, `src/data/feeds.ts`) — Fleet, Tasks, Well, Runes, Reviews,
644
+ Processes (Valhalla), Files, Chat, Forge, Runtime, Cron, Sessions, Trace,
645
+ Decisions, Stats, Profile. Extra Kaia “oracle by the well” lines for the chat
646
+ page.
647
+ - **Header:** a live `PageFeed` now sits in the page header of every gate
648
+ (glyph + hint on the left, the current page's latest 3 messages on the
649
+ right), rolling.
650
+ - **Stream:** the bottom Stream keeps each page's last **40** domain messages,
651
+ with the fleet-wide feed as fallback. A generator tops it up every 2.4s and
652
+ the page is seeded on first visit so it is never cold.
653
+ - **Verified:** `tsc` + `vite build` green, SPA 200, compliance 8/8, smoke 8/8,
654
+ lint 4/4.
655
+
656
+ ## 2026-09-11 — Per-page rolling 40 message feeds
657
+
658
+ - **Change:** the bottom stream is no longer one global 120-line feed. Every gate
659
+ keeps its own rolling window of the **last 40** messages, and events are routed
660
+ to the page they belong to (module → gate: `well`, `sessions`, `forge`,
661
+ `runes`, `cron`, `reviews`, `processes`), with the fleet-wide feed as fallback.
662
+ The stream header shows the current page. `STREAM_WINDOW = 40`, matching the
663
+ chat's `CHAT_WINDOW = 40`.
664
+ - **Verified:** `tsc` + `vite build` green, SPA 200.
665
+
666
+ ## 2026-09-11 — Galdr/Tyr assets: symlink, not copies
667
+
668
+ - **Fix:** `tyr-check/assets` is now a **symlink** to the canonical
669
+ `galdr/assets`, so the two can never drift. A background process had been
670
+ rewriting the registry, flipping the sync gate red; a symlink makes drift
671
+ structurally impossible. Compliance back to 8/8 stable.
672
+ - **Verified:** compliance 8/8, smoke 8/8, lint 4/4.
673
+
674
+ ## 2026-09-11 — Chat uses the root Pi model catalog
675
+
676
+ - **Fix:** the Kaia chat guessed a llama.cpp model id by regex and fell through
677
+ to the Bifrost bridge (`:4603` → 401) when the guess failed.
678
+ - **Now:** the gate API reads the operator's root Pi catalog
679
+ (`~/.pi/agent/models.json`) for the exact provider → base URL, model id, and
680
+ key (llama.cpp router `:8080`, `sk-not-key-required`). A chosen local model
681
+ is tried only on its own base; the default is the operator's Pi default
682
+ (`qwen3.6-35b-a3b@iq3_s`). `/api/chat/models` lists the real connected set.
683
+ - **Verified:** `gemma-4-12b@q3_k_s`, `qwen3.6-35b-a3b@iq3_s` (default), and
684
+ `qwen3.5-9b@q4_k_s` all answered live; no 401.
685
+
686
+ ## 2026-09-11 — Shared well for every harness; no mock; clickable memories
687
+
688
+ - **Harnesses:** the engram MCP server is now registered for all four OpenCode
689
+ accounts (`opencode`, `opencode-rd`, `opencode-work`, `opencode-oczer`), Pi
690
+ (`~/.pi/agent/settings.json` + `mcp.json` + `.pi/mcp.json`), Claude, Cursor,
691
+ and Codex. Registered **unscoped** so every harness reads the one shared well
692
+ (per-call `agent_id` still attributes writes).
693
+ - **No mock:** purged every test/mock episode (`smoke`/`Test observation`) from
694
+ both the engram store and `episodes.jsonl` → 367 true episodes. Test writes
695
+ never enter the well.
696
+ - **UI:** Well memories are now **clickable** — `GET /api/well/episode?id=` and
697
+ a bridge `/episode` endpoint feed a modal with the full memory text.
698
+ - **Bridge fix:** `/recent` and `/recall` restored; added `/episode`.
699
+ - **Lifecycle fix:** `bifrost-bridge.sh` / `mimir-bridge.sh` now stop by process
700
+ match when the PID file is missing, and record the PID when the port is
701
+ already up — so `scripts/stop.sh` truly lowers the whole system and
702
+ `scripts/start.sh` truly raises it.
703
+ - **Galdr:** new asset `.agents/skills/galdr-ymirsystem/assets/memory-well.md` (store,
704
+ bridge, MCP, harness matrix, laws, verify), routed in `SKILL.md`; registry +
705
+ harness README updated; mirrored to tyr.
706
+ - **Verified:** MCP recall 1.0 / stats 367, full stop→start cycle (3888/3889/
707
+ 4602/4603/8437), compliance 8/8, smoke 8/8.
708
+
709
+ ## 2026-09-11 — The well is real (Mimirsbrunn / engram)
710
+
711
+ - **New:** `bin/mimir-bridge.py` + `bin/mimir-bridge.sh` — the `:4602` HTTP face
712
+ the supervision tree named but that upstream never shipped (engram exposes a
713
+ CLI + MCP server only). Endpoints: `/health`, `/recall`, `/recent`,
714
+ `/timeline`, `/inspect`, `/observe`.
715
+ - **New:** repo-local store `.agents/memory/kaia.engram`, seeded from the
716
+ 368-episode JSONL well.
717
+ - **Wired:** gate API `/api/well` now does semantic recall via the bridge (local
718
+ file fallback) and `/api/mimir/health` is live; the Well gate's Bridge tile
719
+ and timeline read real data (mock removed).
720
+ - **Harnesses:** the engram MCP server is registered for OpenCode, Pi, Claude,
721
+ Cursor, and Codex; requires the `mcp<2` SDK (`engram-mcp` breaks on mcp 2.x).
722
+ - **Lifecycle:** the bridge is raised by `scripts/start.sh` and
723
+ `bin/saga-session-start.sh`; the stale `engram.server` command was corrected.
724
+ - **Verified:** bridge up (370 episodes), semantic recall, MCP handshake
725
+ (engram 1.30), compliance 8/8, smoke 8/8.
726
+
727
+ ## 2026-09-11 — Stats 1:1, Kaia chat, Forge prompts
728
+
729
+ - **Stats:** ported the full Smiðja `StatsResponse` 1:1 into the gate API and
730
+ the Stats gate — runs/success/fail/running/rate, token optimization
731
+ (input/output/cache_read/cache_write, cache-hit ratio, avg CHR/run),
732
+ local-vs-online provider split with per-model table, 40-model commercial
733
+ catalog (cached/total/savings/%), by-chain and by-workflow. A real run
734
+ renders live.
735
+ - **Chat (Kaia):** per-session JSONL store (`state/chat/`), list/history/delete
736
+ endpoints, a rolling **40-message** window, query-grounded well recall before
737
+ every dispatch, an animated "Kaia is thinking…" indicator, a session sidebar
738
+ (new/switch/delete), a connected-model datalist (314 models) with free-type,
739
+ and Eindri lane toggles.
740
+ - **Forge:** a Prompts mode to read/edit the smithy's
741
+ `prompt_engineering/<agent>/{system,user}.md` (path-guarded save) and a
742
+ connected-model datalist for agent models.
743
+ - **Verified:** `tsc` + `vite build` green, live chat via local model with
744
+ recall on, prompt roundtrip + traversal guard, compliance 8/8, smoke 8/8,
745
+ lint 4/4.
746
+
747
+ ## 2026-09-11 — Smiðja views are repo-local
748
+
749
+ - **Change:** Removed the last external dependency. `bin/factory-observe.sh`
750
+ (which defaulted to `~/command/factory/factory_data/factory.db`) is gone;
751
+ `bin/smidja-observe.sh` reads the repo's own
752
+ `smidja/smidja_data/smidja.db` read-only and reports absence honestly.
753
+ - **API:** `/api/factory` replaced by `/api/smidja/{health,sessions,sessions/:id,decisions,stats}`
754
+ (`bun:sqlite`, read-only).
755
+ - **UI:** four Hlidskjalf gates added — Sessions, Trace, Decisions, Stats —
756
+ reading the smithy's trace. No `command`/`factory` references remain in the
757
+ runtime or portal.
758
+ - **Verified:** `tsc` + `vite build` green, SPA 200, endpoints honest-absent,
759
+ Galdr compliance 8/8, smoke 8/8.
760
+
761
+ ## 2026-09-11 — Gleipnir lock PID binding fix
762
+
763
+ - **Problem:** The session lock (`state/.lock`) was written with the digest
764
+ helper's PID (a short-lived child) instead of the live Pi harness PID. The
765
+ harness adapter (`gna-pi-watch.ts`) reported "no live session holds the lock"
766
+ and refused to arm the watcher.
767
+ - **Root cause:** `BROKK_SESSION_PID` was never injected into the spawn chain.
768
+ `gleipnir_lock_acquire` fell back to `$$` (helper PID).
769
+ - **Fix:** `.pi/extensions/syn-turnend-guard.ts` and
770
+ `.pi/extensions/gna-pi-watch.ts` now pass `BROKK_SESSION_PID: String(process.pid)`
771
+ in the spawn env, so the lock binds to the live Pi process.
772
+ - **Impact:** Session lock reclamation works on next Pi session start/reload.
773
+ The stale lock (dead PID) is overwritten by the live PID.
774
+
775
+ ## 2026-09-11 — Desktop shell, tunnel, and temporary auth
776
+
777
+ - **Electron:** `apps/hlidskjalf/electron` + `scripts/electron.sh` open Hlidskjalf
778
+ (and Smiðja) as a native window; raises the stack if down.
779
+ - **Tunnel:** `ymirdell.zerwiz.org` → `:3889` via `bin/gjallarhorn-tunnel.sh`
780
+ (cloudflared config in `midgard/infrastructure/ingress/cloudflared-ymir.yml`).
781
+ - **Auth:** hardcoded HTTP Basic (`zerwiz:allfather`, `HLIDSKJALF_AUTH`) on the
782
+ gate API, which now also serves the built SPA. Temporary — move to Heimdall +
783
+ `.env.local`.
784
+ - **Mobile:** PWA manifest added; recommended APK = Capacitor over the tunnel.
785
+
786
+ ## 2026-09-12 — Updater forged + credential moved to env
787
+
788
+ - **`bin/brokk-update.sh`** — the sanctioned, guarded updater the `ymir-update`
789
+ skill calls: fast-forward only, refuses a dirty/diverged tree, `--yes` to
790
+ stash+restore, `--check` to report. Never force-pushes.
791
+ - **Credential law:** the gate login (`HLIDSKJALF_AUTH`) no longer has an inline
792
+ default; it is read from `.env.local` (Bun auto-loads it). Server falls back to
793
+ an open gate only when unset (dev), with the key added to `.env.example`.
794
+
795
+ ## 2026-09-12 — Ró preference moved out of the tracked tree
796
+
797
+ - `.agents/config/ro` was a **git-tracked** per-user toggle (calm on/off); any
798
+ toggle dirtied the tree and made `bin/brokk-update.sh` refuse. It now lives in
799
+ the gitignored `state/ro`; `YMIR_RO`/`BROKK_RO` set a default; the legacy
800
+ `config/ro` is read once for upgrade then never written. Tracked file removed.
801
+
802
+ ## 2026-09-12 — Fleet preferences
803
+
804
+ - `data/fleet.md` (gitignored) holds fleet-wide per-user settings (`ro: on|off`).
805
+ - `bin/fleet-apply.sh` applies them to this home + every registered Eindri-home
806
+ (into each home's gitignored `state/`; remote routes reported).
807
+ - `bin/brokk-update.sh` re-applies fleet preferences on every sweep — one setting
808
+ reaches the whole fleet, no tracked tree dirtied.
809
+
810
+ ## 2026-09-12 — House law (RULES/) and the Grein naming
811
+
812
+ - New `RULES/` (the house law): `01-domains.md` (house = company; domain = a
813
+ **Grein**/**Greinar**; Eindri = specialists), `02-agents.md` (agents live only
814
+ in `.agents/agents`; harness dirs are symlinks; no mock agents), `03-houses.md`
815
+ (a house is a company — WayOf; the eight Labs are domains, never houses).
816
+ - Live Fleet de-mocked (real domain/model/status; seeded stats only in demo).
817
+
818
+ ## 2026-09-14 — A vacant helm is entered, not punted (watcher wake repair)
819
+
820
+ - **Problem:** a watcher wake reported the Pi extension could not restore
821
+ continuity — "this session no longer owns the lock". Root cause found by
822
+ inspection: an **empty/truncated** machine lock (`~/.local/state/ymir/brokk.lock`)
823
+ was classified by `gna-pi-watch.ts` `lockOwnership()` as `other` (another
824
+ live session) and by `bin/syn-watch-arm.sh`'s gate as read-only — so a helm
825
+ with *no verifiably-live holder* was refused and punted to a manual
826
+ `saga-session-start.sh` reclaim.
827
+ - **Fix (both seams in one change):** the extension now classifies an empty
828
+ lock as `missing`, so `gna_watch_arm`'s reclaim takes the helm in place; the
829
+ arm script, on finding no owner (or an owner verifiably gone), runs
830
+ `gleipnir_lock_acquire` itself — which refuses only a genuinely live other
831
+ session — instead of printing read-only. The "run saga-session-start.sh"
832
+ punt is gone; a vacant helm is entered by the watcher's own hand.
833
+ - **Verified:** scratch-state test — empty machine lock → `watcher: started`,
834
+ lock bound to the session pid + starttime sidecar, `.supervision-armed`
835
+ touched; `gleipnir-machine-lock.test.sh` ALL PASS (zombie, recycled,
836
+ migration); compliance 10/10; harness-integration asset updated in the same
837
+ change (the governed rule).
838
+
839
+ ## 2026-09-14 — The Eindri→Brokk wake bridge (they can talk back now)
840
+
841
+ - **Ask:** the seated smiths' reports lived in their panes only; the Allfather
842
+ wanted a feature that wakes Brokk when an Eindri reports, so the fleet's
843
+ doings reach the primary's session — "we are in control, Brokk".
844
+ - **Built:** `bin/eindri-seen.sh` (condition — a report file landed or herdr
845
+ shows the smith left `working`), `bin/eindri-acclaim.sh` (action — files the
846
+ report durably under state/eindri-reports/, marks done under
847
+ state/eindri-done/, appends the wake to state/.wake-queue for Sága's drain,
848
+ sounds the desktop note), and `bin/eindri-watch.sh` (the control door —
849
+ `arm | retire | list | reconcile`, one when-source per smith on the Norns'
850
+ loom via fm-procevent-when.sh, action hash-bound, fires once on a stable
851
+ true, terminal, re-armable).
852
+ - **Armed live:** when-odrerir (already fired — his report was filed) and
853
+ when-sessrumnir-cloth (still working). `fm-procement.sh reconcile` started=2.
854
+ - **First report delivered through the wire:** odrerir's Óðrerir saga — deck
855
+ green at :4322, 52 Chromium checks, commit 38a326b on yggdrasil/odrerir, main
856
+ untouched, plus the hall.ymir.zerwiz.org server story (setup-hall.sh) and
857
+ three asks awaiting the Allfather (go live, landing mobile wart, PLAN log).
858
+
859
+ ## 2026-09-14 — Óðrerir forged (Eindri odrerir, pane w3:p7)
860
+
861
+ - The Live Hall carved on the landing per PLAN.md §14: dealt slate pile,
862
+ choices + recommended marks, freeform, queue + limit guard, thread ledger,
863
+ live tally, four empty states, fail-closed, keyboard, reveal, mobile (390px,
864
+ zero overflow); cloth check green; §12 scan clean. Deployed plan for the
865
+ public hall: hall.ymir.zerwiz.org via a second Caddy site :4322 (deploy/
866
+ setup-hall.sh + tunnel-ingress.sh, idempotent, live provisioning untested).
867
+
868
+ ## 2026-09-14 — The echo guard: no wake flood through Gná's door
869
+
870
+ - **Problem:** during a loud stretch (stale wake lines + the FM runner's
871
+ durable queue holding ten old check-wakes), the watcher re-armed and
872
+ re-signalled "signal: wake queue" across many generations; every actionable
873
+ close queued one pi follow-up wake (`sendWake`, no dedup), which then
874
+ dripped at the Allfather one per prompt — a long echo flood after the
875
+ sources were drained.
876
+ - **Fix:** `gna-pi-watch.ts` `sendWake` is **echo-guarded**: an identical
877
+ watcher message is delivered at most once per drained state — when both
878
+ durable doors (`state/.wake-queue` and the FM runner's
879
+ `.agents/state/.wake-queue`) are empty, a repeat carry is the same drained
880
+ news and is skipped. Genuine new content (different message, or a door with
881
+ a line) always delivers. Harness asset updated in the same change.