2026-02-01T20:58:49Z - 2026-08-01T20:58:49Z
Overview
136 pull requests merged by 2 users
Merged
#160 make: add root install/up/down for the local stack
Merged
#159 promote: main → release (jinemi registry namespace, Caddy trusted_proxies, CI login fix)
Merged
#158 promote: dev → main (doc accuracy pass, runner unit fix)
Merged
#157 forgejo: make the desktop runner unit restart-always, fix the vps2 config path
Merged
#156 docs: correct file references and the dev reachability claim
Merged
#152 promote: dev → main (Forgejo on dev.jinemi.com; jinemi registry namespace)
Merged
#155 build-push: drop the empty ${{ }} that silenced the registry login
Merged
#154 build-push: stop a whitespace-tainted REGISTRY_TOKEN failing as "denied"
Merged
#153 forgejo: record why the runner is on vps2, rather than leaving a contradiction
Merged
#150 registry: move image and repo references to the Jinemi namespace
Merged
#151 forgejo: make dev.jinemi.com canonical (ROOT_URL and OAuth callback)
Merged
#148 forgejo: serve dev.jinemi.com alongside git.thermograph.org
Merged
#145 lb: trust the host Caddy's X-Forwarded-Proto
Merged
#149 openbao: make verify-parity --all host-aware
Merged
#147 infra-sync: render /etc/centralis.env from the vault
Merged
#143 openbao: make the parity gate actually work, and run it nightly
Merged
#141 ci: add an always-on Actions runner on vps2
Merged
#132 promote: main → release
Merged
#140 down-merge release into main (unblocks the prod promotion)
Merged
#139 promote: dev → main
Merged
#137 secrets: make the two-host age key quorum a checked policy
Merged
#138 rotate Contabo S3 credentials
Merged
#133 feat/openbao-centralis-renderer
Merged
#131 promote: dev → main
Merged
#130 openbao: add a dormant OpenBao backend alongside SOPS
Merged
#128 forgejo: restart the db service on a clean exit, not just on failure
Merged
#127 promote: dev → main (sign in with Google; shared OAuth engine)
Merged
#122 accounts: sign in with Google, on a shared provider-agnostic OAuth engine
Merged
#126 docs: the orchestrator runbook and the module map
Merged
#125 promote: dev → main
Merged
#124 db: raise max_connections to 200, cap work_mem at 64MB, trim async pool overflow
Merged
#123 promote: dev → main (bookmarks fixes: SSR script tag, phantom save at cap)
Merged
#121 bookmarks: don't fabricate a local save when the server rejects it
Merged
#120 frontend: load bookmarks-ui.js from the Go SSR home template too
Merged
#119 promote: dev → main (location bookmarks)
Merged
#117 bookmarks: account-synced saved locations API
Merged
#116 promote: dev → main (sign in with Discord)
Merged
#115 accounts: sign in with Discord, sharing the existing link callback
Merged
#114 promote: dev → main
Merged
#113 dev: leave /healthz outside the basic-auth boundary
Merged
#112 promote: dev → main (dev behind basic auth at dev.thermograph.org)
Merged
#111 dev: serve at dev.thermograph.org behind basic auth, bound to loopback
Merged
#110 promote: dev → main (cutover fixes: sync-dev guard, owner-db hardening, post-deploy gate)
Merged
#109 deploy.sh: honour TG_POST_DEPLOY on the compose path too
Merged
#108 provision-env-db: revoke PUBLIC connect on the owner database too
Merged
#106 promote: dev → main (vps1/vps2 estate split)
Merged
#107 infra-sync: refuse to render dev's vault onto a host that is not dev
Merged
#103 infra: split the estate into vps1/vps2 — beta joins prod, dev gets a home
Merged
#105 promote: dev → main (Weekly UTC-today date fix)
Merged
#104 fix(frontend): Weekly view must always send an explicit date to /grade
Merged
#101 promote: main → release
Merged
#100 promote: dev → main
Merged
#99 frontend: fix the three inconsistencies the onboarding guide found
Merged
#98 docs: add a developer onboarding guide for the monorepo
Merged
#97 promote: dev → main (alert template: omit empty value line)
Merged
#96 alerting: don't print a bare "value:" when ValueString is empty
Merged
#95 promote: dev → main (alerting liveness rules onto the app heartbeat)
Merged
#94 alerting: base web/worker liveness on the app heartbeat, not container stdout
Merged
#93 promote: main → release
Merged
#90 promote: dev → main (CI consolidation, 15 workflows → 9)
Merged
#92 climate: stop dropping the current day from the Open-Meteo bundle
Merged
#91 Merge main back into dev to reconcile the squash-promotion divergence
Merged
#87 ci: collapse the eight deploy and build-push workflows into two
Merged
#86 promote: dev → main (context layer, enforcement hooks, runner PATH)
Merged
#85 infra: mirror LAN dev secrets under $HOME for snap-confined Docker
Merged
#82 guardrails: enforce live-host and secrets policy with hooks
Merged
#81 docs: rewrite the agent context layer to match the live system
Merged
#84 infra/forgejo: give the LAN runner's PATH ~/.local/bin
Merged
#83 promote: dev → main
Merged
#80 web/worker: add a process-level liveness heartbeat
Merged
#79 Promote main to release: vault consolidation, dev + Centralis vaults
Merged
#78 Promote dev to main: dev + Centralis vaults
Merged
#77 secrets: vault dev and Centralis; render dev without common.yaml
Merged
#76 Promote dev to main: vault consolidation + renderer fail-closed
Merged
#75 secrets: factor shared values into common.yaml; stop the renderer failing open
Merged
#74 Promote main to release: NASA retirement
Merged
#73 Promote dev to main: NASA retirement
Merged
#72 Retire NASA POWER from every serving path
Merged
#71 Promote dev → main (frontend QA batch → beta)
Merged
#70 Frontend QA batch: date/TZ, https origin, date-422, VAPID rotation, trace-precip, partial-day gate
Merged
#69 key-gaps: the key regex was blind to digits, inventing missing secrets
Merged
#65 Promote main to release: MET forecast coverage gate
Merged
#64 Promote dev to main: MET forecast coverage gate
Merged
#63 Gate MET forecast days on diurnal sample coverage
Merged
#61 Promote main to release: first alerting + Postfix supervision
Merged
#60 Promote dev to main: first alerting + Postfix supervision
Merged
#58 observability: add the estate's first alerting; supervise Postfix
Merged
#57 Promote dev to main: off-box encrypted backups
Merged
#14 Off-box encrypted backups to Contabo Object Storage
Merged
#53 Promote main to release: geocode P0 fix + ops tooling + privacy logging
Merged
#52 Promote dev to main: geocode P0 fix + ops tooling + privacy logging
Merged
#51 data/climate: fix geocode_nominatim's NameError on every call (P0, live)
Merged
#50 render-secrets: drop the RETURN trap, it broke deploy silently
Merged
#23 ops/iceberg.sh: read-only Iceberg lake queries across all environments
Merged
#49 Pre-warm the SEO content derived-store off-request
Merged
#48 Check derived store before loading history on content routes
Merged
#47 Add cheap, stable content-page cache token
Merged
#18 ops/dbq.sh: read-only Postgres queries across all environments
Merged
#35 Stop logging /healthz + internal SSR hop, truncate logged IPs
Merged
#46 Promote main to release: Iceberg-backed lake query
Merged
#45 Promote dev to main: Iceberg-backed lake query
Merged
#44 Lake /query reads era5_daily through Iceberg metadata
Merged
#43 infra/forgejo: raise LAN runner concurrency to 8
Merged
#42 Promote main to release: daemon roll + Iceberg-backed lake query
Merged
#41 Promote dev to main: daemon roll + Iceberg-backed lake query
Merged
#40 Roll the daemon with backend deploys in the Swarm stack
Merged
#38 infra/forgejo: add resource limits and a leaner CI job image
Merged
#37 frontend: fetch City() concurrently with the page's primary API call
Merged
#36 Log hygiene: Alloy CPU, Loki chunks/limits, Caddy field-stripping
Merged
#33 deploy.sh: fix the daemon-binary probe, which always dropped daemon
Merged
#32 Promote main to release: lake extension bake + daemon healthcheck fixes
Merged
#31 Promote dev to main: lake extension bake + daemon healthcheck fixes
Merged
#30 Fix lake extension bake user; disable the daemon healthcheck in the stack
Merged
#29 Promote main to release (deploy prod): ERA5 lake stack + Go daemon
Merged
#28 frontend: rewrite the SSR content service in Go
Merged
#26 Promote dev to main (deploy beta): ERA5 lake stack
Merged
#27 Reconcile: merge main (shellcheck, Go daemon) into dev
Merged
#24 Iceberg conversion container for the ERA5 lake (infra/lake-iceberg)
Merged
#25 Own /state in the image; lake cache degrades instead of failing
Merged
#21 daemon: move the Discord gateway and scheduler out of the web process into Go
Merged
#22 Survive Contabo PUT throttling in the lake extractor
Merged
#20 Run the ERA5 lake service in every environment
Merged
#19 shell: add shellcheck CI guard and drive the tree to zero findings
Merged
#17 Parallelize lake tile uploads
Merged
#16 Vault the ERA5 lake bucket credentials (prod)
Merged
#15 ERA5 lake: bucket-hosted history primary + SQL indexer service
Merged
#13 Reconcile: merge main back into dev
Merged
#12 Promote main to release (deploy prod): Open-Meteo migration
Merged
#9 Promote dev -> main (deploy beta): Open-Meteo migration (Phases 0-4)
Merged
#2 Phase 4: value-drift check (Open-Meteo kept as dormant fallback)
Merged
#8 Promote main to release (tag-keying remainder)
Merged
#7 Promote dev to main (tag-keying remainder)
Merged
#6 Finish the domain-sha tag keying: three deploy workflows were missed
Merged
#5 Promote main to release (domain-sha tag keying)
Merged
#4 Promote dev to main (domain-sha tag keying)
Merged
#3 Key image tags to the last domain-touching commit, not the branch tip
9 pull requests proposed by 1 user
Proposed
#34 Design: approximate location from client IP (feature-flagged off, decisions needed)
Proposed
#39 WIP: Editorial city copy for 83 city/record pages
Proposed
#59 daemon: let the conversational agent own @mentions in server channels
Proposed
#62 discord: resolve the city people actually typed
Proposed
#88 Testing plan wave 0: close two live defects, hard-block outbound sends, gate the prod path
Proposed
#102 narrative: precomputed plain-English day summaries
Proposed
#118 bookmarks: map + account UI for saved locations
Proposed
#129 WIP: openbao: add a dormant OpenBao backend alongside SOPS
Proposed
#144 secrets: validate CENTRALIS_TEAM at render time, like CENTRALIS_TOKENS
6 issues closed from 1 user
Closed
#55 climate_sync silently dead-letters cells: 4 never recent-synced, 6 with zero derived rows, 39 stale >24h - nothing retries, nothing reports
Closed
#56 ERA5 Iceberg lake is unqueryable in both prod and beta - "is the ERA5 ingest current?" cannot be answered by any means
Closed
#66 Recent/forecast grade window has date gaps and boundary-row artifacts (missing 07-22/07-23, future-dated rows, spurious 100th-pct boundary lows)
Closed
#68 Discord conversational agent can't emit real @mentions (posts literal "@username" text instead)
Closed
#67 Discord bot narrates future-dated forecast rows in the past tense
Closed
#54 No alerting on prod 5xx: 87 errors in 24h (incl. 5x /healthz, 5x homepage) went entirely undetected
8 issues created by 1 user
Opened
#54 No alerting on prod 5xx: 87 errors in 24h (incl. 5x /healthz, 5x homepage) went entirely undetected
Opened
#55 climate_sync silently dead-letters cells: 4 never recent-synced, 6 with zero derived rows, 39 stale >24h - nothing retries, nothing reports
Opened
#56 ERA5 Iceberg lake is unqueryable in both prod and beta - "is the ERA5 ingest current?" cannot be answered by any means
Opened
#66 Recent/forecast grade window has date gaps and boundary-row artifacts (missing 07-22/07-23, future-dated rows, spurious 100th-pct boundary lows)
Opened
#67 Discord bot narrates future-dated forecast rows in the past tense
Opened
#68 Discord conversational agent can't emit real @mentions (posts literal "@username" text instead)
Opened
#142 Saved locations only accessible in Weekly tab
Opened
#146 Incorrect units on humidity in recent & 7-day forecast table