hub v0.46.0: observability pass — per-box log pulls, bundle custody, 72h TTL + secret gate
log_bundle_requests + log_bundles store (gzip, newest-3, 72h TTL purged on the 60s sweep); SaveLogBundle secret gate fail-closed (blocked flag row, no payload; REDACTED/checksums pass). Report ACK gains controller_log_requested + ingests controller_log_tail; heartbeat envelope gains log_tail_requested + ingests log_tail (consume-once on arrival; pre-0.83 agents stay visibly pending). Host detail Diagnostics section: request buttons (controller/agent), state rows with honest latency hints, View/Download endpoint. Red-proofs: gate disabled and clear-on-arrival removed both FAIL their tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
This commit is contained in:
@@ -166,9 +166,17 @@ func TestHandleHostDetail(t *testing.T) {
|
||||
if strings.Contains(body, secretKey) {
|
||||
t.Errorf("SECRET LEAK: detail page rendered the host api_key")
|
||||
}
|
||||
// Read-only: no host action buttons.
|
||||
if strings.Contains(strings.ToLower(body), "<button") {
|
||||
t.Error("host detail must not contain action buttons")
|
||||
// v0.46.0: the ONLY host actions are the two log-bundle request forms (the page is
|
||||
// otherwise still read-only — no destructive/host-mutating buttons).
|
||||
if got := strings.Count(strings.ToLower(body), "<button"); got != 2 {
|
||||
t.Errorf("host detail has %d buttons, want exactly the 2 log-request buttons", got)
|
||||
}
|
||||
if strings.Count(body, `action="/hosts/demo-felhom-01/request-logs"`) != 2 {
|
||||
t.Error("the request-logs forms are missing — every button must be a log-bundle request")
|
||||
}
|
||||
// The Diagnostics section renders with its honest latency hint.
|
||||
if !strings.Contains(body, "Diagnostics") || !strings.Contains(body, "72 h") {
|
||||
t.Error("Diagnostics log-bundle section missing")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user