@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.
- package/.agents/skills/groa-update/SKILL.md +30 -0
- package/CHANGELOG.md +44 -0
- package/README.md +47 -8
- package/bin/fixes-guard.sh +112 -0
- package/bin/fixes.sh +157 -0
- package/bin/ymir.js +35 -0
- package/docs/fixes/agents/unversioned-2026-09-11-chat-uses-the-root-pi-model-catalog.md +15 -0
- package/docs/fixes/agents/unversioned-2026-09-11-shared-well-for-every-harness-no-mock-clickable-memories.md +26 -0
- package/docs/fixes/agents/unversioned-2026-09-13-gleipnir-sees-when-an-agent-is-turned-off.md +26 -0
- package/docs/fixes/agents/unversioned-2026-09-14-the-eindri-brokk-wake-bridge-they-can-talk-back-now.md +23 -0
- package/docs/fixes/agents/unversioned-2026-09-16-a-sandboxed-worker-cannot-think-auto-stops-killing-agent.md +18 -0
- package/docs/fixes/agents/unversioned-2026-09-17-agents-md-states-the-one-law-no-private-data-in-the-publ.md +25 -0
- package/docs/fixes/agents/unversioned-2026-09-17-every-figure-loads-the-agent-directory-was-never-read.md +25 -0
- package/docs/fixes/agents/unversioned-2026-09-17-pi-gets-its-agents-and-a-dead-extension-comes-back.md +26 -0
- package/docs/fixes/agents/unversioned-2026-09-17-the-well-as-tools-ymir-s-first-custom-pi-extension.md +20 -0
- package/docs/fixes/gate/0.1.28-fixes-guard-replaces-the-changelog-gate.md +7 -0
- package/docs/fixes/gate/0.1.28-the-changelog-system-is-replaced-by-fix-notes.md +8 -0
- package/docs/fixes/gate/0.1.28-the-frozen-changelog-becomes-per-component-notes.md +9 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-11-automate-the-install-consent-gate-self-healing-prereqs-v.md +21 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-11-single-tenant-workspaces-shipped.md +15 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-13-the-cloth-reaches-all-three-halls-hlidskjalf-sm-ja-the-s.md +25 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-16-one-login-for-every-app-on-the-web-the-gate-fronts-them-.md +24 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-credential-reaches-the-gate-and-the-hall-stops-leaki.md +23 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-delivery-gates-install-themselves-rename-drift-mende.md +22 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-16-the-panels-that-crashed-the-gate-that-lied-and-the-well-.md +25 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-17-0-1-14-the-panels-reach-the-gate-and-the-fourth-window-s.md +9 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-17-models-providers-and-paths-are-the-user-s-and-the-gate-s.md +26 -0
- package/docs/fixes/hlidskjalf/unversioned-2026-09-17-the-northstar-gate-runs-nightly-the-platform-door-it-cau.md +16 -0
- package/docs/fixes/hoard/unversioned-2026-09-16-every-app-wears-its-own-rune.md +27 -0
- package/docs/fixes/hoard/unversioned-2026-09-16-hodd-lives-outside-the-repo-and-the-installer-makes-it-s.md +24 -0
- package/docs/fixes/hoard/unversioned-2026-09-16-the-icons-are-real-runes-now-eight-of-them-were-drawings.md +33 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-0-1-26-published-and-the-vault-door-named.md +8 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-one-well-in-the-hoard-every-reader-of-kaia-s-memory-reso.md +23 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-skrymir-opens-the-hoard-not-the-checkout.md +18 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-the-hoard-encrypts-its-secrets-at-rest.md +20 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-the-hoard-gets-a-guard-and-rule-04-stops-contradicting-t.md +19 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-the-home-s-re-laid-layout-taught-to-the-system.md +17 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-the-private-home-gets-the-ward-it-never-had.md +25 -0
- package/docs/fixes/hoard/unversioned-2026-09-17-the-schedule-is-the-user-s-cron-leaves-the-tree-lives-in.md +27 -0
- package/docs/fixes/install/0.1.28-a-stale-install-can-no-longer-hide.md +8 -0
- package/docs/fixes/install/unversioned-2026-09-11-desktop-shell-tunnel-and-temporary-auth.md +14 -0
- package/docs/fixes/install/unversioned-2026-09-11-smooth-install-provider-choice-no-forced-key-real-prereq.md +22 -0
- package/docs/fixes/install/unversioned-2026-09-16-apodex-joins-the-weave-research-planning-provider.md +27 -0
- package/docs/fixes/install/unversioned-2026-09-16-icons-the-operator-can-pin-and-one-pair-of-hands-for-the.md +29 -0
- package/docs/fixes/install/unversioned-2026-09-16-the-desktop-never-dials-out-cloudflare-stays-outside-ele.md +25 -0
- package/docs/fixes/install/unversioned-2026-09-17-0-1-12-the-icons-reach-the-live-tree-and-a-missing-surfa.md +10 -0
- package/docs/fixes/install/unversioned-2026-09-17-0-1-8-the-day-s-work-reaches-npm.md +25 -0
- package/docs/fixes/install/unversioned-2026-09-17-a-stale-install-cannot-hide-and-the-one-liner-cannot-be-.md +9 -0
- package/docs/fixes/install/unversioned-2026-09-17-both-shapes-a-clone-and-an-npm-install-and-the-patience-.md +26 -0
- package/docs/fixes/install/unversioned-2026-09-17-gr-a-knows-the-npm-half-how-to-renew-the-published-packa.md +9 -0
- package/docs/fixes/install/unversioned-2026-09-17-npm-only-the-hall-answers-on-its-own-port-and-the-marks-.md +27 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-apps-leave-the-monorepo-installation-pulls-them-from.md +23 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-doors-the-cloth-and-the-icons-that-were-not-there.md +27 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-editor-stops-being-banished-to-its-own-desktop.md +18 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-four-surfaces-arrive-by-npm-and-an-old-tree-gives-up.md +24 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-house-gains-an-unpublish-door.md +19 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-icons-reach-the-live-tree-and-a-missing-surface-is-a.md +26 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-install-asks-with-a-plan-and-the-operator-s-things-l.md +24 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-installer-actually-installs-the-whole-platform-then-.md +9 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-installer-has-a-design-of-its-own.md +9 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-npm-door-stands-the-surfaces.md +13 -0
- package/docs/fixes/install/unversioned-2026-09-17-the-one-liner-the-readme-promised-and-it-sets-the-path.md +9 -0
- package/docs/fixes/install/unversioned-2026-09-17-ymir-command-not-found-is-a-path-fault-and-here-is-the-c.md +8 -0
- package/docs/fixes/install/unversioned-2026-09-18-the-readme-leads-with-the-doors-that-work.md +13 -0
- package/docs/fixes/odrerir/unversioned-2026-09-14-rerir-forged-eindri-odrerir-pane-w3-p7.md +12 -0
- package/docs/fixes/odrerir/unversioned-2026-09-17-the-live-hall-s-board-becomes-true-the-snapshot-lands-on.md +18 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-gleipnir-lock-pid-binding-fix.md +17 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-hardcoded-per-page-feeds-header-stream.md +19 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-per-page-rolling-40-message-feeds.md +13 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-smi-ja-views-are-repo-local.md +17 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-stats-1-1-kaia-chat-forge-prompts.md +23 -0
- package/docs/fixes/runtime/unversioned-2026-09-11-the-well-is-real-mimirsbrunn-engram.md +21 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-fleet-preferences.md +11 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-house-law-rules-and-the-grein-naming.md +11 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-r-preference-moved-out-of-the-tracked-tree.md +10 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-the-dashboards-stop-crash-looping-on-the-igpu.md +20 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-the-well-actually-installs-it-never-did.md +23 -0
- package/docs/fixes/runtime/unversioned-2026-09-12-updater-forged-credential-moved-to-env.md +12 -0
- package/docs/fixes/runtime/unversioned-2026-09-14-a-vacant-helm-is-entered-not-punted-watcher-wake-repair.md +24 -0
- package/docs/fixes/runtime/unversioned-2026-09-14-the-echo-guard-no-wake-flood-through-gn-s-door.md +18 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-app-packaging-prepared-under-the-ymir-scope-amendment-c-.md +23 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-four-readers-that-still-pointed-at-the-pre-split-world.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-no-blue-the-forge-language-replaces-the-old-blue.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-omarchy-first-host-aware-windows-and-macos-get-a-door.md +25 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-smi-ja-moves-into-the-app-tree.md +17 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-the-changelog-guard-no-push-ships-untold.md +19 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-the-core-senses-the-real-host-not-omarchy-s-shadow.md +23 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-the-hearth-spreads-one-fire-three-more-surfaces.md +25 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-the-loader-stops-deleting-merge-never-overwrite.md +27 -0
- package/docs/fixes/runtime/unversioned-2026-09-16-the-mesh-reaches-teams-and-anchor-and-show-stops-guessin.md +24 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-0-1-10-the-hall-answers-on-its-port-and-the-marks-land.md +15 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-0-1-11-four-surfaces-their-marks-and-a-door-that-mends.md +18 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-glitnir-stops-hanging-and-one-process-is-one-row.md +15 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-main-is-repaired-and-the-report-wears-the-cloth.md +25 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-not-again-and-four-surfaces-in-one-raise.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-smoke-test-all-ui-two-checks-that-lied-about-their-own-s.md +20 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-changelog-stops-conflicting-fragments-folded-by-a-sc.md +25 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-doors-written-down-where-a-user-will-find-them.md +20 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-duplicate-extensions-removed-from-the-project-tree.md +17 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-extensions-deployed-without-their-modules.md +23 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-feed-follows-brokk-s-thinking-past-the-composer.md +17 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-fleet-stops-colliding-a-grid-fan-and-each-smith-s-ow.md +21 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-fork-stands-the-machine.md +12 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-fragment-convention-is-enforced-where-github-runs-it.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-layout-swept-every-reader-taught-the-new-doors.md +24 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-model-that-raised-itself-and-the-workhorse-that-repl.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-package-shipped-the-memory-well-one-version-now-excl.md +26 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-phantom-optional-pins-cut.md +9 -0
- package/docs/fixes/runtime/unversioned-2026-09-17-the-sweep-and-the-door-that-mends-itself.md +26 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-12-the-editor-keeps-its-own-seat.md +16 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-13-sessr-mnir-the-seat-hall.md +28 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-carved-cloth-reaches-the-seat-hall-sessr-mnir.md +27 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-new-tree-the-mesh-the-seat-hall.md +25 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-13-the-realm-seat-carved-wayof.md +24 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-16-apodex-seat-verified-the-weave-mended.md +27 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-16-the-visualizer-finds-its-db-and-the-seat-hall-actually-b.md +22 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-0-1-13-the-re-voiced-seat-arrives-and-the-packages-are-l.md +8 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-sessr-mnir-stops-wearing-pi-s-clothes.md +23 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-hearth-re-seeds-on-its-container-sessr-mnir-s-chat-f.md +23 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-packaged-seat-carries-the-watch.md +11 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-readme-lists-the-packages-and-the-pin-moves-to-the-r.md +16 -0
- package/docs/fixes/sessrumnir/unversioned-2026-09-17-the-seat-s-name-and-the-visualizer-s-home.md +12 -0
- package/docs/fixes/skills/unversioned-2026-09-11-galdr-tyr-assets-symlink-not-copies.md +11 -0
- package/docs/fixes/skills/unversioned-2026-09-11-load-the-owning-asset-before-editing-a-governed-path-5-l.md +21 -0
- package/docs/fixes/skills/unversioned-2026-09-11-omarchy-first-host-skills-machine-learning-native-fixes.md +27 -0
- package/docs/fixes/skills/unversioned-2026-09-13-the-imported-names-leave-the-halls-norse-naming-purge.md +26 -0
- package/docs/fixes/skills/unversioned-2026-09-16-gunnl-joins-the-hall-skillopt-integration.md +17 -0
- package/docs/fixes/skills/unversioned-2026-09-16-one-skills-tree-every-harness-the-config-stomp-mended.md +25 -0
- package/docs/fixes/skills/unversioned-2026-09-16-the-skill-loading-audit-wrong-skills-unloaded-the-index-.md +26 -0
- package/docs/fixes/skills/unversioned-2026-09-17-0-1-9-both-shapes-reach-the-registry.md +17 -0
- package/docs/fixes/skills/unversioned-2026-09-17-midgard-holds-public-assets-only-the-company-wiki-is-gon.md +23 -0
- package/docs/fixes/skills/unversioned-2026-09-17-the-forge-speaks-each-skill-s-own-text-in-the-index.md +16 -0
- package/docs/fixes/skills/unversioned-2026-09-17-the-local-git-round-joins-the-loom-the-stack-s-doors-are.md +19 -0
- package/docs/fixes/skills/unversioned-2026-09-17-the-registry-says-where-a-repo-lives-and-what-it-is-for.md +20 -0
- package/docs/fixes/smidja/unversioned-2026-09-16-the-pane-bridge-keeps-its-quoting-phase-3-verified.md +22 -0
- package/docs/fixes/smidja/unversioned-2026-09-16-the-roster-can-finally-run-an-agent-on-pi.md +23 -0
- package/docs/fixes/smidja/unversioned-2026-09-16-the-roster-s-effect-lands-and-the-backend-pin-stops-bein.md +19 -0
- package/docs/fixes/smidja/unversioned-2026-09-16-the-validator-stops-calling-a-dead-visualizer-healthy.md +20 -0
- package/docs/fixes/smidja/unversioned-2026-09-17-the-fleet-was-a-rack-of-terminals-now-it-is-the-roster.md +18 -0
- package/docs/fixes/smidja/unversioned-2026-09-17-the-plan-learns-the-smithy-s-package-name-and-the-instal.md +25 -0
- package/docs/fixes/smidja/unversioned-2026-09-17-the-smithy-can-see-the-well.md +20 -0
- package/docs/fixes/smidja/unversioned-2026-09-17-the-smithy-s-dependency-names-the-package-npm-will-actua.md +20 -0
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-11 — Smooth install: provider choice, no forced key, real prereqs
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Model provider is now the operator's choice** (`YMIR_MODEL_PROVIDER`):
|
|
5
|
+
`opencode-go` (needs a key), `lmstudio` (keyless local), or
|
|
6
|
+
`openai-compatible`. The bridge no longer forces `OPENCODE_GO_API_KEY`;
|
|
7
|
+
with no key it auto-selects the keyless local provider so a fresh install works.
|
|
8
|
+
- **New:** `.agents/backend/model-bridge.py` (provider-aware, keyless-capable);
|
|
9
|
+
`opencode-go-bridge.py` kept as a delegating shim so existing references work.
|
|
10
|
+
- **`bin/bifrost-bridge.sh` v2:** `--provider`, provider auto-selection, no hard
|
|
11
|
+
env-file requirement, actionable errors per provider.
|
|
12
|
+
- **`bin/ymir-install.sh`:** installs `bun` for real (user-space, then a package
|
|
13
|
+
hint); installs `mcp<2`; `engram` is now an honest `SKIP` with the Python
|
|
14
|
+
version reason instead of a permanent WARN; distinguishes docker-group
|
|
15
|
+
permission from a build failure.
|
|
16
|
+
- **`scripts/start.sh`:** fixed the early exit that skipped the gate API and all
|
|
17
|
+
services whenever the SPA was already running.
|
|
18
|
+
- **Verified:** compliance 8/8; bridge relays models + chat + 404s; keyless
|
|
19
|
+
start confirmed; `start.sh` raises Gate API, Nornir, Bifrost, visualizer.
|
|
20
|
+
|
|
21
|
+
### Files
|
|
22
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-16 — Apodex joins the Weave (research/planning provider)
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Apodex provider.** Apodex-1.0-mini-Q4_K_M climbs into the machine as
|
|
5
|
+
the research/planning GGUF on `http://127.0.0.1:1234/v1`, seated
|
|
6
|
+
alongside llama.cpp coding models on :8080. LM Studio is retired; its
|
|
7
|
+
:1234 port belongs to Apodex now.
|
|
8
|
+
- **Env template.** `.env.example` gains the `APODEX_*` block; the LM
|
|
9
|
+
Studio block is marked RETIRED with its port claim corrected.
|
|
10
|
+
- **Smoke test.** `bin/apodex-smoke-test.sh` — probe or serve-and-test an
|
|
11
|
+
Apodex seat; exits 0=pass, 1=fail, 2=unavailable. Never mutates config.
|
|
12
|
+
- **Research worker.** `bin/huginn-research-worker.sh` (Apodex-powered
|
|
13
|
+
Eindri): takes a brief, recalls from Mimirsbrunn, dispatches to the
|
|
14
|
+
Apodex chat/completions seat, writes a structured verdict, observes it
|
|
15
|
+
back into the well. Wears the name **Huginn** per the naming law (the
|
|
16
|
+
research seat; Gungnir stays the skill-synthesis engine).
|
|
17
|
+
- **Agents hall.** `.agents/agents/huginn-researcher.md` binds Huginn to
|
|
18
|
+
the apodex model; `config/agents.yaml.example` registers the apodex
|
|
19
|
+
provider and Huginn's seat; `opencode.json` carries the apodex provider
|
|
20
|
+
block alongside llama.cpp; `bin/models-detect.sh` probes and emits the
|
|
21
|
+
apodex provider for the Pi model file (`~/.pi/agent/models.json`).
|
|
22
|
+
- **Install seams.** Apodex rides the existing seams: models-detect merges
|
|
23
|
+
it into the Pi models file at install; agents-config applies it into
|
|
24
|
+
opencode.json. Mo
|
|
25
|
+
|
|
26
|
+
### Files
|
|
27
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-16 — icons the operator can pin, and one pair of hands for the shells
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
**"Fail, no icons" — and the cause was a trap I had already been bitten by.**
|
|
5
|
+
`bin/design-icon.sh install` writes an app's rune into the icon theme and a
|
|
6
|
+
`.desktop` entry into the applications dir. It used `XDG_DATA_HOME`, and this
|
|
7
|
+
agent session exports that as a **sandbox** (`…/opencode-rd`), so the icons went
|
|
8
|
+
somewhere no desktop can see. It now targets the operator's real data dir
|
|
9
|
+
(`$HOME/.local/share`, with `YMIR_DESKTOP_DATA_HOME` for a throwaway test) — the
|
|
10
|
+
same class of bug that once hid `gh` from this session.
|
|
11
|
+
|
|
12
|
+
Installed now, for **every** app: hlidskjalf, **odrerir**, **sessrumnir**, the
|
|
13
|
+
Smíðja visualizer and hlidskjalf-mobile — each with its rune icon and a dockable
|
|
14
|
+
entry. Óðrerir and Sessrúmnir had **none**, which is exactly why they could not
|
|
15
|
+
be pinned. The stale `ymir-smidja.desktop` (pointing at a repo PNG) is folded
|
|
16
|
+
into the rune's own entry.
|
|
17
|
+
|
|
18
|
+
**One pair of hands for two lifecycles.** `scripts/start.sh` and
|
|
19
|
+
`scripts/stop.sh` manage the web; `scripts/electron.sh` manages the shells — and
|
|
20
|
+
they never met, which is why "the electrons are not running" was true while 28
|
|
21
|
+
processes stood, and why a restart could leave a shell watching a dead port.
|
|
22
|
+
`scripts/raise.sh` / `scripts/lower.sh` own both: lower takes the windows down
|
|
23
|
+
**first**, so none is left watching a port that just vanished.
|
|
24
|
+
|
|
25
|
+
**A bug the restart surfaced:** `scripts/electron.sh stop` used `local` outside a
|
|
26
|
+
fu
|
|
27
|
+
|
|
28
|
+
### Files
|
|
29
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-16 — the desktop never dials out: Cloudflare stays outside Electron
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
The Allfather's rule: **"electron should never have anything with cloudflare to
|
|
5
|
+
do."** It was not quite true — three doors stood open:
|
|
6
|
+
|
|
7
|
+
- **Sessrúmnir's "To the Hall"** preferred the local hall and, when it did not
|
|
8
|
+
answer, fell back to `https://hall.ymir.zerwiz.org`. A desktop seat that
|
|
9
|
+
reaches for a public hostname when its own machine is quiet is a seat that
|
|
10
|
+
leaves the building to do its errands. It is now **local only** — when the hall
|
|
11
|
+
is not running, the seat says so.
|
|
12
|
+
- **Hlidskjalf's shell** took `HLIDSKJALF_URL` and `SMIDJA_URL` from the
|
|
13
|
+
environment, and **Óðrerir's** took `HALL_URL` — each able to point a desktop
|
|
14
|
+
window at a tunnel with one exported variable.
|
|
15
|
+
- Both now pass their URL through a **loopback guard**: anything that is not
|
|
16
|
+
`127.0.0.1`, `localhost` or `::1` is refused with a warning and replaced by the
|
|
17
|
+
local default. The shell loads the machine, never the internet.
|
|
18
|
+
|
|
19
|
+
**Why this is the same fight as the bridge:** a desktop app that dials out is a
|
|
20
|
+
desktop app whose failures belong to somebody else's edge. The bridge disguised a
|
|
21
|
+
cloud endpoint as `127.0.0.1` and cost a night; these three would have disguised a
|
|
22
|
+
tunnel as a local seat.
|
|
23
|
+
|
|
24
|
+
### Files
|
|
25
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — 0.1.12: the icons reach the live tree, and a missing surface is a failure
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The launcher entries name the door** (`Exec=ymir hlidskjalf`, …) instead of an absolute path into whichever tree minted them — the fault that made every icon do nothing.
|
|
5
|
+
- **All three npm shapes resolve**: a clone (`apps/<app>`), a nested package, and a **sibling** package (`<prefix>/lib/node_modules/@zerwiz/<app>`), which is where a global install puts a dependency it hoists out of the distro.
|
|
6
|
+
- **@zerwiz/sessrumnir pinned exact** — a prerelease range resolved in one prefix and was skipped in another.
|
|
7
|
+
- **A missing surface is a FAILURE with the remedy**, never "skipped".
|
|
8
|
+
|
|
9
|
+
### Files
|
|
10
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — 0.1.8: the day's work reaches npm
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The doors.** `ymir` now carries the operator's verbs, each named for the
|
|
5
|
+
figure who does the work: `raise` · `lower` · `eir` (heal) · `groa` (renew) ·
|
|
6
|
+
`heimdall` (the way in) · `invite` · `smidja` (the board) · `hlidskjalf` ·
|
|
7
|
+
`sessrumnir` · `mimir` · `sense` · `plan`. Before this, the package put two
|
|
8
|
+
commands on PATH and neither could raise the app or the board.
|
|
9
|
+
- **The cloth.** `bin/ymir-style.sh` — colour and marks cut from the halls' own
|
|
10
|
+
tokens (bone · bronze · steel · blood), shown only where a human watches, with
|
|
11
|
+
the data left as TOON on stdout. The plan, the installer, the validate report
|
|
12
|
+
and Eir all wear it.
|
|
13
|
+
- **The shapes.** `bin/smidja-lib.sh` tells a clone's smithy from a packaged one;
|
|
14
|
+
`bin/smidja-board.sh` is the board's own door (`ymir smidja`), built and served
|
|
15
|
+
from an npm install; `bin/electron-lib.sh` verifies a shell's runtime so a
|
|
16
|
+
skipped npm install script cannot pass as a launch.
|
|
17
|
+
- **The icons.** One truth where three maps disagreed, and no claim of a glyph
|
|
18
|
+
nobody drew: Óðrerir wears ansuz, Sessrúmnir othala, the smithy's icon is named
|
|
19
|
+
for the smithy.
|
|
20
|
+
- **The repair.** `4dd7273`'s hand-merge left `bin/ymir-install.sh` and
|
|
21
|
+
`scripts/start.sh` unparseable on main; both restored. Every runtime script
|
|
22
|
+
parses again.
|
|
23
|
+
|
|
24
|
+
### Files
|
|
25
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — a stale install cannot hide, and the one-liner cannot be stranded
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The fault the Allfather hit:** `npm install -g @zerwiz/ymir` reported *"changed 200 packages"* and changed nothing — npm resolved a **cached `latest`**, saw the same version, and left the old build in place. The installed copy stayed 0.1.14 while the registry served 0.1.26, and nothing told the user. With 750+ downloads, that is not a detail.
|
|
5
|
+
- **The CLI now says when it is out of date** — once a day, on a terminal, silenced by the same `ymir config notice version off` as every other notice: *"a newer Ymir is on npm 0.1.14 → 0.1.26 · update: npm i -g @zerwiz/ymir"*.
|
|
6
|
+
- **The one-liner is cache-proof**: it installs `@latest` with `--prefer-online`, so a stale packument cannot strand a fresh machine.
|
|
7
|
+
|
|
8
|
+
### Files
|
|
9
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — both shapes: a clone and an npm install, and the patience words
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **`ymir raise` failed on a packaged install** — and the reason was ours, not
|
|
5
|
+
npm's. Every package had arrived; the scripts looked for the apps in the clone's
|
|
6
|
+
`apps/`, where a package keeps nothing. `scripts/start.sh` died on
|
|
7
|
+
`cd …/apps/hlidskjalf: No such file or directory`. **Eighteen files assumed the
|
|
8
|
+
clone's layout.**
|
|
9
|
+
- **One resolver, both shapes:** `bin/app-lib.sh` — `apps/<surface>` in a clone,
|
|
10
|
+
`node_modules/@zerwiz/<package>` in a package, with the surface→package map
|
|
11
|
+
(`smidja` → `@zerwiz/smidja-factory`). Wired into the raise path, the windows,
|
|
12
|
+
the invite door, the seat-hall, Eir, the icons, the placement, the hall snapshot
|
|
13
|
+
and the installer's own SPA and shell steps. `bin/smidja-lib.sh` delegates to it
|
|
14
|
+
now, so there is one truth about where things live.
|
|
15
|
+
- **Proven in both trees**: all five surfaces resolve from `$HOME/Ymir`
|
|
16
|
+
(a clone) and from an npm-installed package. And `ymir raise` run against the
|
|
17
|
+
packaged tree no longer dies — it fetches the app's dependencies, raises the
|
|
18
|
+
gate API, **starts Nornir cron**, and brings up Bifrost and the well.
|
|
19
|
+
- **A trap worth naming:** `printf -v <name>` writes to the *function's* scope, so
|
|
20
|
+
a helper whose scratch variable shares the caller's requested name swallows the
|
|
21
|
+
answer. Every scratch name in the resolvers is function-prefixed for that
|
|
22
|
+
reason.
|
|
23
|
+
- **The patience words.** A long install shoul
|
|
24
|
+
|
|
25
|
+
### Files
|
|
26
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — Gróa knows the npm half: how to renew the published packages
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Her skill gains the whole procedure** — choose the number from the registry (never from memory: it can be ahead of main), land the bump by PR, publish through the vault, verify by the *version document* (the packument lags), and move the four apps pins in the same release.
|
|
5
|
+
- **And the traps, each of which cost a night:** a stale cached `latest` makes `npm i -g` a silent no-op that still prints success; npm gates Electron s postinstall so windows need `npm rebuild electron`; and a package must declare its own `name`/`files`/privacy where it lives rather than having a manifest rewritten at publish time.
|
|
6
|
+
- The token lives in the encrypted vault; when a tool reports it absent, the DOOR is broken, not the key — and `age -d -i hodd/secrets/age.key hodd/secrets/platform.env.age` opens it while `bin/hodd.sh emit` does not.
|
|
7
|
+
|
|
8
|
+
### Files
|
|
9
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — npm-only: the hall answers on its own port, and the marks land on any desktop
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
The Allfather turned off every service running from the clone and asked for the
|
|
5
|
+
npm path alone to be true.
|
|
6
|
+
|
|
7
|
+
- **The SPA never listened on `:3888`.** `scripts/start.sh` raised it with a bare
|
|
8
|
+
`npm run dev`, so Vite took 5173 — then 5174 — while `ymir-validate.sh` and
|
|
9
|
+
every door looked for `:3888`. The port is now our decision
|
|
10
|
+
(`--port "$HLIDSKJALF_PORT" --strictPort`), a packaged install serves its built
|
|
11
|
+
`./dist` through `vite preview` instead of a dev server, and the raise prints
|
|
12
|
+
the last lines of the log when the port does not answer instead of claiming
|
|
13
|
+
success.
|
|
14
|
+
- **Óðrerir was skipped on a packaged install** — `HALL_DIR="$ROOT/apps/odrerir"`,
|
|
15
|
+
the clone's layout again. It resolves through `bin/app-lib.sh` now
|
|
16
|
+
(`app_dir odrerir`), like every other surface.
|
|
17
|
+
- **The launcher entries and the icons are the freedesktop half, not Omarchy's.**
|
|
18
|
+
Both halves of `bin/desktop-place.sh` sat behind the Omarchy gate, so a GNOME
|
|
19
|
+
operator got *nothing* — no entries, no rune icons — which is why the desktop
|
|
20
|
+
marks from the clone existed and the ones from npm never appeared. `entries` is
|
|
21
|
+
its own verb now (any Linux desktop), the installer's `marks` step calls it, and
|
|
22
|
+
the desktop database and icon cache are refreshed afterwards.
|
|
23
|
+
- **A user can see what moved.** `npm install -g` says *"changed 266 packages"* and
|
|
24
|
+
no versions. The CLI records the version it last ran and says
|
|
25
|
+
|
|
26
|
+
### Files
|
|
27
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the apps leave the monorepo; installation pulls them from their own repos
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The app split lands in the installer.** The five apps (hlidskjalf,
|
|
5
|
+
hlidskjalf-mobile, odrerir, sessrumnir, smidja) now live in their own repos
|
|
6
|
+
registered in the home registry (`$HOARD/identity/projects.yaml`) — the
|
|
7
|
+
monorepo never tracks them, and **`step_apps`** clones or fast-forwards each
|
|
8
|
+
`apps/<path>` from its registered `git{}` block (never guessing a remote,
|
|
9
|
+
always reading the registry). The smithy engine (`apps/smidja`) is stamped
|
|
10
|
+
from the cloned factory's `templates/smidja`, exactly as `install.py` does
|
|
11
|
+
for a target repo — so a fresh clone still gets a working smithy.
|
|
12
|
+
- **The vendored app trees leave the index.** `apps/{hlidskjalf,
|
|
13
|
+
hlidskjalf-mobile,odrerir,sessrumnir,smidja,smidja-factory}` are gitignored
|
|
14
|
+
and `git rm --cached`-ed (751 files, 135k lines); `apps/README.md` stays.
|
|
15
|
+
A dir present that is not a git clone is reported (`move it aside and
|
|
16
|
+
re-run`) rather than silently replaced.
|
|
17
|
+
|
|
18
|
+
galdr-reread: `.agents/skills/galdr-ymirsystem/assets/installation.md` — the
|
|
19
|
+
step table (`22 steps`, `24` `step_*` functions), the new `apps` row, and the
|
|
20
|
+
Sessrúmnir rows now say "its own repo", not "vendored".
|
|
21
|
+
|
|
22
|
+
### Files
|
|
23
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the doors, the cloth, and the icons that were not there
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
Four things the operator met and could not use: doors that never opened, output
|
|
5
|
+
with no design, a board that could not be built from a package, and an icon map
|
|
6
|
+
that named a glyph nobody had drawn.
|
|
7
|
+
|
|
8
|
+
- **The doors are named for the figure who does the work.** `ymir` put two
|
|
9
|
+
commands on PATH and could neither start the app nor raise the board. It now
|
|
10
|
+
carries the doors: **raise · lower · eir** (heal) · **groa** (renew) ·
|
|
11
|
+
**heimdall** (the way in) · **invite** · **smidja** (the board) ·
|
|
12
|
+
**hlidskjalf** · **sessrumnir** · **mimir** · **sense** · **plan**. A name the
|
|
13
|
+
law has not given a home — `doctor`, `validate`, `auth` — still answers, once,
|
|
14
|
+
with the name that has it.
|
|
15
|
+
- **The cloth: `bin/ymir-style.sh`.** Ymir had correct output and no design. The
|
|
16
|
+
palette is cut from the halls' own tokens — bone for words, bronze for what
|
|
17
|
+
acts, steel for what stands, blood for what is wrong — with a mark per state
|
|
18
|
+
(`◆ · — ✕ ? ✓`). Colour and marks appear only where a human is watching
|
|
19
|
+
(stderr a TTY, `NO_COLOR` unset); the data on stdout stays TOON, and **the
|
|
20
|
+
words are never conditional, only the colour is**. The plan renders in the
|
|
21
|
+
cloth on stderr while the TOON stays pipeable; the installer opens with it and
|
|
22
|
+
ends with the next steps.
|
|
23
|
+
- **The packaged tree is told apart from a clone.** `bin/smidja-lib.sh` resolves
|
|
24
|
+
the smithy — `apps/smidja-factory` in a clone, `node_modul
|
|
25
|
+
|
|
26
|
+
### Files
|
|
27
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the editor stops being banished to its own desktop
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **`bin/editor-place.sh` pinned the editor to its own desktop with
|
|
5
|
+
`no_focus = true`** — VS Code mapped onto a different workspace than the one
|
|
6
|
+
the Allfather worked on and never took focus, so nothing inside it was
|
|
7
|
+
clickable. The rule was written by Ymir itself into
|
|
8
|
+
`~/.config/hypr/ymir-desktops.lua`.
|
|
9
|
+
- **The editor is now UNMANAGED by default**: it opens on the active desktop,
|
|
10
|
+
focused and clickable, like any other app. The old pin remains reachable
|
|
11
|
+
explicitly with `YMIR_EDITOR_PIN=1 bin/editor-place.sh apply`.
|
|
12
|
+
- Live desk healed: the `code` windowrule was removed from
|
|
13
|
+
`~/.config/hypr/ymir-desktops.lua` (backup kept alongside), Hyprland reloaded
|
|
14
|
+
with no config errors, and the stranded VS Code windows were moved to the
|
|
15
|
+
active desktop and focused.
|
|
16
|
+
|
|
17
|
+
### Files
|
|
18
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the four surfaces arrive by npm, and an old tree gives up what it holds
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The app packages arrive with the distro.** `@zerwiz/ymir` now depends on the
|
|
5
|
+
surfaces as their own packages — `@zerwiz/hlidskjalf`, `@zerwiz/odrerir`,
|
|
6
|
+
`@zerwiz/sessrumnir` (live on the registry) and `@zerwiz/smiddja` (published at
|
|
7
|
+
0.1.0 today). They are **optionalDependencies**, deliberately: a broken app
|
|
8
|
+
package must never stop the core from installing, and a package not yet on the
|
|
9
|
+
registry is skipped by npm and starts arriving the moment it is published.
|
|
10
|
+
**Proven**: a global install from the packed tarball lands the core plus all
|
|
11
|
+
three live apps, 330 packages, and the bin answers `0.1.6`. A local install
|
|
12
|
+
hoists them to `node_modules/@zerwiz/<app>`; a global one nests them under the
|
|
13
|
+
distro's own `node_modules` — the plan checks both shapes.
|
|
14
|
+
- **The plan tells the shapes apart.** "Declared as a dependency but not fetched"
|
|
15
|
+
is a `DO`; "no package and no dependency" is a `BLOCKED`. All four surfaces read
|
|
16
|
+
`DO` on a machine that has the distro but not yet the apps.
|
|
17
|
+
- **Migration 0005 — the operator's things leave the code tree.** It carries this
|
|
18
|
+
machine's records, the runtime state (pids · logs · locks · the applied-marker),
|
|
19
|
+
the operator's credentials, and the settings git does not track. Run on the
|
|
20
|
+
Allfather's machine: **44 carried, 3 stale twins kept, 1 identical duplicate
|
|
21
|
+
removed, 0 refused** — the tree left holding `.gitkeep` and the distro's ow
|
|
22
|
+
|
|
23
|
+
### Files
|
|
24
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the house gains an unpublish door
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **`bin/npm-publish.sh --unpublish @scope/name@<version>`.** Publishing had a
|
|
5
|
+
door in this house and unpublishing had none, so the act was done by hand on a
|
|
6
|
+
machine whose `~/.npmrc` holds a stale token — the very reason the door exists.
|
|
7
|
+
The new mode resolves the token from the hoard exactly as publishing does,
|
|
8
|
+
demands a spec that names the version (a whole package is not a one-word act),
|
|
9
|
+
supports `--dry-run`, and says plainly that the registry's CDN may serve the
|
|
10
|
+
tarball for a while after the removal.
|
|
11
|
+
- **The window is 72 hours.** npm allows one version back within 72 hours of its
|
|
12
|
+
publication; past that only npm support can remove it. The help text says so,
|
|
13
|
+
because a door that does not name its own clock invites a late knock.
|
|
14
|
+
- **`@zerwiz/ymir@0.1.5` was unpublished** — the version that carried the memory
|
|
15
|
+
well. Publishing the clean 0.1.7 moves the `latest` tag off the tainted build at
|
|
16
|
+
once, which is the half of the repair that does not wait for propagation.
|
|
17
|
+
|
|
18
|
+
### Files
|
|
19
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the icons reach the live tree, and a missing surface is a failure
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
The Allfather clicked the launcher icons and nothing happened. Both faults were
|
|
5
|
+
mine, and both are the same mistake wearing different clothes: **something named a
|
|
6
|
+
path where it should have named a door.**
|
|
7
|
+
|
|
8
|
+
- **The entry launched a temp directory.** Every `.desktop` file carried
|
|
9
|
+
`Exec=bash <the tree that minted it>/scripts/electron.sh …` — and I had minted
|
|
10
|
+
from `/tmp/opencode/…` while testing, so every icon on his launcher pointed into
|
|
11
|
+
a scratch tree. Entries now name the **door**: `Exec=ymir hlidskjalf`, resolved
|
|
12
|
+
from PATH, so a click reaches whichever install is live. A launcher entry must
|
|
13
|
+
outlive the tree that wrote it.
|
|
14
|
+
- **The fourth surface was missing and the raise shrugged.** `Sessrúmnir — skipped
|
|
15
|
+
(the sessrumnir surface is not present)` and the raise carried on. It was a
|
|
16
|
+
**sibling**: npm put it at `<prefix>/lib/node_modules/@zerwiz/sessrumnir`, beside
|
|
17
|
+
ymir, not inside it. The resolver knew a clone (`apps/<app>`) and a nested
|
|
18
|
+
package (`<pkg>/node_modules/@zerwiz/<app>`) but not that third shape — which is
|
|
19
|
+
the one a **global** install uses when it hoists a dependency out of the distro.
|
|
20
|
+
All three are resolved now, and a surface that is absent is a **FAILURE with the
|
|
21
|
+
exact remedy**, never a shrug.
|
|
22
|
+
- **A dependency must resolve every time.** `@zerwiz/sessrumnir` was declared as a
|
|
23
|
+
prerelease range (`^0.1.8-alpha`): npm resolved it in one prefix and sk
|
|
24
|
+
|
|
25
|
+
### Files
|
|
26
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the install asks with a plan, and the operator's things leave the code tree
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The consent a real install asks for is now computed, not recited.** The old
|
|
5
|
+
prompt was a hardcoded paragraph, and a paragraph cannot know the host: it named
|
|
6
|
+
an Omarchy version on a Mac, promised a workspace tree that already stood, and
|
|
7
|
+
never mentioned that no application had been installed at all. `bin/ymir-plan.sh`
|
|
8
|
+
probes this machine and prints one row per step with its state and the reason —
|
|
9
|
+
`DO · SKIP · INFO · BLOCKED · CONSENT` — across nine phases (resolve · code ·
|
|
10
|
+
home · runtimes · engines · apps · wire · raise · verify). `ymir-install.sh`
|
|
11
|
+
prints it at the consent prompt; `--plan` / `--dry-run` prints it and writes
|
|
12
|
+
nothing; `--json`, `--phase N` and `--blocked` are there for automation and for
|
|
13
|
+
reading what is holding an install back.
|
|
14
|
+
- **The four app surfaces are named in the plan.** hlidskjalf, odrerir, sessrumnir
|
|
15
|
+
and smidja each get a row: whether the source is present, whether the web build
|
|
16
|
+
exists, and — when it is absent — the honest reason (`no apps/<name> and no
|
|
17
|
+
@zerwiz/<name> package`). The Electron shells are a `CONSENT` row, not a silent
|
|
18
|
+
download: three shells each pull a ~100 MB runtime the web surfaces do not need.
|
|
19
|
+
- **The home is the operator's to choose.** `step_home` asks once, records the
|
|
20
|
+
answer as machine state under `~/.config/ymir/home`, and every later script
|
|
21
|
+
resolves it through `bin/hoard-lib.sh` (`$YMIR_HOME` → the r
|
|
22
|
+
|
|
23
|
+
### Files
|
|
24
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the installer actually installs (the whole platform, then proves it)
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Why pi.dev and opencode just work and Ymir did not.** They are one binary: JS only, no Electron, no build step, no services, no windows — and their `curl|sh` installer puts the command on PATH *and* runs onboarding. The npm path is the side door. Ymir is a platform: its install must place a CLI, four apps, their dependencies, four Electron runtimes (which npm gates), two SPA builds, desktop entries and icons, the services, and a home — eight things to go wrong, and npm fights half of them.
|
|
5
|
+
- **So the one-liner now finishes the job**, the way theirs does: it installs the command, then runs **the first setup**, then **proves what stands** and names the next door. `YMIR_SKIP_SETUP=1` installs the command alone, for anyone who wants the old behaviour.
|
|
6
|
+
- An installer that stops at a binary leaves the user with a tool that does nothing yet.
|
|
7
|
+
|
|
8
|
+
### Files
|
|
9
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the installer has a design of its own
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The result is rendered, not dumped.** The plan got the cloth and the install did not: twenty-nine raw TOON rows and a poem, which the Allfather rightly called zero design. Now the same rows are rendered for the eye on stderr — a rule, a verdict (*"it stands — 22 steps done · 7 warned · 1 skipped"*), every warning with its reason, and the skips in one line. The TOON stays the data on stdout; the design is for the person.
|
|
5
|
+
- **The consent shows the plan again.** `--colour` renders on stderr and I had sent *both* streams to `/dev/null`, so the plan was invisible at the very moment it was being accepted.
|
|
6
|
+
- **The seat can mend its own runtime**, and says why when it cannot — npm gates Electron postinstall, so a fresh install otherwise ends with a window that cannot open.
|
|
7
|
+
|
|
8
|
+
### Files
|
|
9
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the npm door stands the surfaces
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **`@zerwiz/ymir` now depends on its surfaces**: `@zerwiz/{hlidskjalf,
|
|
5
|
+
odrerir, sessrumnir, smidja-factory}` are declared dependencies (bump
|
|
6
|
+
`0.1.14` → `0.1.15`), so `npm i -g @zerwiz/ymir` (or a packaged install)
|
|
7
|
+
delivers the app shells under `node_modules/@zerwiz/*`, which `app-lib`
|
|
8
|
+
resolves. The audit's one gap — the platform carried no apps — is closed.
|
|
9
|
+
- **`@zerwiz/smidja-factory` `0.1.1` → `0.1.2`**: the visualizer's nanoid fix
|
|
10
|
+
and the eye's-home SKILL line reach npm.
|
|
11
|
+
|
|
12
|
+
### Files
|
|
13
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — the one-liner the README promised, and it sets the PATH
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **`install.sh` did not exist.** The README's first door (\`curl -fsSL …/install.sh | bash\`) led nowhere — which is how a user on another machine ends up typing \`ymir\` in every combination and getting nothing.
|
|
5
|
+
- **It exists now, and it removes the whole class of failure:** a prefix the user owns (no \`sudo\`, no \`EACCES\`), the \`export PATH\` written into the shell's rc so it survives the session, and then it **proves the door** with \`ymir --version\` rather than promising it.
|
|
6
|
+
- The command was never missing from the package — the published tarball ships \`bin/ymir.js\` and declares \`bin: {ymir, ymir-install}\`. **The shell simply was not looking where npm put it**, and that is the most common "it does not work" in the Node ecosystem.
|
|
7
|
+
|
|
8
|
+
### Files
|
|
9
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-17 — "ymir: command not found" is a PATH fault, and here is the cure
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The command is installed; the shell is not looking.** The published manifest carries `bin: {ymir, ymir-install}`, so the file is there — in npm's global bin directory, which an ordinary Linux install puts under `~/.npm-global` and a shell profile often never adds.
|
|
5
|
+
- **The README answers it where a stuck user looks**: `npm prefix -g`, the `ls` that proves the command exists, the one-line `export PATH`, and the `EACCES` cure that sets a prefix the user owns instead of reaching for `sudo`.
|
|
6
|
+
|
|
7
|
+
### Files
|
|
8
|
+
- *(carried from the frozen CHANGELOG.md)*
|
package/docs/fixes/install/unversioned-2026-09-18-the-readme-leads-with-the-doors-that-work.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## install · unversioned · 2026-09-18 — the README leads with the doors that work
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The npm page and GitHub both render `README.md`**, so a user meets it first — and
|
|
5
|
+
it buried the door that always works (`npx @zerwiz/ymir`) and the PATH cure inside
|
|
6
|
+
a later section. It now opens with the one-liner (install into a prefix you own, PATH
|
|
7
|
+
written, setup run, door proven), names `npx` second, and answers *"ymir: command not
|
|
8
|
+
found"* and the stale-install trap where they happen.
|
|
9
|
+
- The three doors and their honest reasons: `npx` needs no PATH at all; the one-liner
|
|
10
|
+
sets it once; `npm install -g` works wherever npm's global bin is on PATH.
|
|
11
|
+
|
|
12
|
+
### Files
|
|
13
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## odrerir · unversioned · 2026-09-14 — Óðrerir forged (Eindri odrerir, pane w3:p7)
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- The Live Hall carved on the landing per PLAN.md §14: dealt slate pile,
|
|
5
|
+
choices + recommended marks, freeform, queue + limit guard, thread ledger,
|
|
6
|
+
live tally, four empty states, fail-closed, keyboard, reveal, mobile (390px,
|
|
7
|
+
zero overflow); cloth check green; §12 scan clean. Deployed plan for the
|
|
8
|
+
public hall: hall.ymir.zerwiz.org via a second Caddy site :4322 (deploy/
|
|
9
|
+
setup-hall.sh + tunnel-ingress.sh, idempotent, live provisioning untested).
|
|
10
|
+
|
|
11
|
+
### Files
|
|
12
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## odrerir · unversioned · 2026-09-17 — the Live Hall's board becomes true: the snapshot lands on the loom
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **The Hall was a glass with nothing behind it.** The Óðrerir page reads
|
|
5
|
+
`apps/odrerir/public/livehall.json` same-origin, but nothing wrote it on a
|
|
6
|
+
schedule — the board showed the saga's own static count and said so.
|
|
7
|
+
`bin/nornir-job-hall-snapshot.sh` (08:00, after the 06:00 observer and the
|
|
8
|
+
07:00 briefing) now drives `bin/hall-snapshot.sh` from real state — runes,
|
|
9
|
+
projects, the cron gauge, the wake queue, standing smiths, armed when-
|
|
10
|
+
sources, landed errands — and carves Rune `odrerir / hall.snapshot`.
|
|
11
|
+
- The snapshot is runtime, never repo: `apps/odrerir/public/livehall.json` is
|
|
12
|
+
gitignored, so the job never dirties a branch.
|
|
13
|
+
|
|
14
|
+
galdr-reread: `.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md` — new
|
|
15
|
+
§3.5 row (reads/writes table, idempotence note).
|
|
16
|
+
|
|
17
|
+
### Files
|
|
18
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — Gleipnir lock PID binding fix
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Problem:** The session lock (`state/.lock`) was written with the digest
|
|
5
|
+
helper's PID (a short-lived child) instead of the live Pi harness PID. The
|
|
6
|
+
harness adapter (`gna-pi-watch.ts`) reported "no live session holds the lock"
|
|
7
|
+
and refused to arm the watcher.
|
|
8
|
+
- **Root cause:** `BROKK_SESSION_PID` was never injected into the spawn chain.
|
|
9
|
+
`gleipnir_lock_acquire` fell back to `$$` (helper PID).
|
|
10
|
+
- **Fix:** `.pi/extensions/syn-turnend-guard.ts` and
|
|
11
|
+
`.pi/extensions/gna-pi-watch.ts` now pass `BROKK_SESSION_PID: String(process.pid)`
|
|
12
|
+
in the spawn env, so the lock binds to the live Pi process.
|
|
13
|
+
- **Impact:** Session lock reclamation works on next Pi session start/reload.
|
|
14
|
+
The stale lock (dead PID) is overwritten by the live PID.
|
|
15
|
+
|
|
16
|
+
### Files
|
|
17
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — Hardcoded per-page feeds (header + stream)
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **New:** every gate has its own hardcoded, domain-appropriate rolling feed
|
|
5
|
+
(16 pools, `src/data/feeds.ts`) — Fleet, Tasks, Well, Runes, Reviews,
|
|
6
|
+
Processes (Valhalla), Files, Chat, Forge, Runtime, Cron, Sessions, Trace,
|
|
7
|
+
Decisions, Stats, Profile. Extra Kaia “oracle by the well” lines for the chat
|
|
8
|
+
page.
|
|
9
|
+
- **Header:** a live `PageFeed` now sits in the page header of every gate
|
|
10
|
+
(glyph + hint on the left, the current page's latest 3 messages on the
|
|
11
|
+
right), rolling.
|
|
12
|
+
- **Stream:** the bottom Stream keeps each page's last **40** domain messages,
|
|
13
|
+
with the fleet-wide feed as fallback. A generator tops it up every 2.4s and
|
|
14
|
+
the page is seeded on first visit so it is never cold.
|
|
15
|
+
- **Verified:** `tsc` + `vite build` green, SPA 200, compliance 8/8, smoke 8/8,
|
|
16
|
+
lint 4/4.
|
|
17
|
+
|
|
18
|
+
### Files
|
|
19
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — Per-page rolling 40 message feeds
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Change:** the bottom stream is no longer one global 120-line feed. Every gate
|
|
5
|
+
keeps its own rolling window of the **last 40** messages, and events are routed
|
|
6
|
+
to the page they belong to (module → gate: `well`, `sessions`, `forge`,
|
|
7
|
+
`runes`, `cron`, `reviews`, `processes`), with the fleet-wide feed as fallback.
|
|
8
|
+
The stream header shows the current page. `STREAM_WINDOW = 40`, matching the
|
|
9
|
+
chat's `CHAT_WINDOW = 40`.
|
|
10
|
+
- **Verified:** `tsc` + `vite build` green, SPA 200.
|
|
11
|
+
|
|
12
|
+
### Files
|
|
13
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — Smiðja views are repo-local
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Change:** Removed the last external dependency. `bin/factory-observe.sh`
|
|
5
|
+
(which defaulted to `~/command/factory/factory_data/factory.db`) is gone;
|
|
6
|
+
`bin/smidja-observe.sh` reads the repo's own
|
|
7
|
+
`smidja/smidja_data/smidja.db` read-only and reports absence honestly.
|
|
8
|
+
- **API:** `/api/factory` replaced by `/api/smidja/{health,sessions,sessions/:id,decisions,stats}`
|
|
9
|
+
(`bun:sqlite`, read-only).
|
|
10
|
+
- **UI:** four Hlidskjalf gates added — Sessions, Trace, Decisions, Stats —
|
|
11
|
+
reading the smithy's trace. No `command`/`factory` references remain in the
|
|
12
|
+
runtime or portal.
|
|
13
|
+
- **Verified:** `tsc` + `vite build` green, SPA 200, endpoints honest-absent,
|
|
14
|
+
Galdr compliance 8/8, smoke 8/8.
|
|
15
|
+
|
|
16
|
+
### Files
|
|
17
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — Stats 1:1, Kaia chat, Forge prompts
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **Stats:** ported the full Smiðja `StatsResponse` 1:1 into the gate API and
|
|
5
|
+
the Stats gate — runs/success/fail/running/rate, token optimization
|
|
6
|
+
(input/output/cache_read/cache_write, cache-hit ratio, avg CHR/run),
|
|
7
|
+
local-vs-online provider split with per-model table, 40-model commercial
|
|
8
|
+
catalog (cached/total/savings/%), by-chain and by-workflow. A real run
|
|
9
|
+
renders live.
|
|
10
|
+
- **Chat (Kaia):** per-session JSONL store (`state/chat/`), list/history/delete
|
|
11
|
+
endpoints, a rolling **40-message** window, query-grounded well recall before
|
|
12
|
+
every dispatch, an animated "Kaia is thinking…" indicator, a session sidebar
|
|
13
|
+
(new/switch/delete), a connected-model datalist (314 models) with free-type,
|
|
14
|
+
and Eindri lane toggles.
|
|
15
|
+
- **Forge:** a Prompts mode to read/edit the smithy's
|
|
16
|
+
`prompt_engineering/<agent>/{system,user}.md` (path-guarded save) and a
|
|
17
|
+
connected-model datalist for agent models.
|
|
18
|
+
- **Verified:** `tsc` + `vite build` green, live chat via local model with
|
|
19
|
+
recall on, prompt roundtrip + traversal guard, compliance 8/8, smoke 8/8,
|
|
20
|
+
lint 4/4.
|
|
21
|
+
|
|
22
|
+
### Files
|
|
23
|
+
- *(carried from the frozen CHANGELOG.md)*
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## runtime · unversioned · 2026-09-11 — The well is real (Mimirsbrunn / engram)
|
|
2
|
+
|
|
3
|
+
### Why
|
|
4
|
+
- **New:** `bin/mimir-bridge.py` + `bin/mimir-bridge.sh` — the `:4602` HTTP face
|
|
5
|
+
the supervision tree named but that upstream never shipped (engram exposes a
|
|
6
|
+
CLI + MCP server only). Endpoints: `/health`, `/recall`, `/recent`,
|
|
7
|
+
`/timeline`, `/inspect`, `/observe`.
|
|
8
|
+
- **New:** repo-local store `.agents/memory/kaia.engram`, seeded from the
|
|
9
|
+
368-episode JSONL well.
|
|
10
|
+
- **Wired:** gate API `/api/well` now does semantic recall via the bridge (local
|
|
11
|
+
file fallback) and `/api/mimir/health` is live; the Well gate's Bridge tile
|
|
12
|
+
and timeline read real data (mock removed).
|
|
13
|
+
- **Harnesses:** the engram MCP server is registered for OpenCode, Pi, Claude,
|
|
14
|
+
Cursor, and Codex; requires the `mcp<2` SDK (`engram-mcp` breaks on mcp 2.x).
|
|
15
|
+
- **Lifecycle:** the bridge is raised by `scripts/start.sh` and
|
|
16
|
+
`bin/saga-session-start.sh`; the stale `engram.server` command was corrected.
|
|
17
|
+
- **Verified:** bridge up (370 episodes), semantic recall, MCP handshake
|
|
18
|
+
(engram 1.30), compliance 8/8, smoke 8/8.
|
|
19
|
+
|
|
20
|
+
### Files
|
|
21
|
+
- *(carried from the frozen CHANGELOG.md)*
|