The auto-mode environment in the user-level settings.json had been generated
inside the hamr repo. It told every session on every machine that the trusted
repo was hamr only, and that the primary use was hamr's vectorization library.
It now describes the operator's actual scope:
- Trusted repos: checkouts under ~/development and ~/dotfiles with an origin in
the vh, pfi, corviduo or vastblue gitea orgs, or github.com/vh-pfi.
~/development/externs is explicitly untrusted, since it holds third-party clones.
- Service list: labelled fleet endpoints replace the transcript-derived contact counts.
- Unknown default branches are treated as protected.
- The allow-rule rationales no longer cite per-project occurrence counts.
- The legacy althing-listen CLI is dropped from the tool list.
Added (all now linked from their live locations):
- home_root/.claude/settings.json. The statusLine command now uses $HOME
instead of a Linux-only absolute path.
- home_root/.claude/bin/ratecheck and home_root/.claude/skills/australis-design.
- home_config/zsh/claude-config-dir.zsh and home_root/.local/bin/claude-config-dir-init,
the per-repo Claude Code login helper and its seeding script.
- home_root/.gitconfig and home_config/git/ignore.
- home_root/.zshenv, with the cargo env line guarded so boxes without rust start clean.
link-dotfiles --check reports drift without changing anything: tracked files whose
live copy is no longer a link (stow dry-run conflicts) and links into this repo
that dangle. Exits 1 on drift. Verified against a clean baseline and two planted
drifts, a detached .nanorc and a dangling link.
.mailmap maps every earlier identity to Vuong Hoang: the repo-local 'Your Name'
placeholder config (now removed), host-generated emails, and aider suffixes.
CLAUDE.md: the symlink warning now lists every linked file and points at --check.
README: documents what is and isn't tracked under .claude, the edit rule, and --check.
- thefuck: remove the empty home_config/thefuck dir left behind after 2026-06-26's
'drop thefuck'. Its ~/.config link, the ~/homebase venv that held only thefuck and
its deps, and the thefuck/fuck wrappers were removed from nh3-dev at the same time.
- aider: remove .aider.conf.yml and .aider.model.settings.yml. The only configured
backend was an Ollama qwq-32b endpoint, and the last session was 2025-03-21.
Repo-root aider session artifacts were deleted and the aider-chat uv tool was
uninstalled on nh3-dev.
- stow ignores: delete .stow-global-ignore and home_config/.stow-local-ignore. Their
patterns were tmux plugins (the tmux config is gone) and ~/-prefixed paths that
stow never matches, so they only displaced stow's built-in defaults.
- nvim: drop kickstart's vimtutor TEST file and upstream .github templates/CI.
- .gitignore: drop dead patterns (.config/*, /.aider*). Ignore per-machine zellij
layouts, and guard Claude Code credentials and settings.local.json.
Dangling ~/.tmux.conf, ~/.config/tmux and ~/.config/ohmyposh links were also removed on nh3-dev.
The hygiene pass (e960eda) dropped path=(~/.cache/lk-tools/fzf/bin $path) as
stale. On Linux boxes set up by lk-installers/install-apps it is the only thing
that puts fzf on PATH (install-apps vendors fzf there and relies on .zshrc to
add it), so fzf, fzf-tab and fzf-git broke in new shells. Restored behind an
existence guard, matching that commit's only-if-installed style, so boxes
without the vendored copy are unaffected.
Sources ~/.config/zsh/claude-config-dir.zsh when it exists. The helper drives
per-repo Claude Code logins through a .claude-config-dir marker file. The guard
leaves boxes without the helper unaffected.
Both files had been replaced in ~/.claude by detached real files (CLAUDE.md
around 2026-09-18, statusline-command.sh by 2026-09-16), so the repo copies had
gone stale while every session loaded the live ones. The live versions are
canonical and are now committed here, and ~/.claude links back into the repo.
CLAUDE.md changes that ride along with the re-sync:
- Operator identity: alias Prime, callsign Papa Romeo Mike. Legal, license
and git attribution stay Vuong Hoang.
- Miranda: the notification route to Prime (althing handle miranda), limited to
high-priority matters, plus sender conventions. Route verified 2026-09-24.
- Header warning: the file is a symlink into this repo. Never edit it with
sed -i or any temp-then-rename tool, which detaches the link.
Any URL handed to the operator that is worth more than the next thirty
seconds also goes on the standing link board via `booth link`, in the
same turn it is mentioned, in addition to appearing in the reply.
Links in chat drown in terminal scrollback; the board is a kept booth
(a .forever sentinel exempts it from the Booth's 24h sweep) rendered in
its own lane, so it outlives the session that produced it. Includes the
noise floor: if he would not click it a week from now, it stays off.
Two gaps kept the 🔔/🔕 monitor-armed indicator from ever showing:
1. The block keyed off $ALTHING_HANDLE, which is unset in the
statusline environment — so the handle was always empty and the
whole bell block was skipped. Resolve the per-project handle from
~/.althing/session_handles.json (keyed by the cwd Claude Code
passes on stdin), the same map `althing-cli use` writes.
2. Even with the handle resolved, the lock check covered only
wake-listener-$h.lock and light-monitor-$h.lock — missing
monitor-$h.lock, which is the lock `althing-cli monitor` (the
CC-native exit-0-re-arm loop) actually writes. Add it; the
kill -0 liveness gate already discards stale locks.
- .zshrc: gate bun/grok blocks on dir existence; use $BUN_INSTALL for
completions path (was hardcoded /home/lkraven); drop dead
lk-tools/fzf path entry
- zellij: remove autogenerated banner referencing a Linux backup path
- aider.conf.yml: trim to active settings (was 459-line sample dump)
erdtree (erd) replaces GNU tree as the tree-style directory lister. It uses
a parallel walker (the `ignore` crate, one thread per core) where GNU tree is
strictly serial. Benchmarked over 658k entries under ~/development, best-of-3,
warm cache, plain output, hidden included, gitignore off:
erd (16 threads) 2.35s
GNU tree 2.1.0 4.22s (1.8x slower)
erd (1 thread) 4.97s (so ~2.1x thread scaling)
eza --tree 15.87s (6.8x slower)
Three changes:
- home_config/erdtree/.erdtree.toml — erd ships as a disk-usage tool, so its
stock defaults are root-at-bottom, size-sorted, with a du column. The
top-level table overrides that to behave like GNU tree; `erd -c du` keeps
the original behaviour and `erd -c all` disables the gitignore/hidden
filtering. Stowed to ~/.config/erdtree.
- home_root/.zshrc — `alias tree='erd'`, plus ~/.zfunc prepended to fpath for
the generated completion. The fpath line goes before the primary compinit
at the top of the file rather than adding a third compinit call after it.
- lk-installers/install-apps — erd is now a runtime assumption of the
dotfiles (the alias depends on it), so a fresh box must get it: brew on
macOS, cargo on Linux (not packaged in Debian apt). The zsh completion is
generated per installed version rather than tracked, matching how the other
generated completions in this repo are handled.
Caveat worth knowing: erd respects .gitignore by default, which GNU tree does
not. `-i` disables it, `-.` shows hidden files.
The summarizer/classifier endpoint is now the 'summarizer' (+ 'summarizer-large') /
'classifier' alias backed by qwen3.6-35b-a3b-heretic (2026-07 GPU re-org), not
granite-4.1-8b. GLM family up to 5.2 (+ -reasoning/-turbo/-air) with gen-frontier ->
GLM 5.2; kimi now kimi-k3 / kimi-k3-gen-api. Added coder-fast, lfm2.5-2.6b, the Selene
judge, current rerankers, and ext-tts -> dots. Retired granite-4.1-8b and the
qwen3.5-9b-fp8 vision seat from the roster. Shared-key / paid-spend caveats unchanged.
Extend the secrets directive per operator (2026-08-11): store durable secrets in the
vault AND 'secret get' the creds a task needs from it rather than reading on-disk copies.
Custom Claude Code statusline: project/git, model, ctx%, session cost, and the
5h/7d usage limits with reset countdowns (all models, granular 1d2h/3h19m). Was
nh3-dev-only; now stow-managed like CLAUDE.md/CONTEXT.md/keybindings.json so a
fresh box picks it up. Live ~/.claude/statusline-command.sh symlinked into the tree.
~/.claude/CLAUDE.md was already symlinked into home_root/, but the rest of the user-level Claude
config was not. These two are static, hand-edited, and portable, so they belong with it — moved
into home_root/.claude/ and re-linked via stow. Verified: keybindings.json still parses, both
symlinks resolve.
Checked for secrets before moving. The only regex hits were false positives — "sortByTokens" in
keybindings, and glossary prose ABOUT API-key tiers and token-spend in CONTEXT.md. No credentials.
DELIBERATELY NOT TRACKED:
settings.json — Claude Code writes it during normal operation, and an app that replaces rather
than rewrites a file in place would silently destroy the symlink and strand the
repo copy. Needs a decision about that risk, not a quiet symlink.
hooks/ — empty.
everything else — runtime state, not config: projects/ (2.6G), remote/ (815M), file-history/
(467M), sessions/, cache/, shell-snapshots/, plugins/.
Note the skills tree is already version-controlled elsewhere: ~/.claude/skills/* symlink into
~/development/galdrabok/skills/, which is where the /snapshot canon the new CLAUDE.md section
points at actually lives.
Adds "## Persistent memory (`persistent-memory.md`)" to the global CLAUDE.md, placed directly
after the cognitive-load-reduction section because persistent memory is that mission's instrument:
it is what lets the operator re-enter a project without reloading its context.
Deliberately a POINTER, not a copy. The canon is the /snapshot skill
(~/.claude/skills/snapshot -> ~/development/galdrabok/skills/snapshot, version-controlled there);
the section says so explicitly and forbids restating it here or in a project CLAUDE.md, because a
second copy is a sync surface that drifts silently.
What it does carry is the four things a session needs BEFORE it loads the skill: read
persistent-memory.md at session start; check /tmp/<althing-handle>-handoff.md and its 1h staleness
rule; never bulk-read persistent-memory.d/; commit memory alongside the work. Plus the three-way
split (project CLAUDE.md / auto-memory / persistent-memory) with the redundancy test, because that
boundary is the one sessions actually get wrong.
Fleet state at time of writing: 48 repos carry persistent-memory.md, 18 carry persistent-memory.d/.
Stamped with the date so it reads as a snapshot rather than a standing fact.
The shared all-agents key entry claimed it was "scoped to free local models
only... deliberately can't spend z.ai cost." Per infra-ops (2026-07-25, in
the course of provisioning Kimi as Heid's 4th cross-frontier panel arm) that
was never actually true: the key already spent GLM/z.ai credits, and now
reaches kimi-k3 (Moonshot's coding-endpoint passthrough, added same day) the
same way. Corrected to state plainly that a paid-model call on the shared
key spends real vendor credits shared across every session holding it, and
that a project-scoped key remains available from infra-ops for isolated
spend tracking — no longer a technical requirement, just an isolation
option.
Add a fleet-tool entry for The Booth (nh3-dev :8090 ephemeral media board) so
any Claude Code session can surface A/B renders, smoke results, and audio/video
to the operator by dropping a folder in ~/booth-data.
title_bar.show_sign_in disables the sign in button, which is shown by
default and serves no purpose without a Zed account.
Panel layout: project, outline, collaboration and git panels dock to
the right; the agent panel docks left.
Icon theme changed from Zed (Default) to Material Icon Theme. Note
this requires the Material Icon Theme extension to be installed;
Zed falls back to the default icons if it is absent, so a fresh
machine linking these dotfiles will not error.
Brings the Zed configuration under dotfiles management, stowed to
~/.config/zed alongside the other home_config packages.
settings.json carries the Australis Dark theme selection, the
PFI-LiteLLM OpenAI-compatible provider, explicit default_model and
inline_assistant_model assignments, and the edit-prediction endpoint.
The model assignments are required: the Inline Assistant, git commit
message generation, and thread summaries each resolve their model
independently of the agent panel's UI selection, and report the
provider as unconfigured when neither setting is present.
themes/australis-dark.json is generated from the palette spec in the
australis repo (zed/build-theme.py there is the source of truth).
The prompts/ directory is deliberately left untracked. It is an LMDB
database with an active lock file, not user-authored content.
No credentials are included. The provider API key lives in the system
keychain, which is where Zed stores it; endpoint addresses are
internal RFC 1918.
The tracked theme had drifted from the palette source. Cursor and
selection values did not match wezterm/config.lua in the australis
repo, which the port is derived from:
cursor-color #51e08a -> #6388d8 (wezterm cursor_bg)
cursor-text absent -> #373b46 (wezterm cursor_fg)
selection-foreground #cce7ec -> #373b46 (wezterm selection_fg)
Neither #51e08a nor #cce7ec appears in the wezterm cursor or
selection configuration. All sixteen palette entries were already
correct and are unchanged; the drift was confined to cursor and
selection. Also restores the header comment citing the upstream
source.
Add a global conversational-register section to CLAUDE.md: ~6/10 warm
register, occasional load-bearing profanity, opinions-led, affect on top
of substance. Banter leans non-technical with the technical as an
addendum, mirroring the existing /elitk detail habit. Scoped to
conversation only — committed artifacts (commits, contracts, ADRs,
findings, althing ships) stay professional and technical.
Adds a default-posture paragraph to the althing async-reply monitoring
section: unless a session says otherwise, every session attempts to keep
its althing monitor armed for the session's duration (arm early, re-arm
after each fire, stay armed even without a pending reply). Reconciles the
Scope paragraph so it no longer instructs sign-off after each exchange.
Forces the web pilot to VictorMono NF for ligatures. Resolves against
the client device's installed fonts (no @font-face serving like the
ttyd seat), so each device needs the font installed locally.
- setopt interactive_comments: inline `#` comments at the prompt, so
pasted commands with comment tails don't error (matches script mode)
- bun: completions + BUN_INSTALL bin on PATH (installer-appended)
- grok: bin on PATH + zsh completions fpath (installer-appended)
Global versioning questions now resolve against
corviduo-project-template/docs/VERSIONING-POLICY.md (self-pinned
versioning-policy-v1); the SemVer etiquette section is declared as
the Corviduo cadence layer on top — it wins on cadence/tier choice,
the policy wins on format, contract semantics, pre-release staging,
and release mechanics.
Replace the ASCII git VCS markers with Nerd Font glyphs:
branch , detached-HEAD commit , and a distinct staged /
unstaged / untracked breakdown (each with its count) in place
of the single '*' dirty marker; behind/ahead use / arrows.
Drop the old CONTENT_EXPANSION (hard-coded the literal arrows and
stripped all spacing for the collapsed design) and the ahead/behind
MAX_NUM=1 cap so real commit counts show. Glyphs use \uXXXX escapes
beside naming comments for auditability; all sit in the core Nerd
Font range covered by VictorMono Nerd Font Mono.
fastfetch is the maintained successor to neofetch (removed from Homebrew).
macOS installs it in the main brew list; Linux installs it best-effort with a
neofetch fallback for older distros. README tool list updated.
Context segment already sat left of the time segment but was hidden in the
local (DEFAULT) state. Show the hostname there: grey when native, yellow with
an explicit ' ssh' tag when remote (p10k's REMOTE state detects SSH for free).
Only the local-sudo state stays quiet.
Fold macinstaller + install-apt-pkgs + install-tools + install-zellij into a
single host-aware lk-installers/install-apps (macOS->Homebrew, bootstrapping
Homebrew if absent; Linux->apt + upstream installers). Installs the tools the
configs assume (bat, fd, fzf, zoxide, zellij, nvim, btop, htop, tldr) plus the
fzf-git.sh helper and fzf shell integration; idempotent.
link-dotfiles gains --apps to install then link in one shot. .zshrc drops the
redundant brew/system zsh-autosuggestions source (zinit already loads it),
fixing the missing-file error on a fresh box. README documents the new flow.
The repo carried an empty home_config/ghostty/config; the actual working
config (Victor Mono Nerd Font, australis theme, ssh-terminfo, scrollback,
macOS option-as-alt) lived only on the machine. Pull it in so stow links
the real config instead of blanking it.
- zsh prompt: replace oh-my-posh with powerlevel10k via zinit, with the
instant-prompt preamble near the top of .zshrc for fast startup
- remove thefuck/thefk entirely: .zshrc aliases, install-thefk,
home_config/thefuck, and its .stow-global-ignore entry
- link-dotfiles: one-shot host-aware bootstrap — detect macOS vs Linux,
install GNU stow if missing (brew / apt/dnf/pacman), then stow both trees
- retire oh-my-posh: delete the bash + pwsh installers and
home_config/ohmyposh (starship covers PowerShell separately)
- README: document the new bootstrap and prompt setup
Record Vuong Hoang's name + roles (Founder/Principal Developer/Chief
Systems Architect of Corviduo AI and PhaseFinal, Inc; Partner + Chief
Systems Architect at VastBlue AI) so identity surfaces in every Claude
Code session, not just brokkr-smithy's per-project auto-memory.
New "## Roadmap discipline" section in the global CLAUDE.md: every project
carries a ROADMAP.md (v1 target = 3-7 capabilities + parking lot; the
feature-gate defaults to parking lot regardless of who proposed the
feature; creep-check at checkpoints). The feature-axis analog of
value-of-information (probes) + patch-default (SemVer). Per-project file
defined as a skeleton in corviduo-project-template.
LiteLLM Global-tools entry: frame granite-4.1-8b as the standing
always-available local summarizer/classifier endpoint (FP8, ana-ml2 GPU1,
131k ctx); add qwen3.5-9b-fp8 (vision) to the gateway listing; document the
shared all-agents virtual key (alias all-agents-local) scoped to the free
local models only (granite/vision/embed/rerank; paid GLM walled off).
Internal-only gateway, rotatable.
Global Claude Code preferences (symlinked from ~/.claude/CLAUDE.md, like
the other home_root dotfiles). Includes the new 'Global tools available'
section documenting box-wide Playwright/Chromium on nh3-dev.
The "Mono" variant squeezes glyphs into single cells, distorting Victor
Mono's cursive italics (bad kerning). Switch to "VictorMono Nerd Font"
to match the WezTerm config, which renders italics correctly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>