From 24774757a3c14bb103d63fdc8124bde4aeccf77a Mon Sep 17 00:00:00 2001 From: Julien Martel Date: Fri, 14 Aug 2026 17:15:14 -0500 Subject: [PATCH 1/4] =?UTF-8?q?notes:=20=C2=A710=20closes,=20and=20"drop?= =?UTF-8?q?=20nebelhaus"=20is=20the=20one=20thing=20=C2=A76=20forbids?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-measured the rename's tail against the machine and the org rather than against the note, and found §10 further along than it claimed: - 10.3: `bench relocate-haus` had run (layer at ./haus) AND its compatibility shim was retired by workshop#331 on 2026-08-12 — no command, no repo_dir fallback, no status nudge, no bats cases survive in bench. - 10.4: zero family locks still record `"repo": "hausfold"`, and no repo in the org still describes itself as nebelhaus. Both bullets closed. - §10's gate re-runs green; all six `hausfold/hausfold` hits are on the allow-list §10.2 wrote. One rename item survives: ~/.config/nix/flake.nix:7 still names the old slug. It is one fix with the consumer's lock, not two — a lock's `original` is copied from the flake ref, so the lock cannot correct itself first. The night handoff also answers the question asked at the end of the arc in full: nebelhaus is NOT dropped, and the four live senses each stay for a different reason (the desktop, the flake input name, the dead org's update-check redirects, the state paths). Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QiRMS2Hcpo5svDKK9hpZa9 --- notes/hausfold-rename.md | 102 ++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 12 deletions(-) diff --git a/notes/hausfold-rename.md b/notes/hausfold-rename.md index 16cbce0..44eaf8d 100644 --- a/notes/hausfold-rename.md +++ b/notes/hausfold-rename.md @@ -164,7 +164,55 @@ One thing from §6 that survives and one that doesn't: - ❌ *"support stays support@nebelhaus.com, because people bought a nebelhaus product"* is now wrong: they buy a hausfold product. Support moves. -### Current handoff — 2026-08-14 (late) +### Current handoff — 2026-08-14 (night) + +**The rename is done, and "drop nebelhaus" is not the step after it — it is the +step this document spent §6 forbidding.** Asked at the end of the arc, the +question is worth answering in full rather than by pointing at a bullet, because +the word survives in four live senses and each one stays for a *different* +reason: + +| the surviving spelling | why it stays | +|---|---| +| **nebelhaus, the desktop** | it's a product with an install command (`hausfold.co/nebelhaus.sh`), a `/desktops/nebelhaus` page and users. §6 | +| `inputs.nebelhaus.url`, `--override-input nebelhaus/…` | the input names the **desktop**, not the org or the layer. §10.0's last box — rename it and every override silently stops applying while still reporting success | +| `github.com/nebelhaus/*`, the dead org | shipped copies of pounce and perch hit `api.github.com/repos/nebelhaus/` to check for updates; only a live org redirects them. Kept alive forever, deliberately | +| `~/.local/state/nebelhaus`, `/Library/Application Support/nebelhaus/…`, `~/.cache/claude-worktrees/` | state paths and a two-repo contract (§6, §3.3 Tier D). Renaming one end breaks rice-install detection | + +So there is no sweep left to run. The thing that *did* remain was **§10's tail**, +and re-measuring it today found two of its three items already closed by work +that never came back to update the note: + +- **§10.3 is history.** `bench relocate-haus` ran (the layer is at `./haus`), and + the compatibility shim it left — the command, `repo_dir`'s `$ROOT/hausfold` + fallback, the `bench status` nudge, three bats cases — was retired by + workshop#331 on 2026-08-12. `bench` carries none of it now. +- **§10.4's lock bullet and its repo-descriptions bullet are both closed.** Zero + family locks still record `"repo": "hausfold"`, and no repo in the org still + describes itself as nebelhaus. +- **§10's gate re-runs green**, with all six `hausfold/hausfold` hits on the + allow-list §10.2 wrote (four historical PR links, two lines of `bench`'s own + prose about the rename). + +⚠️ **One live item is left in the whole document that is a *rename* item, and it +is one fix rather than two:** `~/.config/nix/flake.nix:7` still reads +`inputs.nebelhaus.url = "github:hausfold/hausfold"`. It resolves through the +redirect, so nothing is broken — but a lock's `original` is copied from the flake +ref, which is exactly why the consumer's `flake.lock` is the last place in the +family recording the old slug and cannot correct itself. Editing the URL +re-locks the input on the next eval, so it wants to ride a `haus rebuild` you +were doing anyway, not a standalone commit. The input **name** stays `nebelhaus`. + +Everything else unchecked in this file is 👤 and belongs to §0/§4/§5.4, not to +the rename: two App Store record deletions (gated on `Perch Companion` being +approved), the post-activation attribution re-check, a ruling on +`org.nebelhaus.awake`, the `hi@` SLA, and the Paddle contact in `hausfold/ops`. +§5.3 also leaves one *look* rather than a step — the Cloudflare dashboard's +Workers ▸ Routes for both zones, since nothing in either repo enumerates what is +actually deployed and that is how the orphaned `nebelhaus-init` script survived +five weeks. + +### Handoff — 2026-08-14 (late) **There is no 🤖 work left in this document.** §5.2's last piece — the landing pages becoming Next routes — had already landed as @@ -3721,7 +3769,13 @@ trust, not composition; see §4 and §5 are independent of each other and can run in either order once §3 is green. Everything else is strictly sequential. -**You are here (2026-08-14, late):** **§5.2 is ✅ and this document has no 🤖 +**You are here (2026-08-14, night):** **§10 is closed too** — its checkout step +ran, its shim was retired (workshop#331), its lock and repo-description tails are +measured clean, and its gate re-runs green. The one rename item left anywhere is +`~/.config/nix/flake.nix:7`, which is 👤 and rides a rebuild. See the night +handoff for why "drop nebelhaus" is not the next phase. + +**You were here (2026-08-14, late):** **§5.2 is ✅ and this document has no 🤖 work left in it.** The docs, the Worker, the `nebelhaus.com/*` 301s and the eight landing routes all landed today. The phase gate was run rather than built, and it **passes** — including `nebelhaus.com/init.sh`, which an orphaned Cloudflare @@ -3877,7 +3931,7 @@ lookahead (`hausfold/hausfold(?!\.co)`) and the result was grepped for records the name the repo had at the time, which is the convention this family already kept through the org migration. -### 10.3 👤 The checkout — `bench relocate-haus` +### 10.3 ✅ The checkout — `bench relocate-haus`, run and then retired The directory is the only part that a `git pull` cannot deliver: it is machine state, and on this machine it had **four live agent lanes** whose `.git` files @@ -3903,24 +3957,48 @@ fallback is how a shim becomes permanent. **Three bats cases pin that arm's exact shape.** Delete the arm, the nudge, the command and its tests when every machine has run it. +✅ **Both halves have happened, and this box is history.** The command ran on +this machine (`$ROOT/haus` exists, `$ROOT/hausfold` does not — measured +2026-08-14), and the shim it left behind was retired two days earlier by +**workshop#331** (`f8c6692`, 2026-08-12): `bench` today has no `relocate-haus` +arm, no `$ROOT/hausfold` fallback in `repo_dir` (`bench:184`), no `bench status` +nudge and no bats cases for any of them. "Every machine" was one machine, which +is why the window between running it and deleting it could be two days rather +than a deprecation cycle. Nothing here is a step any more — the paragraphs above +are kept because the *ordering* (slug → edges → checkout → shim) is the part +that transfers. + ### 10.4 👤 Left for you, and why each is small - **`~/.config/nix/flake.nix:7`** — `inputs.nebelhaus.url = "github:hausfold/hausfold"`. A 👤 file outside the family. It resolves through the redirect, so this is hygiene; fix it at the next `haus rebuild` and the input *name* still stays `nebelhaus`. -- **`flake.lock`'s `original` field** across the family — same story as §3.3: - the recorded owner/repo is the old one until a `nix flake update --refresh` - rewrites it. Nothing breaks meanwhile (the rev is what's fetched), and - `bench ship` corrects it on the next real ripple. -- **The org repo descriptions** — `workshop`'s and `homebrew-tap`'s still say - "nebelhaus family" / `brew tap nebelhaus/tap`. Unrelated to §10, found while - looking; a two-minute `gh repo edit`. - -### §10's gate +- ~~**`flake.lock`'s `original` field** across the family~~ ✅ **corrected by the + ripple, as predicted** — measured 2026-08-14: `"repo": "hausfold"` appears in + **zero** family locks (haus, pounce, perch, nebelung, holt). The one survivor + is the consumer's own `~/.config/nix/flake.lock`, and it survives *because* of + the bullet above it: a lock's `original` is copied from the flake ref, so it + cannot correct itself while `flake.nix:7` still names the old slug. The two + are one fix, not two. +- ~~**The org repo descriptions**~~ ✅ **done** — measured 2026-08-14 via + `gh search repos --owner hausfold`: `workshop` reads "Every repo in the + hausfold family…", `homebrew-tap` reads "…`brew tap hausfold/tap`". No repo in + the org describes itself as nebelhaus. + +### §10's gate — ✅ green, measured 2026-08-14 `bats test/bench.bats` green (71 cases, 3 of them new), `web`'s vitest green (43), `shellcheck bench` clean, and `rg 'hausfold/hausfold(?!\.co)'` returning nothing outside historical PR links. Then, on the machine: `bench relocate-haus` followed by `bench status` reporting the layer at `./haus` with every lane still resumable in `holt`. + +**Re-run 2026-08-14.** The `rg` half returns six hits and **every one is on the +allow-list §10.2 wrote**: four historical PR links (`docs/workflows.md:220`, +`AGENTS.md:80,163`, and the `#69` citation) and two lines of `bench`'s own prose +explaining the rename (`bench:83,204`). The machine half is green too — the +layer is at `./haus`, and `bench status` no longer *has* the fallback nudge to +print (§10.3). ⚠️ The three bats cases the gate counts were deleted with the +shim, so a future re-run reads 68-ish, not 71; the number was a snapshot, not an +invariant. **§10 is closed** bar the single 👤 line in §10.4. From 241fcc1bc20d4c6b78869243e141dc04f03743cf Mon Sep 17 00:00:00 2001 From: Julien Martel Date: Fri, 14 Aug 2026 17:17:32 -0500 Subject: [PATCH 2/4] notes: the gate's six hits are two kinds, not one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The assurance pass caught the enumeration mis-splitting them: AGENTS.md:48 is not a PR citation, so "every one is on §10.2's allow-list" over-claimed. Three are historical PR links; three are sentences that quote the old slug in order to say it's gone — which is a second allowed kind, written after the allow-list was. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QiRMS2Hcpo5svDKK9hpZa9 --- notes/hausfold-rename.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/notes/hausfold-rename.md b/notes/hausfold-rename.md index 44eaf8d..4ec2cc7 100644 --- a/notes/hausfold-rename.md +++ b/notes/hausfold-rename.md @@ -190,9 +190,10 @@ that never came back to update the note: - **§10.4's lock bullet and its repo-descriptions bullet are both closed.** Zero family locks still record `"repo": "hausfold"`, and no repo in the org still describes itself as nebelhaus. -- **§10's gate re-runs green**, with all six `hausfold/hausfold` hits on the - allow-list §10.2 wrote (four historical PR links, two lines of `bench`'s own - prose about the rename). +- **§10's gate re-runs green**, with all six `hausfold/hausfold` hits accounted + for: three historical PR links, and three sentences that quote the old slug in + order to say it's gone (`AGENTS.md:48`, `bench:83,204`) — a second allowed kind + §10.2's list didn't anticipate. ⚠️ **One live item is left in the whole document that is a *rename* item, and it is one fix rather than two:** `~/.config/nix/flake.nix:7` still reads @@ -3994,10 +3995,16 @@ nothing outside historical PR links. Then, on the machine: `bench relocate-haus` followed by `bench status` reporting the layer at `./haus` with every lane still resumable in `holt`. -**Re-run 2026-08-14.** The `rg` half returns six hits and **every one is on the -allow-list §10.2 wrote**: four historical PR links (`docs/workflows.md:220`, -`AGENTS.md:80,163`, and the `#69` citation) and two lines of `bench`'s own prose -explaining the rename (`bench:83,204`). The machine half is green too — the +**Re-run 2026-08-14.** The `rg` half returns six hits, in two kinds. Three are +historical PR links, which is exactly what §10.2's allow-list names: +`docs/workflows.md:220` and `AGENTS.md:163` (both `#69`), and `AGENTS.md:80` +(`#200`, `#245`). The other three are **prose *about* the rename** — +`AGENTS.md:48` and `bench:83,204`, each explaining that the layer's repo stopped +being spelled `hausfold/hausfold` — which is a second allowed kind the original +list didn't anticipate, because it was written before anything had cause to +explain the old slug. A sentence that quotes a name in order to say it's gone is +the opposite of a leftover; the pattern cannot tell them apart, so a future +re-run should expect both. The machine half is green too — the layer is at `./haus`, and `bench status` no longer *has* the fallback nudge to print (§10.3). ⚠️ The three bats cases the gate counts were deleted with the shim, so a future re-run reads 68-ish, not 71; the number was a snapshot, not an From ff1c4a4e1cecdcec72ba387c0e68db719b459214 Mon Sep 17 00:00:00 2001 From: Julien Martel Date: Fri, 14 Aug 2026 23:22:29 -0500 Subject: [PATCH 3/4] =?UTF-8?q?notes:=20decision=2010=20=E2=80=94=20drop?= =?UTF-8?q?=20the=20name=20nebelhaus=20(=C2=A711)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The desktop becomes `hacker`; everything else still wearing the word becomes `haus`. Reverses §6's first two paragraphs, struck through in place rather than deleted — the reasoning there protected the PAGE, not the word, and every bit of it survives as `/desktops/hacker`. §11 carries the walkthrough. Its §11.0 table is the load-bearing part: 1,125 hits, three different answers, and most of them "leave it alone" — the dead org (update checks), holt's Go module path, nebelhaus.com's 301 map, and 110 lines of option aliases all stay. Two design notes worth having before the code: - The site already planned for this. worker.js's own comment predicted the desktop losing the name and prescribed the shape: new row, old row stays as an alias. The trap is the alias's PIN — re-point it to `hacker` or it 200s at the Worker and fails inside bootstrap. - The state-path move is by SYMLINK, which collapses perch's two-repo marker contract from a three-release coordination into none: old binaries resolve through the link and keep working. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QiRMS2Hcpo5svDKK9hpZa9 --- notes/hausfold-rename.md | 223 +++++++++++++++++++++++++++++++++++---- 1 file changed, 204 insertions(+), 19 deletions(-) diff --git a/notes/hausfold-rename.md b/notes/hausfold-rename.md index 4ec2cc7..fd6a69d 100644 --- a/notes/hausfold-rename.md +++ b/notes/hausfold-rename.md @@ -37,6 +37,7 @@ them: | 7 | **One site repo: `hausfold/hausfold.co`** | `/`, `/haus`, `/docs`, `/desktops`, `/holt`, `/pounce`, `/perch` (`/haus` added 2026-08-10 with decision 8). `workshop/web` folds into it and the landing pages are redesigned, not ported — see §5.1. *(Was `hausfold/website`, which is archived and private; the new repo was created 2026-08-08.)* | | 8 | **The layer's public name is `haus`; `hausfold` is the org, the maker and the seller** | added 2026-08-10, in conversation, after looking at the page. **This refines decision 1, it does not reverse it** — see the box below. | | 9 | **The layer's repo is `hausfold/haus`, its checkout `./haus`** | added 2026-08-11, in conversation. Decision 8 said hausfold is never the layer; `hausfold/hausfold` said it was. **§10** is the walkthrough. | +| 10 | 🔄 **The name `nebelhaus` is dropped. The desktop becomes `hacker`; everything else wearing the word becomes `haus`** | added 2026-08-14, in conversation. **This reverses §6's first two paragraphs**, which said the desktop keeps its name forever. **§11** is the walkthrough and the three-way split. | #### Decision 8, spelled out — because it looks like a third flip and isn't @@ -166,6 +167,22 @@ One thing from §6 that survives and one that doesn't: ### Current handoff — 2026-08-14 (night) +🔄 **The name `nebelhaus` is being dropped — decision 10, taken in conversation +after the audit below was written.** The desktop becomes **`hacker`**; every +other surviving `nebelhaus` becomes **`haus`**. **§11** is the walkthrough, and +its §11.0 table is the thing to read first: the word has 1,125 hits and they +take three different answers, most of them "leave it alone". + +⚠️ **The audit that follows in this handoff is still correct as *measurement* and +is now wrong as *conclusion*.** It ended "there is no sweep left to run", which +was true of the hausfold rename and is not true of this one. Kept in place +because the four senses it enumerates are exactly the distinctions §11 has to +respect — it is the right analysis with the wrong verdict attached, and §6's +first bullet is struck through rather than deleted for the same reason. The one +row of it that decision 10 actually reverses is the first. + +
The audit as written, before decision 10 + **The rename is done, and "drop nebelhaus" is not the step after it — it is the step this document spent §6 forbidding.** Asked at the end of the arc, the question is worth answering in full rather than by pointing at a bullet, because @@ -174,14 +191,16 @@ reason: | the surviving spelling | why it stays | |---|---| -| **nebelhaus, the desktop** | it's a product with an install command (`hausfold.co/nebelhaus.sh`), a `/desktops/nebelhaus` page and users. §6 | -| `inputs.nebelhaus.url`, `--override-input nebelhaus/…` | the input names the **desktop**, not the org or the layer. §10.0's last box — rename it and every override silently stops applying while still reporting success | -| `github.com/nebelhaus/*`, the dead org | shipped copies of pounce and perch hit `api.github.com/repos/nebelhaus/` to check for updates; only a live org redirects them. Kept alive forever, deliberately | -| `~/.local/state/nebelhaus`, `/Library/Application Support/nebelhaus/…`, `~/.cache/claude-worktrees/` | state paths and a two-repo contract (§6, §3.3 Tier D). Renaming one end breaks rice-install detection | +| ~~**nebelhaus, the desktop**~~ 🔄 **reversed** | it's a product with an install command (`hausfold.co/nebelhaus.sh`), a `/desktops/nebelhaus` page and users. §6 | +| `inputs.nebelhaus.url`, `--override-input nebelhaus/…` | the input names the **desktop**, not the org or the layer. §10.0's last box — rename it and every override silently stops applying while still reporting success. *(§11.2 moves it to `haus` and inherits that trap whole)* | +| `github.com/nebelhaus/*`, the dead org | shipped copies of pounce and perch hit `api.github.com/repos/nebelhaus/` to check for updates; only a live org redirects them. Kept alive forever, deliberately — **unchanged by decision 10** | +| `~/.local/state/nebelhaus`, `/Library/Application Support/nebelhaus/…`, `~/.cache/claude-worktrees/` | state paths and a two-repo contract (§6, §3.3 Tier D). Renaming one end breaks rice-install detection. *(§11.3 moves the first two to `haus` and defeats the contract with a symlink; the third stays)* | + +
-So there is no sweep left to run. The thing that *did* remain was **§10's tail**, -and re-measuring it today found two of its three items already closed by work -that never came back to update the note: +The thing that remained *before* decision 10 was **§10's tail**, and +re-measuring it today found two of its three items already closed by work that +never came back to update the note: - **§10.3 is history.** `bench relocate-haus` ran (the layer is at `./haus`), and the compatibility shim it left — the command, `repo_dir`'s `$ROOT/hausfold` @@ -3629,10 +3648,20 @@ Write these down or they get "fixed" by a later session: - **`nebelung`** keeps its name. It's a cat breed, its audience is the Catppuccin community, and renaming costs a 53-port catalog sweep for zero gain. -- **`nebelhaus`** keeps its name — as the **rice**. It loses its domain and its +- ~~**`nebelhaus`** keeps its name — as the **rice**. It loses its domain and its landing page, but it still needs a *page*: it's the developer-focused showcase and the first entry in `/desktops`. Don't let "no landing page" turn into "no - page" — `curl … /init.sh | bash` installs it, so something has to describe it. + page" — `curl … /init.sh | bash` installs it, so something has to describe it.~~ + 🔄 **Reversed 2026-08-14 (decision 10) — the desktop is `hacker` now.** The + *reasoning* above survives intact and is why the reversal is cheap: everything + it protected was the **page**, not the word. `/desktops/hacker` is still the + developer-focused showcase, still the first entry, still described. What + changed is the answer to a question this bullet never asked — *is `nebelhaus` + a good name for it?* — and the tell is the company it now keeps: `blank`, + `minimal`, `everyday` and `nebelhaus`, three of which say who they are for and + one of which is a private joke about fog. **§11.** ⚠️ Only the *desktop* takes + the name `hacker`; every other surviving `nebelhaus` becomes **`haus`**, which + is decision 8 reaching the places decision 8 declined to touch. - **`haus` the CLI** — unchanged, and now the namespace matches it. As of 2026-08-10 the *layer* is called `haus` in user-facing copy too (decision 8), which makes verb, namespace and name one word on purpose. `hausfold` stays @@ -3652,11 +3681,16 @@ Write these down or they get "fixed" by a later session: on Go's immutable proxy**. It is 60 imports across 23 `.go` files, it is nobody's API (the root module is a binary), and a change is a version-contract event for all five SDKs at once. Revisit only at a major bump. -- **`/Library/Application Support/nebelhaus/perch.installed-from`** — the rice - keeps its name, so this marker is correctly spelled. It is also a **two-repo - contract** (written by `nebelhaus/modules/perch/default.nix`, read by - `perch/Perch/Platform/UpdateCheck.swift:118`); renaming it in one repo makes - perch stop recognising rice installs. See §3.3's Tier D. +- ~~**`/Library/Application Support/nebelhaus/perch.installed-from`** — the rice + keeps its name, so this marker is correctly spelled.~~ 🔄 **Its premise died + with decision 10** — the desktop does *not* keep the name, and this path was + never the desktop's anyway: it is the **layer's**, so it becomes + `…/haus/perch.installed-from`. The rest of the bullet stands and is now the + *hard* part rather than a footnote: it is a **two-repo contract** (written by + `haus/modules/perch/default.nix`, read by + `perch/Perch/Platform/UpdateCheck.swift:118`), and renaming it in one repo + makes perch stop recognising desktop installs. §11.3 carries the migration + that lets both ends move without a flag day. See §3.3's Tier D. - **`~/.cache/claude-worktrees/`** — already historical, stays. - **Roadmap §5 bodies, commit messages, PR titles** — historical record. @@ -3770,11 +3804,14 @@ trust, not composition; see §4 and §5 are independent of each other and can run in either order once §3 is green. Everything else is strictly sequential. -**You are here (2026-08-14, night):** **§10 is closed too** — its checkout step -ran, its shim was retired (workshop#331), its lock and repo-description tails are -measured clean, and its gate re-runs green. The one rename item left anywhere is -`~/.config/nix/flake.nix:7`, which is 👤 and rides a rebuild. See the night -handoff for why "drop nebelhaus" is not the next phase. +**You are here (2026-08-14, night):** **§10 is closed** — its checkout step ran, +its shim was retired (workshop#331), its lock and repo-description tails are +measured clean, and its gate re-runs green. 🔄 **And a §11 opened the same +evening:** decision 10 drops the name `nebelhaus` — desktop → `hacker`, +everything else → `haus`. It is not a phase of the map below; like §10 it is a +decision that arrived after the plan was written. `~/.config/nix/flake.nix:7`, +§10.4's last 👤 line, is now §11.2's problem too — the input wants renaming, not +just re-pointing, so do both in one edit. **You were here (2026-08-14, late):** **§5.2 is ✅ and this document has no 🤖 work left in it.** The docs, the Worker, the `nebelhaus.com/*` 301s and the eight @@ -4009,3 +4046,151 @@ layer is at `./haus`, and `bench status` no longer *has* the fallback nudge to print (§10.3). ⚠️ The three bats cases the gate counts were deleted with the shim, so a future re-run reads 68-ish, not 71; the number was a snapshot, not an invariant. **§10 is closed** bar the single 👤 line in §10.4. + +--- + +## §11 — Dropping `nebelhaus` + +**Decided 2026-08-14, in conversation.** The desktop becomes **`hacker`**. +Everything else still spelled `nebelhaus` becomes **`haus`**. This reverses §6's +first two paragraphs, which are struck through in place rather than deleted — +the reasoning there was sound and is why the reversal is cheap. + +### 11.0 The three-way split — read this before touching anything + +🚨 **A blind `nebelhaus` → `hacker` sweep is wrong about seven times in ten.** +Measured 2026-08-14 across every checkout: **1,125 hits**, and they fall into +three groups that take three *different* answers. This is the same discipline +§2's banner asks for, pointed at a different word — read the hit. + +| what the hit means | becomes | how to recognise it | +|---|---|---| +| **the desktop** — `desktops/nebelhaus.nix`, `haus.desktops.nebelhaus`, `/desktops/nebelhaus`, `hausfold.co/nebelhaus.sh`, and the prose phrase "the nebelhaus desktop/rice" | **`hacker`** | it is one of four peers: `blank`, `minimal`, `everyday`, `hacker` | +| **the layer, still wearing the old coat** — `mkNebelhaus`, the 19 `NEBELHAUS_*` env vars, `~/.local/state/nebelhaus`, `~/.config/nebelhaus`, `/Library/Application Support/nebelhaus`, `nebelhausAccessibility`, the flake `description` | **`haus`** | it would be nonsense for a *desktop* to own it — a `HACKER_FLAKE` env var, or a state dir that `minimal` also writes to | +| **must not move** | **stays** | see the box below | + +🚨 **The do-not-touch list, which is most of the count:** + +- **`github.com/nebelhaus/*` and the dead org.** Shipped copies of pounce and + perch hit `api.github.com/repos/nebelhaus/` for their update check; only + a live org redirects them. This is §3's rule and decision 10 does not touch it. +- **holt's Go module path, `github.com/nebelhaus/holt`** — root *and* SDK. §6's + 🚨 stands unchanged and is the single largest block of hits (≈200): immutable + on Go's proxy, nobody's API, a version-contract event for five SDKs at once. + holt's test fixtures also use `nebelhaus` as an arbitrary repo name; that is a + fixture string, not this word. +- **`nebelhaus.com`** — the domain, already a 301 map (§5). A dropped *name* is + not a dropped *redirect*; the map must outlive the name it redirects. +- **`modules/renamed.nix`'s `nebelhaus.*` option aliases** (≈110 hits). They + exist so an external config written against the old namespace still evaluates. + Deleting them is a separate, later decision with its own trigger (§0.3's + compatibility-cleanup note), and decision 10 is not that trigger. +- **`~/.cache/claude-worktrees/`** — holt's, repo-agnostic, historical. §6. +- **Historical PR links, commit messages, and this document's own record.** + +### 11.1 The desktop → `hacker` + +Two repos, and the site half is already designed for it. `worker.js`'s own +comment predicted this exact change: *"The desktop is expected to lose the +nebelhaus name eventually; when it does, the new name is a new row and this one +stays as an alias. A published install command is the last thing on this site +that should ever 404."* + +**haus:** + +- `git mv desktops/nebelhaus.nix desktops/hacker.nix`, and rewrite its header + comment — it currently opens *"nebelhaus — the first desktop"*. +- `flake.nix`: the `desktops` attrset key, `mkNebelhaus`'s + `desktop ? ./desktops/nebelhaus.nix` default, the `description`, and the + `nebelhaus-*-ok` check derivation names. +- ⚠️ **`bootstrap.sh` should accept `nebelhaus` as a desktop name and resolve it + to `hacker`.** The site's alias row passes a pin, and the pin it passes has to + be one the installer still understands. + +**hausfold.co:** + +- `DESKTOPS` gains `hacker: { repo: "hausfold/haus", pin: "hacker" }`, and the + existing `nebelhaus` row **stays with its pin re-pointed to `"hacker"`** — the + URL keeps working and installs the same desktop under its new name. Leaving + the pin as `"nebelhaus"` is the bug to avoid: it would 200 at the Worker and + then fail inside bootstrap. +- `src/app/desktops/nebelhaus/` → `hacker/`, plus a `_redirects` row, the + catalogue row on `/`, and the sibling pages that name it. + +**workshop:** `bench`'s installer-audience string, and `web/worker.js`'s 301 rows +that land on `/desktops/nebelhaus` — those must re-point, or the old zone starts +costing two hops again (the thing §5.2 paid to avoid). + +### 11.2 The layer's leftovers → `haus` + +Pure code identifiers, and every one of them can carry a compatibility shim, so +none of this needs to be atomic: + +- **`mkNebelhaus` → `mkHaus`**, keeping `mkNebelhaus` as an alias. ⚠️ It is the + consumer's entry point, so without the alias this is the coupled + lock-bump-plus-config-edit that `bench ship` structurally cannot split. With + the alias it is three ordinary PRs in any order. +- **The 19 `NEBELHAUS_*` env vars → `HAUS_*`**, each falling back to the old + spelling. They are the *installer's*, which is why they go to `haus` and not + `hacker`: `NEBELHAUS_DESKTOP=minimal` is already a sentence that contradicts + itself. +- **`inputs.nebelhaus` in the consumer flake → `inputs.haus`.** 👤 file. ⚠️ + §10.0's trap applies with full force and in both directions: `bench`'s + `OVERRIDABLE` list and the input name must move **in the same change**, or + every `--override-input` silently stops applying while still reporting + success. That is the one edit in §11 that cannot be half-done. + +### 11.3 The on-disk state → `haus`, by symlink + +Three live locations, holding a tour stamp, media state, zen tabs, the elgato +host, the stylus announcement, `nebelung-ports.tsv`, the lane opener, the zen +policy marker and **perch's install marker**: + +``` +~/.local/state/nebelhaus → ~/.local/state/haus +~/.config/nebelhaus → ~/.config/haus +/Library/Application Support/nebelhaus → /Library/Application Support/haus +``` + +**The migration is: move the directory, then leave the old path as a symlink to +the new one.** One idempotent activation snippet per location. This is worth +stating as the design rather than the implementation detail, because it collapses +the one genuinely awkward dependency in §11 — the perch marker — from a +two-release contract into no contract at all: + +- Old perch binaries in the field read + `/Library/Application Support/nebelhaus/perch.installed-from` and **keep + working**, because the symlink resolves. +- New perch reads the `haus` path directly. +- Neither repo has to ship before the other, and nobody is mid-flight broken. + +Without the symlink this needs perch release *N* dual-reading and release *N+1* +before haus may stop writing the old path — three releases of coordination to +rename a directory. Take the symlink. + +⚠️ **Two things the snippet must get right:** it runs on a machine where the old +dir already exists *and* on a fresh install where neither does, and it must not +turn a real directory into a symlink loop on a second run. Guard on +"old exists and is not already a symlink". + +### 11.4 The prose tail + +pounce, perch, nebelung and trill hold ~90 hits between them and **almost all +are comments** — "the nebelhaus rice", "lockstep with modules/hush in the +nebelhaus repo". Cheap, mechanical, and they follow the §11.0 table like +everything else: a comment about the *layer* says `haus`, a comment about the +*desktop* says `hacker`. The only runtime string among them is perch's marker +path, which §11.3 covers. + +### §11's gate + +1. `rg -i nebelhaus` across every checkout returns **only** §11.0's + do-not-touch categories. +2. `bench try` builds; `nix flake check` on the Mac (the reach checks are + darwin-only and will not fire in CI). +3. `curl -fsSL https://hausfold.co/hacker.sh | head` serves the installer, and + `hausfold.co/nebelhaus.sh` **still** does — same script, `hacker` pinned. +4. `/desktops/hacker` is 200 and `/desktops/nebelhaus` 301s onto it. +5. On the machine, after activating: the three old state paths are symlinks, the + tour stamp still reads, and perch still reports *"Installed by the desktop"* + rather than offering to update itself. From 78704b9181ec6667ad3cf58e26a744173c5ac105 Mon Sep 17 00:00:00 2001 From: Julien Martel Date: Sat, 15 Aug 2026 00:40:33 -0500 Subject: [PATCH 4/4] =?UTF-8?q?rename:=20the=20workshop=20half=20=E2=80=94?= =?UTF-8?q?=20301=20destinations,=20bench,=20the=20router?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decision 10 (notes/hausfold-rename.md §11): the desktop is `hacker`. - web/worker.js: the three rows landing on hausfold.co's desktop page now point at /desktops/hacker/. The KEYS keep the old spelling — a redirect source is a fact about the past — but the destinations were re-pointed rather than left to chain onto hausfold.co's own /desktops/nebelhaus row. One hop is this file's whole reason to exist (§5.2); a chain is how it quietly becomes two again. - bench: the release audience for `haus` is hausfold.co/hacker.sh. - AGENTS.md: the terminology table's "nebelhaus bare … stays, forever (§6)" row is struck and re-pointed at §11, and the flake-input row got sharper rather than weaker — §11.2 moves the input to `haus`, but the input name and bench's OVERRIDABLE are ONE edit, because Nix doesn't hard-fail an override for an unknown input. - README: the "when this can be turned off" paragraph leaned on §6 to argue the domain outlives the desktop's name. The argument survives the reversal intact and is now made without it. Verified: web vitest 15/15, shellcheck bench clean, bats test/bench.bats 75/75. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QiRMS2Hcpo5svDKK9hpZa9 --- AGENTS.md | 8 ++++---- README.md | 8 +++++--- bench | 4 ++-- web/worker.js | 14 +++++++++++--- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6eebff1..73f5666 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -34,9 +34,9 @@ are independent git repos. > | spelling | what it is | this rename | > |---|---|---| > | `haus.