himmel keeps work moving with a few loops: AFK (unattended) runs and scheduled jobs that keep everything fresh. How one change travels from a supervisor session's dispatch to a merged pull request has its own page, the development graph. Its graphs map the code so sessions can find their way. Change a setting on the right and see which loop it touches.
Where settings live
Settings are moving out of .env into a config file you can read and track. Each setting below carries a tag that names where it lives in this new layout.
himmel.confnew layout
Everyday settings
Plain KEY=value lines in ~/.himmel/himmel.conf. If you run the companion vault, the file is tracked there through a symlink, so your settings follow you between machines. A himmel.conf.local file beside it overrides it for one machine.
policynew layout
Gate policy
Three settings decide how strict the review and merge gates are. They live under policy in ~/.himmel/config.json, a file the agent cannot write. The environment cannot override them, so a session cannot loosen its own gates.
.env
Secrets only
API tokens and credentials, such as JIRA_API_TOKEN. Nothing else belongs here in the new layout. A few runtime switches, like the graph refresh backend, stay plain environment variables.
Who wins, highest first:environment→himmel.conf.local→himmel.conf→.env (older installs)→built-in default
The loop explorer
Pick a loop, then change a setting. Steps that change light up, and the box under the settings says what happened in plain words.
runs on its own
you start it
waits on a gate
not running
cannot pass with these settings
relaxed: skipped on purpose
Each loop below shows who does every step at the default settings a fresh install has. With scripts enabled, this becomes an explorer where changing a setting lights up the steps it changes. For how one change travels from dispatch to merge, see the development graph.
AFK modeAn unattended AFK shift
/afk-shift fans a fixed list of well-scoped tickets out to agents inside one session while you sleep. HIMMEL_AFK switches which steps run without asking. source: afk-mode
1
Queue lockone run per queueon its own
Taken first, so a second launch on the same queue stops instead of doubling the work.
2
Ticketstart from onegate
Every commit subject and pull request title carries its ID; the commit-message gate refuses one without it. Extend an existing ticket before filing a new one.
3
Planfrom the briefon its own
A written plan for the ticket, committed beside the handover.
4
Implementagentsyou
HIMMEL_AFK is off: the afk initiative profile is not active.
5
Review/pr-checkyou
The free tier runs; with no free critic configured it falls back to the codex critic where that lane is set up, else a Claude review.
6
Fix and re-reviewuntil cleanon its own
Review rounds repeat until no critical finding is left.
7
Pull requestopenedyou
Waits for you.
8
CodeRabbiton the pull requestgate
Reviews the pull request once it opens and posts threads and a commit status. Every thread it posts must be resolved before the merge: fix it, or reply with why and resolve it.
9
Review gateat the headgate
Waits until every hard reviewer (codex) passes at the head and no reviewer has an open finding.
10
CI releaseci:go, plannednot running
Planned, opt-in per repository. Not opted in: CI runs on every push, as today.
11
Mergeprivate repoyou
Not enabled: the run stops at the pull request. With ARMAUTOMERGE off, merge-on-green refuses, so a merge is a plain squash merge.
12
Close tickettrackeryou
A merge does not close the ticket by itself: if the pull request finishes it, you move it to Done.
13
Handovernext sessionyou
Writes the next session’s brief and files follow-up tickets.
Scheduled jobs Scheduled jobs
Each job is a crontab entry or scheduled task that you arm on purpose. Nothing arms itself, and the installer only offers the jobs whose requirement holds. source: cadence-registry.json
1
doctordailyyou
Daily health check. Reports only, fixes nothing. Always offered.
2
upstream-watchdailyyou
Scans himmel’s open upstream pull requests and issues; notifies only on a change. Always offered.
3
drift-fixnightlyyou
Bumps pinned dependencies and opens an ordinary pull request. Never merges. Always offered.
4
pipelinedaily + weeklynot running
Offered only when you run a companion vault.
5
qmddailynot running
Offered only when you run a companion vault.
6
graphmaphourlynot running
Offered only when you run a companion vault.
7
vault-stallevery 15 minnot running
Offered only when you run a companion vault.
8
pull-cadencedailynot running
Offered only once GOOGLE_HEALTH_REFRESH_TOKEN is set.
Graph refresh Keeping the code graph fresh
Part of the graphmap job. A dedicated worktree does the refresh, so the checkout you work in is never switched or dirtied. source: graph-cadence internals
1
Structural passhourly :15not running
graphmap is offered only with a companion vault. Re-parses the code; costs nothing.
2
Measureevery 6 h :35not running
graphmap is offered only with a companion vault. Counts the commits on main since the graph was built.
3
15 behind?else skipnot running
Below 15 commits it records a skip and stops. The threshold is fixed in the script, not a setting.
4
Publish PRchore branchnot running
Opens or refreshes a pull request with the new graph. Never a direct push.
5
Merge on greenmerge-on-greennot running
merge-on-green refuses without ARMAUTOMERGE; the pull request waits for you.
6
Semantic passweeklynot running
graphmap is offered only with a companion vault. With claude-cli (Sonnet): draws on your Claude subscription usage budget and skips itself when the budget is nearly spent. GRAPH_CADENCE_SEMANTIC_BACKEND applies when the refresh runs with its semantic step.
7
Ledgerone line per runnot running
Every run appends what it did (skipped, refreshed, published, merged or failed); the doctor surfaces failures.
Settings what each one changes
HIMMEL_INITIATIVE
Which steps a session runs without being asked once work is finished and verified. "all" means review, open the pull request, move the ticket and write the handover. Merging is never in the default set.
TICKET_ID_REQUIRED
Whether every commit subject must carry a ticket ID. Set it to 0 if you do not track work in a tracker.
HANDOVER_DIR
Where session handovers are saved. Unset keeps them in the repo’s handovers/ folder; a path points at a separate state repo that outlives any one clone.
HIMMEL_WORKTREE_NUDGE
A gentle reminder to start a worktree before editing. Editing on main is refused either way.
CR_PROFILE
Which critics review your diff in /pr-check. "none" is Claude only and spends nothing outside your plan; "paid" runs the codex panel. A missing critic never means no review: Claude reviews the diff itself.
CR_CLAUDE_AGENTS
Adds a fan-out of Claude reviewer agents inside /pr-check.
CR_REQUIRE_CROSS_MODEL
Gate policy. When on, the review-owed marker clears only after a critic from a different model family has passed the exact commit, so a Claude-only review is not enough.
CR_FLOOR_FALLBACK
Gate policy. With the cross-model rule on, "claude-only" lets a fresh Claude review with no shared context stand in when every other critic is out of quota. It is never counted as cross-model.
codex mode
The codex critic’s row in critics.json. As shipped it is hard and required: it must pass at the head, and absent on a machine it still counts, as unavailable, which holds the merge.
claude mode
The Claude API critic’s row. As shipped it is hard, but absent while the Claude API lane is off, so it leaves the set. Change any mode for one machine in critics.local.json.
coderabbit mode
The CodeRabbit app’s row. As shipped it is best-effort: an open thread holds the merge, but a missing or rate-limited review is relaxed to a NOTE. Absent means the app is not armed here.
review
Set "review": "no_code_review" in critics.json to say on purpose that no reviewer gates this repo, so CI alone decides. Without it, a set with no hard reviewer left is a config error and the gate refuses.
CodeRabbit right now
Not a setting: try what a rate limit does. A best-effort CodeRabbit is relaxed and the head moves on; a hard one holds the merge.
CI release
Planned, opt-in per repository. The heavy CI jobs wait for the ci:go label, which the station adds once the review gate passes at the head. Off, CI runs on every push. It never lets anything merge.
HIMMEL_AFK
Switches sessions to the afk initiative profile, read from HIMMEL_INITIATIVE_AFK instead of HIMMEL_INITIATIVE.
HIMMEL_INITIATIVE_AFK
The afk step list. "all" adds implementing and merging to the daytime set. It has no effect unless HIMMEL_AFK is on.
ARMAUTOMERGE
Gate policy. Arms merge-on-green, the one merge path that waits for green CI and confirmed branch protection. Off, merge-on-green refuses.
companion vault
Your installer answer about a second-brain vault. The vault jobs (pipeline, qmd, graphmap, vault-stall) are offered only with one.
vm.mode
Where steps that need proof on a test VM run: the local VM, a remote one over ssh, or none. With none, arming a VM-gated job needs your explicit pick as an acknowledgement.
graphmap
Arming this job runs the hourly structural refresh, the weekly semantic refresh and the 6-hourly publish of himmel’s own graph.
GRAPH_CADENCE_SEMANTIC_BACKEND
Which model does the graph refresh’s semantic step: claude-cli (default, uses your subscription usage budget) or ollama (local GPU). Any other value is refused before work starts.
A graph here is a map of a body of text or code: every file, function and idea is a node, and the links between them are edges. Sessions ask the graph how things connect before they search file by file.
The code graph
himmel's own map, stored in graphify-out/graph.json. It groups the code into communities and marks its hub nodes, the files many others depend on.
Ask it: graphify query "…" or graphify explain "…".
A free structural pass reads the code itself. A weekly semantic pass has a model add meaning.
A refreshed graph reaches main only through a pull request that merges on green.
The vault graph
The same tool run over your companion vault, if you keep one: notes, clips and daily entries linked by topic. This graph stays on your machine and is not committed.
Structural pass daily at 00:05; semantic pass weekly, Sunday 13:00.
Search finds content; the graph explains how it hangs together.
The flow diagrams
Drawn by hand, not generated: how one change travels from your editor to main, what fires on every tool call, and how work is routed to other models.