@zerwiz/ymir 0.1.26 → 0.1.28

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 (143) hide show
  1. package/.agents/skills/groa-update/SKILL.md +30 -0
  2. package/CHANGELOG.md +44 -0
  3. package/README.md +47 -8
  4. package/bin/fixes-guard.sh +112 -0
  5. package/bin/fixes.sh +157 -0
  6. package/bin/ymir.js +35 -0
  7. package/docs/fixes/agents/unversioned-2026-09-11-chat-uses-the-root-pi-model-catalog.md +15 -0
  8. package/docs/fixes/agents/unversioned-2026-09-11-shared-well-for-every-harness-no-mock-clickable-memories.md +26 -0
  9. package/docs/fixes/agents/unversioned-2026-09-13-gleipnir-sees-when-an-agent-is-turned-off.md +26 -0
  10. package/docs/fixes/agents/unversioned-2026-09-14-the-eindri-brokk-wake-bridge-they-can-talk-back-now.md +23 -0
  11. package/docs/fixes/agents/unversioned-2026-09-16-a-sandboxed-worker-cannot-think-auto-stops-killing-agent.md +18 -0
  12. package/docs/fixes/agents/unversioned-2026-09-17-agents-md-states-the-one-law-no-private-data-in-the-publ.md +25 -0
  13. package/docs/fixes/agents/unversioned-2026-09-17-every-figure-loads-the-agent-directory-was-never-read.md +25 -0
  14. package/docs/fixes/agents/unversioned-2026-09-17-pi-gets-its-agents-and-a-dead-extension-comes-back.md +26 -0
  15. package/docs/fixes/agents/unversioned-2026-09-17-the-well-as-tools-ymir-s-first-custom-pi-extension.md +20 -0
  16. package/docs/fixes/gate/0.1.28-fixes-guard-replaces-the-changelog-gate.md +7 -0
  17. package/docs/fixes/gate/0.1.28-the-changelog-system-is-replaced-by-fix-notes.md +8 -0
  18. package/docs/fixes/gate/0.1.28-the-frozen-changelog-becomes-per-component-notes.md +9 -0
  19. package/docs/fixes/hlidskjalf/unversioned-2026-09-11-automate-the-install-consent-gate-self-healing-prereqs-v.md +21 -0
  20. package/docs/fixes/hlidskjalf/unversioned-2026-09-11-single-tenant-workspaces-shipped.md +15 -0
  21. package/docs/fixes/hlidskjalf/unversioned-2026-09-13-the-cloth-reaches-all-three-halls-hlidskjalf-sm-ja-the-s.md +25 -0
  22. package/docs/fixes/hlidskjalf/unversioned-2026-09-16-one-login-for-every-app-on-the-web-the-gate-fronts-them-.md +24 -0
  23. package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-credential-reaches-the-gate-and-the-hall-stops-leaki.md +23 -0
  24. package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-delivery-gates-install-themselves-rename-drift-mende.md +22 -0
  25. package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-panels-that-crashed-the-gate-that-lied-and-the-well-.md +25 -0
  26. package/docs/fixes/hlidskjalf/unversioned-2026-09-17-0-1-14-the-panels-reach-the-gate-and-the-fourth-window-s.md +9 -0
  27. package/docs/fixes/hlidskjalf/unversioned-2026-09-17-models-providers-and-paths-are-the-user-s-and-the-gate-s.md +26 -0
  28. package/docs/fixes/hlidskjalf/unversioned-2026-09-17-the-northstar-gate-runs-nightly-the-platform-door-it-cau.md +16 -0
  29. package/docs/fixes/hoard/unversioned-2026-09-16-every-app-wears-its-own-rune.md +27 -0
  30. package/docs/fixes/hoard/unversioned-2026-09-16-hodd-lives-outside-the-repo-and-the-installer-makes-it-s.md +24 -0
  31. package/docs/fixes/hoard/unversioned-2026-09-16-the-icons-are-real-runes-now-eight-of-them-were-drawings.md +33 -0
  32. package/docs/fixes/hoard/unversioned-2026-09-17-0-1-26-published-and-the-vault-door-named.md +8 -0
  33. package/docs/fixes/hoard/unversioned-2026-09-17-one-well-in-the-hoard-every-reader-of-kaia-s-memory-reso.md +23 -0
  34. package/docs/fixes/hoard/unversioned-2026-09-17-skrymir-opens-the-hoard-not-the-checkout.md +18 -0
  35. package/docs/fixes/hoard/unversioned-2026-09-17-the-hoard-encrypts-its-secrets-at-rest.md +20 -0
  36. package/docs/fixes/hoard/unversioned-2026-09-17-the-hoard-gets-a-guard-and-rule-04-stops-contradicting-t.md +19 -0
  37. package/docs/fixes/hoard/unversioned-2026-09-17-the-home-s-re-laid-layout-taught-to-the-system.md +17 -0
  38. package/docs/fixes/hoard/unversioned-2026-09-17-the-private-home-gets-the-ward-it-never-had.md +25 -0
  39. package/docs/fixes/hoard/unversioned-2026-09-17-the-schedule-is-the-user-s-cron-leaves-the-tree-lives-in.md +27 -0
  40. package/docs/fixes/install/0.1.28-a-stale-install-can-no-longer-hide.md +8 -0
  41. package/docs/fixes/install/unversioned-2026-09-11-desktop-shell-tunnel-and-temporary-auth.md +14 -0
  42. package/docs/fixes/install/unversioned-2026-09-11-smooth-install-provider-choice-no-forced-key-real-prereq.md +22 -0
  43. package/docs/fixes/install/unversioned-2026-09-16-apodex-joins-the-weave-research-planning-provider.md +27 -0
  44. package/docs/fixes/install/unversioned-2026-09-16-icons-the-operator-can-pin-and-one-pair-of-hands-for-the.md +29 -0
  45. package/docs/fixes/install/unversioned-2026-09-16-the-desktop-never-dials-out-cloudflare-stays-outside-ele.md +25 -0
  46. package/docs/fixes/install/unversioned-2026-09-17-0-1-12-the-icons-reach-the-live-tree-and-a-missing-surfa.md +10 -0
  47. package/docs/fixes/install/unversioned-2026-09-17-0-1-8-the-day-s-work-reaches-npm.md +25 -0
  48. package/docs/fixes/install/unversioned-2026-09-17-a-stale-install-cannot-hide-and-the-one-liner-cannot-be-.md +9 -0
  49. package/docs/fixes/install/unversioned-2026-09-17-both-shapes-a-clone-and-an-npm-install-and-the-patience-.md +26 -0
  50. package/docs/fixes/install/unversioned-2026-09-17-gr-a-knows-the-npm-half-how-to-renew-the-published-packa.md +9 -0
  51. package/docs/fixes/install/unversioned-2026-09-17-npm-only-the-hall-answers-on-its-own-port-and-the-marks-.md +27 -0
  52. package/docs/fixes/install/unversioned-2026-09-17-the-apps-leave-the-monorepo-installation-pulls-them-from.md +23 -0
  53. package/docs/fixes/install/unversioned-2026-09-17-the-doors-the-cloth-and-the-icons-that-were-not-there.md +27 -0
  54. package/docs/fixes/install/unversioned-2026-09-17-the-editor-stops-being-banished-to-its-own-desktop.md +18 -0
  55. package/docs/fixes/install/unversioned-2026-09-17-the-four-surfaces-arrive-by-npm-and-an-old-tree-gives-up.md +24 -0
  56. package/docs/fixes/install/unversioned-2026-09-17-the-house-gains-an-unpublish-door.md +19 -0
  57. package/docs/fixes/install/unversioned-2026-09-17-the-icons-reach-the-live-tree-and-a-missing-surface-is-a.md +26 -0
  58. package/docs/fixes/install/unversioned-2026-09-17-the-install-asks-with-a-plan-and-the-operator-s-things-l.md +24 -0
  59. package/docs/fixes/install/unversioned-2026-09-17-the-installer-actually-installs-the-whole-platform-then-.md +9 -0
  60. package/docs/fixes/install/unversioned-2026-09-17-the-installer-has-a-design-of-its-own.md +9 -0
  61. package/docs/fixes/install/unversioned-2026-09-17-the-npm-door-stands-the-surfaces.md +13 -0
  62. package/docs/fixes/install/unversioned-2026-09-17-the-one-liner-the-readme-promised-and-it-sets-the-path.md +9 -0
  63. package/docs/fixes/install/unversioned-2026-09-17-ymir-command-not-found-is-a-path-fault-and-here-is-the-c.md +8 -0
  64. package/docs/fixes/install/unversioned-2026-09-18-the-readme-leads-with-the-doors-that-work.md +13 -0
  65. package/docs/fixes/odrerir/unversioned-2026-09-14-rerir-forged-eindri-odrerir-pane-w3-p7.md +12 -0
  66. package/docs/fixes/odrerir/unversioned-2026-09-17-the-live-hall-s-board-becomes-true-the-snapshot-lands-on.md +18 -0
  67. package/docs/fixes/runtime/unversioned-2026-09-11-gleipnir-lock-pid-binding-fix.md +17 -0
  68. package/docs/fixes/runtime/unversioned-2026-09-11-hardcoded-per-page-feeds-header-stream.md +19 -0
  69. package/docs/fixes/runtime/unversioned-2026-09-11-per-page-rolling-40-message-feeds.md +13 -0
  70. package/docs/fixes/runtime/unversioned-2026-09-11-smi-ja-views-are-repo-local.md +17 -0
  71. package/docs/fixes/runtime/unversioned-2026-09-11-stats-1-1-kaia-chat-forge-prompts.md +23 -0
  72. package/docs/fixes/runtime/unversioned-2026-09-11-the-well-is-real-mimirsbrunn-engram.md +21 -0
  73. package/docs/fixes/runtime/unversioned-2026-09-12-fleet-preferences.md +11 -0
  74. package/docs/fixes/runtime/unversioned-2026-09-12-house-law-rules-and-the-grein-naming.md +11 -0
  75. package/docs/fixes/runtime/unversioned-2026-09-12-r-preference-moved-out-of-the-tracked-tree.md +10 -0
  76. package/docs/fixes/runtime/unversioned-2026-09-12-the-dashboards-stop-crash-looping-on-the-igpu.md +20 -0
  77. package/docs/fixes/runtime/unversioned-2026-09-12-the-well-actually-installs-it-never-did.md +23 -0
  78. package/docs/fixes/runtime/unversioned-2026-09-12-updater-forged-credential-moved-to-env.md +12 -0
  79. package/docs/fixes/runtime/unversioned-2026-09-14-a-vacant-helm-is-entered-not-punted-watcher-wake-repair.md +24 -0
  80. package/docs/fixes/runtime/unversioned-2026-09-14-the-echo-guard-no-wake-flood-through-gn-s-door.md +18 -0
  81. package/docs/fixes/runtime/unversioned-2026-09-16-app-packaging-prepared-under-the-ymir-scope-amendment-c-.md +23 -0
  82. package/docs/fixes/runtime/unversioned-2026-09-16-four-readers-that-still-pointed-at-the-pre-split-world.md +26 -0
  83. package/docs/fixes/runtime/unversioned-2026-09-16-no-blue-the-forge-language-replaces-the-old-blue.md +26 -0
  84. package/docs/fixes/runtime/unversioned-2026-09-16-omarchy-first-host-aware-windows-and-macos-get-a-door.md +25 -0
  85. package/docs/fixes/runtime/unversioned-2026-09-16-smi-ja-moves-into-the-app-tree.md +17 -0
  86. package/docs/fixes/runtime/unversioned-2026-09-16-the-changelog-guard-no-push-ships-untold.md +19 -0
  87. package/docs/fixes/runtime/unversioned-2026-09-16-the-core-senses-the-real-host-not-omarchy-s-shadow.md +23 -0
  88. package/docs/fixes/runtime/unversioned-2026-09-16-the-hearth-spreads-one-fire-three-more-surfaces.md +25 -0
  89. package/docs/fixes/runtime/unversioned-2026-09-16-the-loader-stops-deleting-merge-never-overwrite.md +27 -0
  90. package/docs/fixes/runtime/unversioned-2026-09-16-the-mesh-reaches-teams-and-anchor-and-show-stops-guessin.md +24 -0
  91. package/docs/fixes/runtime/unversioned-2026-09-17-0-1-10-the-hall-answers-on-its-port-and-the-marks-land.md +15 -0
  92. package/docs/fixes/runtime/unversioned-2026-09-17-0-1-11-four-surfaces-their-marks-and-a-door-that-mends.md +18 -0
  93. package/docs/fixes/runtime/unversioned-2026-09-17-glitnir-stops-hanging-and-one-process-is-one-row.md +15 -0
  94. package/docs/fixes/runtime/unversioned-2026-09-17-main-is-repaired-and-the-report-wears-the-cloth.md +25 -0
  95. package/docs/fixes/runtime/unversioned-2026-09-17-not-again-and-four-surfaces-in-one-raise.md +26 -0
  96. package/docs/fixes/runtime/unversioned-2026-09-17-smoke-test-all-ui-two-checks-that-lied-about-their-own-s.md +20 -0
  97. package/docs/fixes/runtime/unversioned-2026-09-17-the-changelog-stops-conflicting-fragments-folded-by-a-sc.md +25 -0
  98. package/docs/fixes/runtime/unversioned-2026-09-17-the-doors-written-down-where-a-user-will-find-them.md +20 -0
  99. package/docs/fixes/runtime/unversioned-2026-09-17-the-duplicate-extensions-removed-from-the-project-tree.md +17 -0
  100. package/docs/fixes/runtime/unversioned-2026-09-17-the-extensions-deployed-without-their-modules.md +23 -0
  101. package/docs/fixes/runtime/unversioned-2026-09-17-the-feed-follows-brokk-s-thinking-past-the-composer.md +17 -0
  102. package/docs/fixes/runtime/unversioned-2026-09-17-the-fleet-stops-colliding-a-grid-fan-and-each-smith-s-ow.md +21 -0
  103. package/docs/fixes/runtime/unversioned-2026-09-17-the-fork-stands-the-machine.md +12 -0
  104. package/docs/fixes/runtime/unversioned-2026-09-17-the-fragment-convention-is-enforced-where-github-runs-it.md +26 -0
  105. package/docs/fixes/runtime/unversioned-2026-09-17-the-layout-swept-every-reader-taught-the-new-doors.md +24 -0
  106. package/docs/fixes/runtime/unversioned-2026-09-17-the-model-that-raised-itself-and-the-workhorse-that-repl.md +26 -0
  107. package/docs/fixes/runtime/unversioned-2026-09-17-the-package-shipped-the-memory-well-one-version-now-excl.md +26 -0
  108. package/docs/fixes/runtime/unversioned-2026-09-17-the-phantom-optional-pins-cut.md +9 -0
  109. package/docs/fixes/runtime/unversioned-2026-09-17-the-sweep-and-the-door-that-mends-itself.md +26 -0
  110. package/docs/fixes/sessrumnir/unversioned-2026-09-12-the-editor-keeps-its-own-seat.md +16 -0
  111. package/docs/fixes/sessrumnir/unversioned-2026-09-13-sessr-mnir-the-seat-hall.md +28 -0
  112. package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-carved-cloth-reaches-the-seat-hall-sessr-mnir.md +27 -0
  113. package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-new-tree-the-mesh-the-seat-hall.md +25 -0
  114. package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-realm-seat-carved-wayof.md +24 -0
  115. package/docs/fixes/sessrumnir/unversioned-2026-09-16-apodex-seat-verified-the-weave-mended.md +27 -0
  116. package/docs/fixes/sessrumnir/unversioned-2026-09-16-the-visualizer-finds-its-db-and-the-seat-hall-actually-b.md +22 -0
  117. package/docs/fixes/sessrumnir/unversioned-2026-09-17-0-1-13-the-re-voiced-seat-arrives-and-the-packages-are-l.md +8 -0
  118. package/docs/fixes/sessrumnir/unversioned-2026-09-17-sessr-mnir-stops-wearing-pi-s-clothes.md +23 -0
  119. package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-hearth-re-seeds-on-its-container-sessr-mnir-s-chat-f.md +23 -0
  120. package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-packaged-seat-carries-the-watch.md +11 -0
  121. package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-readme-lists-the-packages-and-the-pin-moves-to-the-r.md +16 -0
  122. package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-seat-s-name-and-the-visualizer-s-home.md +12 -0
  123. package/docs/fixes/skills/unversioned-2026-09-11-galdr-tyr-assets-symlink-not-copies.md +11 -0
  124. package/docs/fixes/skills/unversioned-2026-09-11-load-the-owning-asset-before-editing-a-governed-path-5-l.md +21 -0
  125. package/docs/fixes/skills/unversioned-2026-09-11-omarchy-first-host-skills-machine-learning-native-fixes.md +27 -0
  126. package/docs/fixes/skills/unversioned-2026-09-13-the-imported-names-leave-the-halls-norse-naming-purge.md +26 -0
  127. package/docs/fixes/skills/unversioned-2026-09-16-gunnl-joins-the-hall-skillopt-integration.md +17 -0
  128. package/docs/fixes/skills/unversioned-2026-09-16-one-skills-tree-every-harness-the-config-stomp-mended.md +25 -0
  129. package/docs/fixes/skills/unversioned-2026-09-16-the-skill-loading-audit-wrong-skills-unloaded-the-index-.md +26 -0
  130. package/docs/fixes/skills/unversioned-2026-09-17-0-1-9-both-shapes-reach-the-registry.md +17 -0
  131. package/docs/fixes/skills/unversioned-2026-09-17-midgard-holds-public-assets-only-the-company-wiki-is-gon.md +23 -0
  132. package/docs/fixes/skills/unversioned-2026-09-17-the-forge-speaks-each-skill-s-own-text-in-the-index.md +16 -0
  133. package/docs/fixes/skills/unversioned-2026-09-17-the-local-git-round-joins-the-loom-the-stack-s-doors-are.md +19 -0
  134. package/docs/fixes/skills/unversioned-2026-09-17-the-registry-says-where-a-repo-lives-and-what-it-is-for.md +20 -0
  135. package/docs/fixes/smidja/unversioned-2026-09-16-the-pane-bridge-keeps-its-quoting-phase-3-verified.md +22 -0
  136. package/docs/fixes/smidja/unversioned-2026-09-16-the-roster-can-finally-run-an-agent-on-pi.md +23 -0
  137. package/docs/fixes/smidja/unversioned-2026-09-16-the-roster-s-effect-lands-and-the-backend-pin-stops-bein.md +19 -0
  138. package/docs/fixes/smidja/unversioned-2026-09-16-the-validator-stops-calling-a-dead-visualizer-healthy.md +20 -0
  139. package/docs/fixes/smidja/unversioned-2026-09-17-the-fleet-was-a-rack-of-terminals-now-it-is-the-roster.md +18 -0
  140. package/docs/fixes/smidja/unversioned-2026-09-17-the-plan-learns-the-smithy-s-package-name-and-the-instal.md +25 -0
  141. package/docs/fixes/smidja/unversioned-2026-09-17-the-smithy-can-see-the-well.md +20 -0
  142. package/docs/fixes/smidja/unversioned-2026-09-17-the-smithy-s-dependency-names-the-package-npm-will-actua.md +20 -0
  143. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ ## runtime · unversioned · 2026-09-12 — Fleet preferences
