Commit Graph

131 Commits

Author SHA1 Message Date
admin 9cfa619ec3 hub v0.74.0: allow local_api_endpoint_drift; R-77 docs + R-78/79/80
The allowlist entry is REQUIRED, not cosmetic: handleEvent 400s an unknown
event_type, so controller v0.173.0's new drift alert would be silently inert
without it. Shipped with the controller that emits it.

Docs:
- RUNBOOK-local-api-endpoint-drift.md — how to repair a drift, including the
  step everyone will want to skip (establish which value is CORRECT from what
  the agent is actually bound to, rather than assuming bootstrap.json wins) and
  what success looks like (SILENCE, not a "recovered" line, because a fresh
  controller's healthy first observation is not logged). Records both
  2026-07-26 repairs.
- ROADMAP: R-77 shipped; R-78 the local_api authority ruling, with the
  clobber-a-working-channel risk spelled out in BOTH directions so it is not
  resolved opportunistically; R-79 the whole-surface English-strings sweep;
  R-80 expected_backup_missed, flagged as likely outranking R-77 because 7.3
  days of stale backup materially exceeds the ~1.5-day channel outage, so the
  causal link the DIAG hedged on cannot be the whole story.
- Capability map: note against the drive-wizard row (every agent-backed
  capability rides this channel) that a silent drift class is now detected.
  NO row status flips — detection is not prevention.
2026-07-26 09:14:40 +02:00
admin 5902703dda hub: deploy v0.73.1 (allowlist disk_health_degraded) 2026-07-24 21:38:13 +02:00
admin eaa8eddf66 chore(manifests): hub 0.72.0 -> 0.73.0 (offsite_stale newborn anchor)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKSN3gSg4TKVBBqkwW2djR
2026-07-23 13:26:19 +02:00
admin 92681bda6c chore(manifests): hub 0.71.0 -> 0.72.0 (R-70/R-71c delivery detector train)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKSN3gSg4TKVBBqkwW2djR
2026-07-23 13:00:56 +02:00
admin f1da17131b manifests: hub 0.70.1 -> 0.71.0 (notification train) 2026-07-22 20:58:35 +02:00
admin 068bce673c chore(manifests): hub image 0.70.0 -> 0.70.1 2026-07-22 09:24:42 +02:00
admin 9b3381be0a feat(hub): v0.70.0 — a deleted customer actually disappears (residue leg + ghost cleanup)
Found validating v0.69.0 against the live hub. demo-vm-felhom was deleted
on 07-18 and was still on the Customers list AND still raising offsite_stale
(10 events, latest 07-21 17:34, operator email at 19:34) — because
GetCustomers() is report-derived and no lifecycle tier ever deleted a report.

New leg 3 (residue), before the record purge: reports, app_telemetry,
app_log_tails, log_tail_requests, customer_notifications, plus the
credential-bearing appliance_registrations and selfbind_tokens. Audit
(events, notification_log) and F-14 provenance still survive.

Ghost customers are now deletable: 404 means "nothing here", not "no config
row". With no config row the offsite descriptor is unknowable, so the Hetzner
and descriptor legs record skipped_no_config rather than a bare "skipped".

Two more red-proofs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J55BQE1gE2V4ffud5jweGS
2026-07-21 20:28:06 +02:00
admin 5dcb72a542 chore(manifests): hub 0.68.1 -> 0.69.0 (R-25b delete cascade)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J55BQE1gE2V4ffud5jweGS
2026-07-21 19:32:47 +02:00
admin 4da74700c9 manifests: hub 0.68.0 -> 0.68.1 (Configuration layout fix) 2026-07-21 10:35:31 +02:00
admin e671ba3fd1 manifests: hub 0.67.0 -> 0.68.0 (R-39 fleet fix + R-50b(a)) 2026-07-21 10:13:40 +02:00
admin 4529922e6d manifests: hub 0.66.0 -> 0.67.0
Deploys hub v0.67.0 (auto-minted self-bind link, post-RESET staleness banner,
unprovisioned-offsite warning, pbsdr_reissued flash text). The manifest is the
truth — the code push and image build deploy nothing until this tag moves.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nn3VgQk9iwEGgyx6QJ2NvE
2026-07-18 21:46:56 +02:00
admin ce1e9c64e0 manifests: hub image -> 0.66.0 (customer self-bind, R-27 slice 1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qDiBqKKQ5vPB5fXBqu7Kp
2026-07-17 23:58:32 +02:00
admin ab91e49107 manifests: hub 0.64.0 -> 0.65.0 (PBS DR visibility + offsite tabs + dual gauges, R-5) 2026-07-17 21:16:04 +02:00
admin 66da0c44d5 manifests: hub 0.63.0 -> 0.64.0 (offsite pool-box aggregate, R-5) 2026-07-17 20:17:11 +02:00
admin 587fcc27ca manifests: hub 0.62.0 -> 0.63.0 (system-initiated immediacy: poke + intent bump at every mutation site) 2026-07-17 17:36:14 +02:00
admin 9964ae6fd4 manifests: hub 0.61.0 -> 0.62.0 (R-21 slice C appliance registration) 2026-07-17 15:08:50 +02:00
admin e144c5e491 manifests: hub 0.60.1 -> 0.61.0 (Customer RESET) 2026-07-17 13:10:45 +02:00
admin 6b1fbca51d hub: bump manifest image tag to 0.60.1 (host-delete escrow demotion) 2026-07-17 11:26:47 +02:00
admin f7e3d50d5a hub: bump manifest image tag to 0.60.0 (Part B escrow retention) 2026-07-17 10:50:21 +02:00
admin 319ba10d9f hub: bump manifest image tag to 0.59.0 (Direction-2a poke sender) 2026-07-16 22:51:23 +02:00
admin eb227486d0 hub v0.59.0: Direction-2a agent-plane immediate-sync poke sender + ep0 felhom-poke surface
- internal/poke: pinned-host-key SSH poke sender (wgsync sibling) + fire-and-forget Notifier (PokeHost/PokeAllHosts). Poke refuses non-WG targets pre-dial; contentless via ep0 forced command to the box WG /32:51822.
- wiring: Server.SetPoke; applyPBSDR pokes the host after each descriptor gen-bump; handleSetArtifacts (MinAgent floor) pokes all hosts. main.go env POKE_SSH_KEY_FILE (reuses peersync endpoint/hostkey).
- scripts/felhom-poke.sh (non-root forced command) + offsite-endpoint.md §11; manifests/hub.yaml Secret/agent-poke + POKE_SSH_KEY_FILE (image tag bump follows the build).
2026-07-16 22:48:15 +02:00
admin 59eb1f836e deploy(hub): manifest → felhom-hub:0.58.0 (Direction-2 wait channel) 2026-07-16 20:46:41 +02:00
admin dd563a0273 deploy(hub): bump manifest to felhom-hub:0.57.0 (reinstall arc) 2026-07-16 18:02:14 +02:00
admin de5d8ef9b1 widen the reconciler fleet-wide (remove PBSDRHEAL_ONLY_HOST from the manifest) 2026-07-15 19:17:27 +02:00
admin dc7bcedb42 manifests: hub 0.56.0 + PBSDRHEAL_ONLY_HOST=demo-vm-felhom-2f4b00 (supervised rollout)
Deploy the PBS-DR self-heal reconciler scoped to the drill guest only for the
first supervised run; widen to the fleet (remove the env) in a follow-up sync
once the converged-host no-op is confirmed live.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HEPuEwyyGDJdcsXLFsTWJn
2026-07-15 18:29:22 +02:00
admin 08fef4872b hub v0.55.0: accept offbox_enlarge_blocked event (Task 3a-fix delivery chain)
allowedEventTypes gains offbox_enlarge_blocked (was 400 at ingestion, dropping the customer email).
Deliberate NON-change: no customerMessages entry — the static map would discard the controller's
dynamic two-number Hungarian message (templates.go:129 fallback is correct). event_test acceptance +
400 red-proof; templates_offbox_test locks the raw-message fallback. manifest bumped to :0.55.0.
2026-07-15 07:50:29 +02:00
admin 962273ba8e @
hub: bump manifest image tag to 0.54.0 (change-password from Configuration UI)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbMm4T7Ayzs1unB9pN6Uqd
@
2026-07-13 22:48:34 +02:00
admin 3616dcbb7c manifest: hub 0.53.0 (closing bundle GitOps bump; rides with the report-api secretKeyRef - Secret created out-of-band 2026-07-13 before this sync) 2026-07-13 15:05:06 +02:00
admin 80aca3a3a1 hub + manifests: operator bearer out of git (secretKeyRef report-api)
The global bearer (api.report_api_key) leaves manifests/hub.yaml: the
ConfigMap field is an empty placeholder; the Deployment injects
REPORT_API_KEY from out-of-band Secret/report-api (deliberately NOT
optional - a missing Secret fails Ready rather than booting a hub with an
empty bearer). main.go gains the REPORT_API_KEY env override (the
RESEND_API_KEY twin). scripts/manifest_secret_gate.py blocks bearer-shaped
(64-hex) literals across manifests/ (felhom.secret.yaml's pre-existing
umami APP_SECRET is a visible non-fatal KNOWN-BACKLOG line - secrets.md
backlog, out of scope here).

Ordering (load-bearing): create Secret/report-api with the CURRENT value
BEFORE syncing; this manifest change rides the same sync as the 0.53.0
image (older images ignore the env override). The exposed git-history copy
dies only with the supervised ROTATION - procedure + consumer list in
documentation/runbooks/secrets.md ("Operator/global bearer key"); both
publish runbooks' ROTATION notes now point at that disposition. The
controller repo's example-config copy of the literal is scrubbed
(felhom-controller 51c871a).

Red-proof E: reintroducing a 64-hex literal into manifests/hub.yaml ->
gate exit 1 (recorded); restored clean.
2026-07-13 14:57:09 +02:00
admin 0e05c6966d manifest: hub 0.52.0 (polish batch GitOps bump)
Claude-Session: https://claude.ai/code/session_01GzammAMzsJTgpQHqxwM2bC
2026-07-13 08:30:34 +02:00
admin ccf89c0a67 manifest: hub 0.51.0 (DR-tier-by-default GitOps bump)
Claude-Session: https://claude.ai/code/session_01NptTCFtu7dz2Ru89qHRagN
2026-07-12 20:48:20 +02:00
admin 9a14f04819 manifest: hub 0.50.0 (customer-claim arc GitOps bump)
Claude-Session: https://claude.ai/code/session_01NptTCFtu7dz2Ru89qHRagN
2026-07-12 18:47:03 +02:00
admin b1ab0ea0e5 docs+manifest: hub v0.49.0 — Edit tab merge train (CHANGELOG, REUSE rows, CONTEXT, GitOps bump)
Version note: the task spec targeted 0.48.0 but that tag had already shipped
(app_start_failed); published tags are never re-pointed → this train is 0.49.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TZc5w5jDhFLv6qDC32KN5v
2026-07-12 17:39:09 +02:00
admin 0eb9dc2e9b manifests: raise global controller floor 0.113.0 → 0.120.0 (publish train)
Env fallback DEFAULT_MIN_CONTROLLER_VERSION for the CAMPAIGN-3 wave. Day-0
artifact manifest already vouches agent 0.85.0 + golden 0.120.0 (MinAgent
0.81.0). Demo already 0.120.0 (no churn); Peti offline + gated (agent 0.79 <
MinAgent 0.81 → controller held at 0.113 until his agent lands). DB global
floor to be aligned to 0.120.0 by the operator, saved last.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vvz1NCu22p8dGkRCpeX9re
2026-07-12 11:12:42 +02:00
admin 9095981d0c hub: bump manifest to v0.48.0 (app_start_failed event acceptance — controller fix-3)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_017CDMFpFx84pfviCTVuGGhf
2026-07-12 10:13:14 +02:00
admin 95d71fef2e hub v0.47.0: CHANGELOG + README tab/host-lifecycle/offsite docs + REUSE map + manifest bump to 0.47.0
CONTEXT.md: v0.47.0 arc entry (resolves the 146d165 swept-WIP flag) + the
multi-endpoint-allocation deferral + pre-GitOps stale-template note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vvz1NCu22p8dGkRCpeX9re
2026-07-11 21:39:44 +02:00
admin 7c038df63c hub 0.46.0 manifest bump + logging-conventions runbook + CLAUDE logging rule
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-11 17:02:54 +02:00
admin 37222d3e1d manifest: hub image 0.44.0 -> 0.45.0 (floor-UI + MinAgent conditional floor)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-11 15:35:59 +02:00
admin 16390d02be floor: DEFAULT_MIN_CONTROLLER_VERSION 0.87.0 -> 0.113.0 (publish train 0.81/0.113; manifest vouches both — order rule honored)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-11 12:53:57 +02:00
admin 32ca1f60a7 tenantsync v1.0.0 live fix (client json is {data:[...]}-wrapped) + hub image bump 0.44.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 20:59:55 +02:00
admin ce6a56691e hub v0.44.0: PBS DR tier SLICE 1 — felhom-tenantsync surface (script+client) + hub provisioning flow (consume-once host secret, pbs_dr desired-state descriptor, fail-closed + idempotent, re-issue)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 20:49:48 +02:00
admin 8a3afa75b3 deploy: hub 0.43.1 (Git Sync optional hint)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 17:57:13 +02:00
admin efdf683ac7 deploy: hub 0.43.0 (remote app-log diagnostics)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 16:08:10 +02:00
admin 0f28add0bf deploy: hub 0.42.0 (remote debug-mode toggle)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 15:16:34 +02:00
admin 04826c922e manifests/hub: 0.40.0 -> 0.41.0 (SLICE 4 OffsiteChecker + freeze lever)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 00:00:49 +02:00
admin c24d4afeee manifests/hub: 0.39.0 -> 0.40.0 (SLICE 3 escrow status in ACK)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-09 23:21:37 +02:00
admin 17d9af5c13 manifests/hub: 0.38.1 -> 0.39.0 (offsite hardening F4/F2/F5)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-09 22:40:41 +02:00
admin 6d5b3c1c38 manifests/hub: 0.38.0 -> 0.38.1 (offsite provisioning detached from client ctx)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-09 21:02:44 +02:00
admin 0a65f2be5f manifests/hub: wire HETZNER_TOKEN + HETZNER_POOL_BOX_ID from Secret/storagebox (offsite provisioning)
Runbook Phase 0b. Values come from the out-of-band felhom-system/storagebox
secret; optional:true so the pod starts without it (hub degrades to offsite
disabled). HETZNER_LOCATION explicit fsn1. NOT synced yet — gated on the
secret holding the DEDICATED-project scoped token (the current one fails the
scope check: it sees the old project's ep0 box, not the new pool box).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-09 20:39:55 +02:00
admin 6e86eb6d51 added secret 2026-07-09 20:36:22 +02:00