Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8b77ce3
Add diagnostic logging when pipeline receives data without cloud expo…
Jun 16, 2026
94ce0a4
Resolve GCP project ID from metadata server as fallback
Jun 16, 2026
2cf33c5
Route hook metrics through pipeline to prevent sampling rate violations
Jun 16, 2026
96723cc
Register ModelResponse hook to enable token metrics from Claude Code
Jun 16, 2026
727c3a8
Skip metadata server query in tests to avoid unnecessary network calls
Jun 16, 2026
ed4626c
Update capability test to match ModelResponse hook registration
Jun 16, 2026
e7a8d83
Deduplicate buffered metrics before export to Cloud Monitoring
Jun 16, 2026
b0373ef
Remove metadata server fallback for GCP project ID resolution
Jun 16, 2026
879b4e0
Enforce minimum interval between metric buffer flushes
Jun 16, 2026
d4fe4a1
Add metrics dashboard to hub admin UI
Jun 18, 2026
27f7328
Address code review: fix error handling and label extraction
Jun 18, 2026
be43ab5
Fix ALIGN_SUM → ALIGN_DELTA for cumulative metrics
Jun 20, 2026
8cf2d37
feat: move metrics dashboard from admin to main nav with relaxed auth
Jun 20, 2026
1b7716f
feat: add per-project metrics views with parameterized queries
Jun 20, 2026
67fa79b
feat: add metrics summary row to project detail page
Jun 20, 2026
1fef399
fix: address code review findings for metrics dashboard
Jun 20, 2026
2f4e301
Add graph-up icon to Shoelace icon allowlist
Jun 20, 2026
9d6cf46
Address PR #458 review findings: shutdown race, dedup stability, sort…
Jun 20, 2026
06a4513
Fix CI failures: gofmt formatting and errcheck in metrics dashboard
Jun 21, 2026
c60ad2b
Use project_id label instead of grove_id in metrics filter
Jun 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ go 1.26.1
require (
cloud.google.com/go/compute/metadata v0.9.0
cloud.google.com/go/logging v1.13.2
cloud.google.com/go/monitoring v1.24.3
cloud.google.com/go/secretmanager v1.16.0
cloud.google.com/go/storage v1.59.1
entgo.io/ent v0.14.5
Expand Down Expand Up @@ -71,7 +72,6 @@ require (
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/iam v1.5.3 // indirect
cloud.google.com/go/longrunning v0.8.0 // indirect
cloud.google.com/go/monitoring v1.24.3 // indirect
cloud.google.com/go/trace v1.11.7 // indirect
github.com/Azure/go-ntlmssp v0.1.1 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect
Expand Down
2 changes: 1 addition & 1 deletion pkg/harness/capabilities_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func TestAdvancedCapabilitiesDefaults(t *testing.T) {
name: "claude",
harness: "claude",
expectMaxTurns: api.SupportYes,
expectMaxModelCalls: api.SupportNo,
expectMaxModelCalls: api.SupportYes,
expectMaxDuration: api.SupportYes,
expectAuthFile: api.SupportYes,
expectVertexAI: api.SupportYes,
Expand Down
1 change: 1 addition & 0 deletions pkg/harness/claude/embeds/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"SubagentStop": [{"matcher": "*", "hooks": [{"name": "scion-status", "type": "command", "command": "sciontool hook --dialect=claude"}]}],
"PreToolUse": [{"matcher": "*", "hooks": [{"name": "scion-status", "type": "command", "command": "sciontool hook --dialect=claude"}]}],
"PostToolUse": [{"matcher": "*", "hooks": [{"name": "scion-status", "type": "command", "command": "sciontool hook --dialect=claude"}]}],
"ModelResponse": [{"matcher": "*", "hooks": [{"name": "scion-telemetry", "type": "command", "command": "sciontool hook --dialect=claude"}]}],
"Notification": [{"matcher": "ToolPermission", "hooks": [{"name": "scion-status", "type": "command", "command": "sciontool hook --dialect=claude"}]}]
}
}
2 changes: 1 addition & 1 deletion pkg/harness/claude_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func (c *ClaudeCode) AdvancedCapabilities() api.HarnessAdvancedCapabilities {
Harness: "claude",
Limits: api.HarnessLimitCapabilities{
MaxTurns: api.CapabilityField{Support: api.SupportYes},
MaxModelCalls: api.CapabilityField{Support: api.SupportNo, Reason: "This harness does not emit model-end hook events"},
MaxModelCalls: api.CapabilityField{Support: api.SupportYes},
MaxDuration: api.CapabilityField{Support: api.SupportYes},
},
Telemetry: api.HarnessTelemetryCapabilities{
Expand Down
14 changes: 14 additions & 0 deletions pkg/hub/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -4976,6 +4976,20 @@ func (s *Server) handleProjectRoutes(w http.ResponseWriter, r *http.Request) {
return
}

// Check for nested /metrics-summary path (lightweight project metrics summary)
if subPath == "metrics-summary" {
s.handleProjectMetricsSummary(w, r, projectID)
return
}

// Check for nested /metrics path (project-scoped metrics dashboard)
if subPath == "metrics" || strings.HasPrefix(subPath, "metrics/") {
metricsPath := strings.TrimPrefix(subPath, "metrics")
metricsPath = strings.TrimPrefix(metricsPath, "/")
s.handleProjectMetricsDashboard(w, r, projectID, metricsPath)
return
}

// Check for nested /settings path
if subPath == "settings" {
s.handleProjectSettings(w, r, projectID)
Expand Down
Loading
Loading