2
+
3
+ ### Why
4
+ - `data/fleet.md` (gitignored) holds fleet-wide per-user settings (`ro: on|off`).
5
+ - `bin/fleet-apply.sh` applies them to this home + every registered Eindri-home
6
+ (into each home's gitignored `state/`; remote routes reported).
7
+ - `bin/brokk-update.sh` re-applies fleet preferences on every sweep — one setting
8
+ reaches the whole fleet, no tracked tree dirtied.
9
+
10
+ ### Files
11
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,11 @@
1
+ ## runtime · unversioned · 2026-09-12 — House law (RULES/) and the Grein naming
2
+
3
+ ### Why
4
+ - New `RULES/` (the house law): `01-domains.md` (house = company; domain = a
5
+ **Grein**/**Greinar**; Eindri = specialists), `02-agents.md` (agents live only
6
+ in `.agents/agents`; harness dirs are symlinks; no mock agents), `03-houses.md`
7
+ (a house is a company — WayOf; the eight Labs are domains, never houses).
8
+ - Live Fleet de-mocked (real domain/model/status; seeded stats only in demo).
9
+
10
+ ### Files
11
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,10 @@
1
+ ## runtime · unversioned · 2026-09-12 — Ró preference moved out of the tracked tree
2
+
3
+ ### Why
4
+ - `.agents/config/ro` was a **git-tracked** per-user toggle (calm on/off); any
5
+ toggle dirtied the tree and made `bin/brokk-update.sh` refuse. It now lives in
6
+ the gitignored `state/ro`; `YMIR_RO`/`BROKK_RO` set a default; the legacy
7
+ `config/ro` is read once for upgrade then never written. Tracked file removed.
8
+
9
+ ### Files
10
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,20 @@
1
+ ## runtime · unversioned · 2026-09-12 — The dashboards stop crash-looping on the iGPU
2
+
3
+ ### Why
4
+ - **`scripts/electron.sh` decides its own GPU path.** Both dashboards appeared to
5
+ work while `coredumpctl` filled with SIGSEGV cores from
6
+ `electron --type=gpu-process`. An iGPU backs its graphics memory with system
7
+ RAM (GTT), a local model served on that same iGPU held 5.8-8.0 GiB of it, and
8
+ the amdgpu driver then failed the desktop's command submissions — which
9
+ Electron turned into a NULL dereference at a constant offset. Only the GPU
10
+ process died, so the windows stayed up and the failure was easy to miss.
11
+ `igpu_vram_small()` now reads the render device's VRAM carve-out and switches
12
+ to software rendering under `YMIR_IGPU_VRAM_SMALL_MIB` (default 2048). The old
13
+ comment promised this auto-detect; now it exists. `YMIR_DESKTOP_DISABLE_GPU`
14
+ still overrides, both ways.
15
+ - **Verified:** with the fix, the amdgpu submission errors stop and the
16
+ gpu-process runs SwiftShader (`--use-angle=swiftshader-webgl`) rather than the
17
+ hardware path; no new cores.
18
+
19
+ ### Files
20
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,23 @@
1
+ ## runtime · unversioned · 2026-09-12 — The well actually installs (it never did)
2
+
3
+ ### Why
4
+ - **The memory engine was never installed by the installer.** `bin/prereq-ensure.sh`
5
+ had no `engram` target at all, and `bin/ymir-install.sh` only *checked* for it
6
+ and printed `SKIP "optional — install engine then run bin/mimir-bridge.sh"`. A
7
+ SKIP never blocks, so the well was silently down on every install.
8
+ - **The hint named the wrong package.** PyPI's `engram` is an unrelated
9
+ *rendering* library (mitsuba/drjit/torch): following the hint pulled gigabytes
10
+ of CUDA wheels and still left no engine. The memory engine's distribution is
11
+ **`engdbram`**; its module is `engram`. The pre-swap append-only log had the
12
+ right answer all along (`PyPI engdbram, v2.2.1`).
13
+ - **Now it installs.** `prereq-ensure.sh engram` installs `engdbram` into an
14
+ interpreter that can run it (>=3.11; uv supplies 3.12 here), records that
15
+ interpreter in `~/.config/ymir/engram-python`, and `bin/mimir-bridge.sh` reuses
16
+ it for both the check and the run. The installer provisions rather than hints,
17
+ and reports WARN instead of a silent SKIP when it cannot.
18
+ - **Verified:** `curl 127.0.0.1:4602/health` -> `{"status": "up", "store":
19
+ ".agents/memory/kaia.engram"}`; `.agents/skills/lifecycle/smoke_test.sh` exits 0
20
+ with all five checks green.
21
+
22
+ ### Files
23
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,12 @@
1
+ ## runtime · unversioned · 2026-09-12 — Updater forged + credential moved to env
2
+
3
+ ### Why
4
+ - **`bin/brokk-update.sh`** — the sanctioned, guarded updater the `ymir-update`
5
+ skill calls: fast-forward only, refuses a dirty/diverged tree, `--yes` to
6
+ stash+restore, `--check` to report. Never force-pushes.
7
+ - **Credential law:** the gate login (`HLIDSKJALF_AUTH`) no longer has an inline
8
+ default; it is read from `.env.local` (Bun auto-loads it). Server falls back to
9
+ an open gate only when unset (dev), with the key added to `.env.example`.
10
+
11
+ ### Files
12
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,24 @@
1
+ ## runtime · unversioned · 2026-09-14 — A vacant helm is entered, not punted (watcher wake repair)
2
+
3
+ ### Why
4
+ - **Problem:** a watcher wake reported the Pi extension could not restore
5
+ continuity — "this session no longer owns the lock". Root cause found by
6
+ inspection: an **empty/truncated** machine lock (`~/.local/state/ymir/brokk.lock`)
7
+ was classified by `gna-pi-watch.ts` `lockOwnership()` as `other` (another
8
+ live session) and by `bin/syn-watch-arm.sh`'s gate as read-only — so a helm
9
+ with *no verifiably-live holder* was refused and punted to a manual
10
+ `saga-session-start.sh` reclaim.
11
+ - **Fix (both seams in one change):** the extension now classifies an empty
12
+ lock as `missing`, so `gna_watch_arm`'s reclaim takes the helm in place; the
13
+ arm script, on finding no owner (or an owner verifiably gone), runs
14
+ `gleipnir_lock_acquire` itself — which refuses only a genuinely live other
15
+ session — instead of printing read-only. The "run saga-session-start.sh"
16
+ punt is gone; a vacant helm is entered by the watcher's own hand.
17
+ - **Verified:** scratch-state test — empty machine lock → `watcher: started`,
18
+ lock bound to the session pid + starttime sidecar, `.supervision-armed`
19
+ touched; `gleipnir-machine-lock.test.sh` ALL PASS (zombie, recycled,
20
+ migration); compliance 10/10; harness-integration asset updated in the same
21
+ change (the governed rule).
22
+
23
+ ### Files
24
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,18 @@
1
+ ## runtime · unversioned · 2026-09-14 — The echo guard: no wake flood through Gná's door
2
+
3
+ ### Why
4
+ - **Problem:** during a loud stretch (stale wake lines + the FM runner's
5
+ durable queue holding ten old check-wakes), the watcher re-armed and
6
+ re-signalled "signal: wake queue" across many generations; every actionable
7
+ close queued one pi follow-up wake (`sendWake`, no dedup), which then
8
+ dripped at the Allfather one per prompt — a long echo flood after the
9
+ sources were drained.
10
+ - **Fix:** `gna-pi-watch.ts` `sendWake` is **echo-guarded**: an identical
11
+ watcher message is delivered at most once per drained state — when both
12
+ durable doors (`state/.wake-queue` and the FM runner's
13
+ `.agents/state/.wake-queue`) are empty, a repeat carry is the same drained
14
+ news and is skipped. Genuine new content (different message, or a door with
15
+ a line) always delivers. Harness asset updated in the same change.
16
+
17
+ ### Files
18
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,23 @@
1
+ ## runtime · unversioned · 2026-09-16 — app packaging prepared under the @ymir scope (Amendment C, part one)
2
+
3
+ ### Why
4
+ - **Scoped names.** `apps/odrerir` was `ymir-odrerir` and `apps/sessrumnir` was
5
+ bare `sessrumnir`; both are now `@ymir/odrerir` and `@ymir/sessrumnir`.
6
+ - **Publishable metadata on all four apps** (hlidskjalf, hlidskjalf-mobile,
7
+ odrerir, sessrumnir): `license`, `repository`, `publishConfig.access: public`,
8
+ a `files` surface, and `prepublishOnly` where a build exists.
9
+ - **Measured with `npm pack --dry-run --ignore-scripts`:** hlidskjalf 1.3 MB /
10
+ 21 files, odrerir 2.3 MB / 15, sessrumnir 4.0 MB / 116, hlidskjalf-mobile
11
+ 2.0 kB / 4 (source only — it has no build script). `dist/ymir.apk` is excluded
12
+ by `!dist/*.apk`: it took the hlidskjalf tarball from 1.3 MB to 14.5 MB, and
13
+ npm is not an APK channel.
14
+ - **`private: true` stays until the Allfather's word** — nothing can publish by
15
+ accident; the flip is one line per app.
16
+ - The app repos were already registered in `$YMIR_HOME/identity/projects.yaml`
17
+ (`zerwiz/{hlidskjalf,hlidskjalf-mobile,odrerir,sessrumnir,smidja}`).
18
+ - `no-mistakes` is initialized for this repo (`no-mistakes init`): the clean-PR
19
+ gate now has its local remote. The vendored skill copy stays — it is the
20
+ canonical tree the skill index names.
21
+
22
+ ### Files
23
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,26 @@
1
+ ## runtime · unversioned · 2026-09-16 — four readers that still pointed at the pre-split world
2
+
3
+ ### Why
4
+ The app split and the hoard migration moved things; four readers never followed.
5
+ None failed loudly — each reported a clean PASS, a wrong SKIP, or a silent loss.
6
+
7
+ - **`bin/ymir-install.sh` wrote during `--check`.** The step chain ran
8
+ `bin/ymir-migrate.sh apply` unconditionally, so a preview that promises *"report
9
+ only, no writes"* actually **moved private data**. Migrations now apply only on
10
+ a real run: `if [ "$CHECK" = 0 ]; then ... apply; fi`.
11
+ - **`.agents/migrations/0003-private-data-separation.sh` skipped every directory.**
12
+ It pre-creates its target dirs, then its `copy` refused any target that already
13
+ existed — so `data/` (and every other directory source) was silently dropped.
14
+ The realm declaration never arrived and `0004` fell back to a neutral realm.
15
+ `copy` now **merges** a directory into its target (never overwriting a file) and
16
+ copies a single file only when it is absent.
17
+ - **`bin/smidja-bootstrap.sh` looked for the smithy at the old root.** `sys.path`
18
+ pointed at `smidja/`, but the split moved it to `apps/smidja/`, so the DB seed
19
+ died with `ModuleNotFoundError: No module named 'smidja_modules'`. It now
20
+ searches `apps/smidja` then `smidja`, so either layout works.
21
+ - **`bin/ymir-validate.sh` read the ledger from the pre-move path.** It looked at
22
+ `$YMIR_HOME/memory/`, but `0004-hoard-and-realms` put the ledger at
23
+ `$YMIR_HOME/hodd/memory/` — a fa
24
+
25
+ ### Files
26
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,26 @@
1
+ ## runtime · unversioned · 2026-09-16 — NO BLUE: the forge language replaces the old blue
2
+
3
+ ### Why
4
+ The blue had a name. It was the platform's own house tint, `--ymir-house-ymirlabs:
5
+ #38bdf8`, carried into every surface that wears Ymir's colours — the login, the
6
+ emblem, the realm data, the Smíðja chrome. The design doctrine (homepage repo,
7
+ `DESIGN-UNIFICATION-PLAN.md`) says the landing page **is** the language, and that
8
+ language is **forge**: stone ground (`#0e0c09`), bronze accent (`#c9973f`), bone
9
+ text (`#cfc3a9`).
10
+
11
+ - `midgard/design-system/tokens.css` — the house tint is bronze now, with the
12
+ reason recorded in the token itself.
13
+ - The blue's footprints removed: `Emblem.tsx`, `state/store.ts`, `data/realms.ts`
14
+ (Hlidskjalf), `style.css` (Smíðja visualizer), and Sessrúmnir's terminal accent
15
+ fallback.
16
+ - Both built stylesheets rebuilt and verified: **zero blue** in the CSS the browser
17
+ actually receives (`apps/hlidskjalf/dist`, the visualizer's `dist`).
18
+ - The visualizer's build was failing on my own earlier edit (unused imports left
19
+ when I moved `repoRootOf` into `db.ts`) — fixed, so `bun run build` is green.
20
+
21
+ The canonical token home is answered by what already exists: `midgard/design-system/`
22
+ (tokens, icons, `ymir-mark.svg`, `icons.md`) — one source the apps import, so a
23
+ colour changes once.
24
+
25
+ ### Files
26
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,25 @@
1
+ ## runtime · unversioned · 2026-09-16 — Omarchy-first, host-aware: Windows and macOS get a door
2
+
3
+ ### Why
4
+ - **`bin/host-sense.sh`** — the one place that looks before anything acts. It
5
+ reports THIS machine: distro and family, kernel, arch, platform (linux · wsl ·
6
+ macos · windows), session (Wayland/X11), desktop, compositor, package manager,
7
+ and what the desktop can actually *do* — `placement`, `launcher`, `tray`. No
8
+ layer may assert a machine it is not standing on.
9
+ - **Omarchy stays first-class, and is now gated.** `bin/omarchy-sense.sh` opens
10
+ by asserting *"Ymir runs on an Omarchy host"*; on any other host it now skips
11
+ cleanly and points at `bin/host-sense.sh`, rather than recording the wrong
12
+ machine. That is Rule 05's own rule: a layer is gated on its host.
13
+ - **Windows has a door:** `bin/bootstrap-windows.ps1` — enables WSL2, installs
14
+ Ubuntu, then hands the work to `bin/ymir-install.sh` inside the distro. It is
15
+ honest about needing elevation and about the one reboot a fresh machine needs.
16
+ - **macOS has a door:** `bin/bootstrap-macos.sh` — raises Ubuntu in a Lima VM and
17
+ installs Ymir inside it, plus `packaging/macos/Ymir Installer.command`, a
18
+ double-clickable launcher for an operator who should not need a terminal.
19
+ - **The installers themselves:** `packaging/build.sh --exe|--mac|--check`, the
20
+ NSIS script `packaging/windows/ymir-setup.nsi` (→ `Ymir-Setup.exe`), and
21
+ `.github/workflows/ymir-installers.yml`, which builds the exe on an Ubuntu
22
+ runner (NSIS is
23
+
24
+ ### Files
25
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,17 @@
1
+ ## runtime · unversioned · 2026-09-16 — Smiðja moves into the app tree
2
+
3
+ ### Why
4
+ - **The smithy is an app.** Its 148 source files moved from
5
+ `.agents/skills/smidja-factory/` to `apps/smidja-factory/`, joining
6
+ hlidskjalf, odrerir and sessrumnir under `apps/`.
7
+ - **Path-transparent.** `.agents/skills/smidja-factory` is now a symlink to
8
+ `../../apps/smidja-factory`, so every existing path resolves unchanged —
9
+ `scripts/start.sh`, `bin/ymir-install.sh`, `bin/ymir-validate.sh`, and the
10
+ skill loader (`.agents/skills` is a skills path). `node_modules/` stays
11
+ gitignored and is not carried.
12
+ - **Still open** (recorded, not done): the root `smidja/` runtime tree
13
+ Amendment A would move to `apps/smidja/`, and Amendment C's per-app GitHub
14
+ repos and npm publishing.
15
+
16
+ ### Files
17
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,19 @@
1
+ ## runtime · unversioned · 2026-09-16 — the changelog guard: no push ships untold
2
+
3
+ ### Why
4
+ - **Every push carries a CHANGELOG entry.** `bin/changelog-guard.sh` installs a
5
+ pre-push hook that reads the refs git hands it, resolves the range being
6
+ pushed, and refuses the push when `CHANGELOG.md` is untouched in that range.
7
+ A change that ships is a change that was told; the record can no longer lag
8
+ silently behind the code.
9
+ - **Rule 08 extracted and versioned.** The protected-branch check that lived
10
+ only inside the ad-hoc `.git/hooks/pre-push` is now `bin/branch-guard.sh`, so
11
+ the delivery gate is reproducible: `bin/changelog-guard.sh --install` writes
12
+ the pre-push that runs both guards.
13
+ - **Escape hatch, deliberate and loud.** `YMIR_SKIP_CHANGELOG_GUARD=1 git push`
14
+ when an entry truly does not belong.
15
+ - Checks by hand: `bin/changelog-guard.sh --range A..B`,
16
+ `bin/branch-guard.sh --branch main`.
17
+
18
+ ### Files
19
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,23 @@
1
+ ## runtime · unversioned · 2026-09-16 — the core senses the real host, not Omarchy's shadow
2
+
3
+ ### Why
4
+ - **`bin/ymir-install.sh` `step_host` ran the wrong sensor.** The core host step
5
+ called `bin/omarchy-sense.sh` — the **Omarchy-only** sensor — so on any
6
+ non-Omarchy host it learnt nothing and printed the sensor's own SKIP row as a
7
+ host snapshot: `host snapshot: sensor,SKIP,not an Omarchy host…`. On a Fedora
8
+ workstation that is the whole discovery step, reporting a skip as fact.
9
+ - **Now it senses THIS machine with `bin/host-sense.sh`** — the portable sensor
10
+ (the same one behind `ymir sense`) — on **every** host (Rule 05). Recording
11
+ stays the Omarchy layer's job: `omarchy-sense observe`, the post-update hook,
12
+ desktop placement, the plugin offer, and the alarm channel remain gated behind
13
+ `step_omarchy`. Nothing here assumes Omarchy; nothing here skips the core
14
+ machine either.
15
+ - `step_host` no longer branches on `--check`; it senses once and reports once:
16
+ `host sensed: <os> / <id> / <family> / <session> / <desktop>`.
17
+ - The owning asset reflects it in the same change:
18
+ `.agents/skills/galdr-ymirsystem/assets/installation.md` — the `host` step row,
19
+ the Verify list, the two-layer table (recording, not learning), and the
20
+ "Omarchy branches" note.
21
+
22
+ ### Files
23
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,25 @@
1
+ ## runtime · unversioned · 2026-09-16 — the hearth spreads: one fire, three more surfaces
2
+
3
+ ### Why
4
+ Sessrúmnir's fire is now shared rather than copied. `midgard/design-system/ember.js`
5
+ is the framework-neutral original (the land page's Ginnungagap embers: 30 rising
6
+ with a gentle sway over six drifting haze pools), with `ember.d.ts` for TypeScript
7
+ consumers and a reader who asked for less motion gets a **still frame** instead of
8
+ an animation.
9
+
10
+ Wired, and built:
11
+
12
+ - **Hlidskjalf** — `src/components/EmberBackground.tsx` imports the shared module;
13
+ mounted behind the *login* and behind the *shell*, so the door and the hall burn
14
+ over one hearth.
15
+ - **Smíðja visualizer** — a `<canvas class="ember-bg">` behind every view.
16
+ - **Óðrerir** — a `data-ember` canvas in its shell, so the hall warms too.
17
+ - Sessrúmnir keeps its own React port untouched (two ports of one fire, the same
18
+ physics; consolidating them on the shared module is the next tidy).
19
+
20
+ And the reference for the missing furniture: **Óðrerir already carries it all** —
21
+ four favicons, `mask-icon` in bronze, `site.webmanifest`, canonical, description,
22
+ theme-colour and Open Graph. The other apps should be brought up to *it*.
23
+
24
+ ### Files
25
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,27 @@
1
+ ## runtime · unversioned · 2026-09-16 — the loader stops deleting: merge, never overwrite
2
+
3
+ ### Why
4
+ - **Root cause of the Apodex-provider loss, mended at the source.** Two writers
5
+ share the untracked `opencode.json`: `bin/valknut-load.sh` (structure, from
6
+ `opencode.json.example`) and `bin/agents-config.sh apply` (the roster —
7
+ providers and per-agent models, from `config/agents.yaml`). The loader
8
+ re-rendered with `sed` + `mv`, so because the example carried only
9
+ `llama.cpp`, **every loader run silently deleted the Apodex provider** that
10
+ lived only in the live file. `config_out` now merges deep and
11
+ `setdefault`-style: missing keys are added, existing ones are never
12
+ overwritten, and the skills path is ensured. Verified by wiping the provider
13
+ by hand: the next run reports `merged(provider.apodex)` and restores it, while
14
+ an unrelated hand-added key survives untouched. Seeding happens only when the
15
+ file is absent.
16
+ - **The changelog guard still bites, without punishing a follow-up.** The
17
+ pre-push guard now accepts either the pushed range touching `CHANGELOG.md` or
18
+ the branch's whole range since it left the trunk touching it — a commit that
19
+ merely lands a file the record already tells needs no micro-entry. A branch
20
+ whose entire range leaves untold is still refused.
21
+ - `bin/valknut-load.sh --status` reports the config outcome
22
+ (`seeded` · `merged(…)` · `unchanged` · `kept`), so a silent stomp can never
23
+ hide behind a "rendered" line again.
24
+ - `harness-int
25
+
26
+ ### Files
27
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,24 @@
1
+ ## runtime · unversioned · 2026-09-16 — the mesh reaches Teams and Anchor, and `show` stops guessing
2
+
3
+ ### Why
4
+ `bin/a2a-mcp.sh` wired only the well (`engram`) and the mesh (`a2abridge`). The
5
+ **Teams** plane and **Anchor** memory existed only in the operator's personal
6
+ harness config, so no agent *inside* Ymir could see tickets or anchored memory —
7
+ and `a2a-mcp.sh show` insisted on a **fixed** server list, reporting
8
+ `wayofteams-mcp not on PATH` even when the plane was wired and working.
9
+
10
+ - **Remote MCP servers, URL-driven.** `bin/a2a-mcp.sh` now wires `wayofteams`
11
+ (from `WAYOFTEAMS_MCP_URL`) and `way-of-anchor-sse` (from `ANCHOR_MCP_URL`).
12
+ OpenCode gets them natively (`type: remote`); Pi, which has no remote
13
+ transport, gets them through the `mcp-remote` stdio bridge. A URL wins over a
14
+ local `wayofteams-mcp` binary when both exist. The URLs are credential-ish and
15
+ live in the private platform env — never the tracked tree.
16
+ - **`show` reports what is actually wired.** It enumerates every key present in
17
+ Pi's `mcpServers` and OpenCode's `mcp` (union with what this run would add), so
18
+ a hand-added or previously-installed server is visible, and the hint only fires
19
+ when Teams/Anchor is genuinely absent.
20
+ - `galdr-reread`: `assets/harness-integration/README.md` — the MCP scope is now
21
+ well · mesh · Teams · Anchor, with the two env keys named.
22
+
23
+ ### Files
24
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,15 @@
1
+ ## runtime · unversioned · 2026-09-17 — 0.1.10: the hall answers on its port, and the marks land
2
+
3
+ ### Why
4
+ - **The SPA listens where it is asked.** A bare `npm run dev` let Vite take 5173,
5
+ so `:3888` answered nothing in either shape; a packaged tree now serves its built
6
+ `./dist` and every shape passes `--port "$HLIDSKJALF_PORT" --strictPort`.
7
+ - **Óðrerir resolves** through `bin/app-lib.sh` instead of the clone's `apps/`.
8
+ - **The launcher entries and rune icons land on any Linux desktop** — the
9
+ freedesktop half of desktop integration is no longer behind Omarchy's gate, so a
10
+ GNOME operator gets marks at all.
11
+ - **The version a user went from and to** is said once, on the first run after an
12
+ update: *the tree moved 0.1.9 → 0.1.10*.
13
+
14
+ ### Files
15
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,18 @@
1
+ ## runtime · unversioned · 2026-09-17 — 0.1.11: four surfaces, their marks, and a door that mends
2
+
3
+ ### Why
4
+ - **All four surfaces rise from one npm install** — Hlidskjalf `:3888`, Óðrerir
5
+ `:4322`, the board `:8437`, and Sessrúmnir in its own window; the installer's
6
+ desktop step opens one window per surface.
7
+ - **All four launcher marks land** — the rune glyphs ship in the package
8
+ (`midgard/design-system/`), the mint resolves a packaged app, the apps'
9
+ templates are written before the rune marks so the themed name stands, and a
10
+ retired name is swept from the launcher.
11
+ - **`ymir hlidskjalf` mends the Electron runtime itself** before refusing, because
12
+ npm gates install scripts and a fresh user could otherwise have no window at all.
13
+ - **Every notice can be silenced once and remembered** — `ymir config notice
14
+ version|patience|next|hints off`.
15
+ - **Óðrerir serves its build** from a package, and says what failed when it cannot.
16
+
17
+ ### Files
18
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,15 @@
1
+ ## runtime · unversioned · 2026-09-17 — Glitnir stops hanging, and one process is one row
2
+
3
+ ### Why
4
+ - **`/api/reviews` ran two 60-second shell checks on every poll**, so the review board
5
+ hung for a minute and read as a dead surface. It is memoised for a minute now, the
6
+ same discipline the usage endpoint already follows: a board a human reads does not
7
+ need an answer fresher than its own usefulness.
8
+ - **`/api/processes` returns the same id twice** — `systemd:dbus` arrives from two
9
+ sources, 45 entries for 44 processes. The panel dedupes by id, so a repeated process
10
+ renders as the one process it is, and React is no longer handed a duplicate key.
11
+ The duplicate at the source is recorded, not hidden.
12
+ - `/api/stream` answers 200; the live stream is not broken, it was the window.
13
+
14
+ ### Files
15
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,25 @@
1
+ ## runtime · unversioned · 2026-09-17 — main is repaired, and the report wears the cloth
2
+
3
+ ### Why
4
+ - **Main was broken and nobody had noticed.** A merge resolved by hand
5
+ (`4dd7273`, from a parallel branch) kept *both* sides of a conflict in
6
+ `bin/ymir-install.sh` and `scripts/start.sh`: a stray `<`, a duplicated step
7
+ line, orphaned comments, an `if` with no `fi`. The installer could not parse at
8
+ all — `bash -n` failed on main — and PR #53's merge carried the breakage
9
+ forward. Both files are restored from the last revision that parses (`5b7fc66`),
10
+ with the two fixes that revision predated re-applied: the `--phase` value is
11
+ consumed, and `--yes | --non-interactive | --accept-all-defaults` are one thing.
12
+ Every runtime script parses again; the installer's plan runs.
13
+ - **The lesson worth keeping:** a merge is not a place to guess. When both sides
14
+ of a conflict are real, the resolution is a decision — and `bash -n` on every
15
+ runtime script is cheap enough to be part of it.
16
+ - **The validate report wears the cloth** — the same rows rendered for the eye on
17
+ stderr (marks, colour, and a verdict with the next step) while the TOON stays
18
+ the data on stdout. It found real drift while it was being written: the SPA down
19
+ on `:3888`, Nornir cron stopped, `sessrumnir`, `mcp` and `hoard` broken.
20
+ - **Eir watches the shells.** A new surface reports the desktop shells' runtime
21
+ through `bin/electron-lib.sh` — a *partial* Electron runtime is exactly the
22
+ quiet failure Eir e
23
+
24
+ ### Files
25
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,26 @@
1
+ ## runtime · unversioned · 2026-09-17 — "not again", and four surfaces in one raise
2
+
3
+ ### Why
4
+ - **Every notice can be silenced.** A line is information once and noise the
5
+ tenth: the version that moved, the long-hour words, the next-steps block, the
6
+ hints. Each now says so **once** in the cloth's faint voice — *not again:
7
+ `ymir config notice version off`* — and the preference is recorded in the
8
+ operator's settings, honoured by the shell cloth and the CLI alike. `ymir config
9
+ show` is the door; four keys: `version · patience · next · hints`.
10
+ - **The package carries the design system.** It never shipped `midgard/`, so the
11
+ rune glyphs — the icons themselves — were absent and every mark failed with
12
+ *no glyph ansuz*. `midgard/design-system/` is in `files[]` now: 30 files, 22
13
+ glyphs.
14
+ - **The marks are written in the right order.** The apps' own launcher templates
15
+ landed *after* the rune marks and overwrote the themed name with an absolute
16
+ `.png`; the templates go first now and the rune marks stand over them.
17
+ - **Óðrerir rises from a package.** Its published tarball carries `dist` and a
18
+ `dev` command that calls a script it does not carry, so `npm run dev` could never
19
+ work from a package — the hall serves its **build** (`astro preview`) where there
20
+ is one, exactly as the SPA does. And its dependencies' absence is no longer
21
+ silent: the hall says what failed and why.
22
+ - **Four surfaces, one raise.** `ymir raise` lifts the SPA, Óðrerir, the board and
23
+ Ses
24
+
25
+ ### Files
26
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,20 @@
1
+ ## runtime · unversioned · 2026-09-17 — smoke test all UI: two checks that lied about their own subjects
2
+
3
+ ### Why
4
+ - **The truth gate failed on my own change.** It demanded the connector's total equal
5
+ the herdr pane count; the connector is roster-first now, so it legitimately reports
6
+ agents AND seats (33 vs 13 panes). Panes are a subset of what the board must show.
7
+ Corrected: a FAIL now means FEWER entries than panes — a standing seat hidden from
8
+ the board — which is the fault worth catching. **Verdict: PASS.**
9
+ - **The smoke test reported a present database absent.** It looked for the smithy's db
10
+ at the repo path; the runtime keeps it under `$YMIR_HOME/smidja/`, which is where
11
+ the bootstrap and the gate both resolve it. Same wound as Skrymir and the well: the
12
+ check and the owner disagreeing about where the record lives. **Now: OK, 8 tables.**
13
+ - **Smoke test all UI: 5/5 OK** — spa, api, well, smidja-db, loaders. Truth gate: PASS.
14
+
15
+ Also mended in the same pass: `StatusChip` read `STATUS_META[status].tone`, and the
16
+ fleet now reports a status it was never taught (`seated`), so an unknown status threw
17
+ and killed the gate. An unknown status can no longer take a panel down.
18
+
19
+ ### Files
20
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,25 @@
1
+ ## runtime · unversioned · 2026-09-17 — the changelog stops conflicting: fragments, folded by a script
2
+
3
+ ### Why
4
+ - **The problem, measured.** `CHANGELOG.md` is one file and every branch appends
5
+ at the same position — the top. Git sees two branches inserting different lines
6
+ at the same spot and calls it a conflict, so **every merge re-conflicts every
7
+ open branch**. Sixteen open PRs were each resolved by hand for this reason
8
+ alone, and each merge re-conflicted the rest: O(N²) meaningless conflicts.
9
+ - **The fix — `CHANGELOG.d/`.** A change adds **one file with a unique name**
10
+ (`<YYYY-MM-DD>-<slug>.md`) instead of editing the ledger. Two branches never
11
+ touch the same fragment, so the collision cannot occur.
12
+ - **`bin/changelog-assemble.sh`** folds fragments into `CHANGELOG.md` — newest
13
+ first, above everything already recorded. Folding is an **append**: existing
14
+ entries are copied verbatim, never reordered, never rewritten. `--dry-run`
15
+ shows what would fold; `--check` exits 1 when fragments are unfolded.
16
+ - **The pre-push hook folds first.** `bin/changelog-guard.sh --install` now
17
+ writes a hook that runs the assembler before the guards, so a push never leaves
18
+ fragments unfolded; if folding changes the ledger the push is refused until the
19
+ fold is committed.
20
+ - **The guard accepts either form.** A push satisfies the duty by appending to
21
+ `CHANGELOG.md` **or** by adding a fragment. The refusal message now names both.
22
+ - **Rule 06 is amended, append-only** — the clause stands;
23
+
24
+ ### Files
25
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,20 @@
1
+ ## runtime · unversioned · 2026-09-17 — the doors, written down where a user will find them
2
+
3
+ ### Why
4
+ - **`README.md` gains "After it installs — the doors"**: the two commands on PATH,
5
+ the twelve doors on `ymir`, the lawless name that answers once and points at the
6
+ lawful one, the patience words in full, and a section on **both shapes** — a
7
+ clone and a package, with one resolver and one rule (colour for the eye, TOON
8
+ for the pipe).
9
+ - **The skills that must know are taught.** Galdr's `assets/installation.md` gains
10
+ the shape table, the eighteen converted call sites, and the trap that named
11
+ itself (`printf -v` writes to the function's scope — scratch names are
12
+ function-prefixed for that reason). The `ymir-host` skill's `assets/install.md`
13
+ gains the doors and how to exercise the *other* shape without a second machine
14
+ (`YMIR_ROOT_DIR`). The `groa-update` skill gains the step that matters after
15
+ every update: **re-check where the apps live** — a shape assumption is a bug
16
+ that only shows itself on the other shape — and say the long hour in the house's
17
+ voice.
18
+
19
+ ### Files
20
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,17 @@
1
+ ## runtime · unversioned · 2026-09-17 — the duplicate extensions removed from the project tree
2
+
3
+ ### Why
4
+ - **The fault, now measured exactly.** The project-local extension tree carried four
5
+ files that the shared source also carries — `gna-pi-watch.ts`, `ro.ts`,
6
+ `skuld-branch-supervision.ts`, `syn-turnend-guard.ts`. pi auto-discovers both the
7
+ global home and the project tree, so each loaded twice and pi refused the second
8
+ copy of every tool: `Tool "gna_watch_arm" conflicts with …`. Every `pi` start in
9
+ every worktree died on it, which is why a seated worker fell back to a shell.
10
+ - **The fix:** those four files are gone from the project tree. What remains there is
11
+ `lib/` — the modules the *global* extensions import — and its README. The
12
+ extensions themselves live in the shared source and in the one global home.
13
+ - The seatbelt refused the plain shapes (`rm`, `mv`, `>`-bearing commands) on this
14
+ path and named the remedy: *a reviewed commit*. This is that commit.
15
+
16
+ ### Files
17
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,23 @@
1
+ ## runtime · unversioned · 2026-09-17 — the extensions deployed without their modules
2
+
3
+ ### Why
4
+ - **pi would not start a seated worker, and the reason was a half-deploy.**
5
+ The four shared pi extensions all reported
6
+ `Failed to load extension: Cannot find module ./lib/<module>.ts` — and every one
7
+ of those modules was present in the repo, one level away under the extensions'
8
+ own `lib/`. The loader copied the top-level extension files and never their
9
+ supporting modules.
10
+ - **Mended in two places.** (1) The missing modules are now beside the deployed
11
+ extensions, so a running pi loads all four. (2) `bin/valknut-load.sh` — the
12
+ loader — now deploys that lib alongside the extensions, idempotently (identical
13
+ files untouched), so a fresh machine cannot hit it. A deploy that copies a file
14
+ but not the module it imports is not a deploy.
15
+ - **What this cost:** the Forseti audit was seated on a **local** model, and the
16
+ pane fell back to a bare shell when pi could not start — which is why the brief
17
+ was typed at a prompt and answered `bash: syntax error near unexpected token '('`.
18
+ With the extensions mended, pi's remaining blocker is the model: the llama-router
19
+ has no raisable seat tonight (`:8080` unbound, and the installed llama.cpp cannot
20
+ load the Apodex weights), so a local-first dispatch has nothing to reach.
21
+
22
+ ### Files
23
+ - *(carried from the frozen CHANGELOG.md)*
@@ -0,0 +1,17 @@
1
+ ## runtime · unversioned · 2026-09-17 — the feed follows Brokk's thinking past the composer
2
+
3
+ ### Why
4
+ - **Sessrúmnir's auto-scroll never counted streamed THINKING as growth.**
5
+ `useChatScroll` watched `messages` and `streamingContent` only, so a
6
+ reasoning-heavy turn (thinking before any visible content) grew the feed
7
+ without moving it — the thinking block ended up below the floating composer,
8
+ behind it, and the Allfather had to scroll down to read it.
9
+ - **The growth signal now also includes `streamingThinking` and streaming tool
10
+ calls.** While Brokk reasons, the feed keeps the thinking tail in view above
11
+ the composer (still only when Auto Scroll is on and the reader is at the
12
+ bottom — scrolling up to re-read never gets yanked).
13
+ - Live hall updated: rebuilt renderer delivered to the running Sessrúmnir and
14
+ the app restarted via `bin/sessrumnir.sh` (window back on workspace 8).
15
+
16
+ ### Files
17
+ - *(carried from the frozen CHANGELOG.md)*