Week of July 27 -- August 2, 2026
This week delivered a full-stack session metrics subsystem from agent-side telemetry aggregation through API endpoints and web UI dashboards, completed the config-driven auth migration that eliminates all hardcoded per-provider credentials, and shipped pre-start customization hooks at both project and hub scope. The A2A protocol bridge gained admin UI integration with live config management, Discord added one-step thread+agent creation and file retrieval commands, and a sustained chain of auth and injection fixes resolved a class of Vertex AI restart failures.
⭐ Highlights
Section titled “⭐ Highlights”1. Session Metrics Infrastructure (M3+M4)
Section titled “1. Session Metrics Infrastructure (M3+M4)”An entirely new observability subsystem shipped end-to-end. M3 introduced an agent-side telemetry aggregation engine in sciontool, a MetricsPayload field in the StatusUpdate protocol, a new agent_session_metrics Ent schema, and a hub ingestion endpoint with auth gating. M4 followed immediately with three API endpoints (/agents/{id}/metrics/summary, /metrics/session/{id}, /projects/{id}/metrics/summary), SQL-level aggregation with IDOR-safe authorization, and a web UI layer including an agent detail metrics tab, stats columns in the agents list, and a project summary view.
2. Config-Driven Auth Migration (Phases 3–4)
Section titled “2. Config-Driven Auth Migration (Phases 3–4)”All hardcoded per-provider auth fields — AnthropicAPIKey, GeminiAPIKey, CodexAPIKey, and their switch-case dispatch tables — were removed. Every built-in harness now resolves credentials exclusively through FromConfig variants, decoupling the auth pipeline from provider-specific knowledge. This completes a multi-phase architectural cleanup that makes adding new model providers a configuration change rather than a code change.
3. Pre-Start Customization Hooks
Section titled “3. Pre-Start Customization Hooks”Project-level pre-start hooks shipped on July 27 with a new ProjectPreStartHook Ent entity, project-scoped shell scripts staged as pre-start.d/30-project-custom with abort-on-failure wiring. The next day, scope expanded to hub-level hooks with a scope enum (project/hub), web UI components in Hub Resources and Project Settings, a scion hub hook CLI subcommand, and project-overrides-hub precedence resolution. Operators can now inject environment setup, credential validation, or compliance checks that run before every agent start.
4. A2A Bridge Admin Integration
Section titled “4. A2A Bridge Admin Integration”The A2A protocol bridge was elevated from a standalone plugin to a first-class Hub admin integration across three phases. Phase 1 introduced a KnownPlugin catalog replacing the flat plugin list, with a self-managed install flow and frontend platform support. Phase 3 delivered real config management through the admin UI — Configure() with atomic snapshot swap, AdminOverlay hot-swap, and enriched HealthCheck(). Earlier in the week, the bridge also gained per-user access token auth with hubUAT and hubJWT schemes, SHA-256 keyed token cache, and CallerIdentity context propagation.
📊 Metrics & Observability
Section titled “📊 Metrics & Observability”- GCP Error Reporting integration:
serviceContext,stack_traceon ERROR+, and@typeannotation for automatic error detection in GCP console. - Subsystem logging tags: Tier 3 logging tags added to remaining CRUD handlers, completing structured log coverage across the hub.
- Telemetry pipeline resilience: Retry with exponential backoff for telemetry exports; GCP project ID derived from SA credentials for metrics dashboards instead of requiring manual configuration.
- Cloud Monitoring query fix: Corrected
ALIGN_SUMtoALIGN_DELTAfor single-point cumulative series, fixing inaccurate metric visualizations.
🔐 Auth & Security
Section titled “🔐 Auth & Security”- Harness auth corruption fix chain: Resolved a self-perpetuating corruption bug where harness implementation names (e.g.
container-script) leaked intoopts.HarnessAuthandscion-agent.json, causing Vertex AI agents to fail with “not logged in” on every restart. AddedGOOGLE_CLOUD_PROJECT→ANTHROPIC_VERTEX_PROJECT_IDtranslation and a defensive guard rejecting known harness names from auth backfill. as_neededinjection enforcement: Theas_neededannotation was previously stored and shown in the UI but never filtered at dispatch time. Enforcement was added to all three injection paths inhttpdispatcher.go, followed by a three-part fix chain: two-pass env-gather resolution,DispatchAgentRestartenv/secret resolution, and second-pass resolution inDispatchFinalizeEnv. File-type and variable-type secrets are now exempt from the filter.- Policy API admin gating: All 11 policy API handlers now require
requireAdmin— previously any authenticated user could create, modify, or delete authorization policies. - Multi-GitHub credential support: Convention-based secret key derivation (
GH_OWNER__REPO,GH_OWNER) inserted into thetokenForRefprecedence chain, enabling differently-scoped tokens for multiple repos. Purely additive and backward compatible. - Credential decoupling from NoAuth guard:
provisionCredentialsno longer skips whenno_auth.behavior: drop-to-shellis set, unblockingGitHubSkillResolveraccess to convention-basedGH_tokens for private repo skill resolution. - Permission error surfacing: Secret creation permission errors now return 403 with actionable guidance instead of generic 500.
🧩 Skills & Provisioning
Section titled “🧩 Skills & Provisioning”- Hub-side
gh://skill cache activation (Phase 3):RegisterFallbackrouting infrastructure with context-cancellation-safe fallback flips resolution to the hub-side cache, with broker-side fallback when the Hub is unreachable. Phase 2 defects (hash format, expiring URLs, cross-project authz) were fixed in the same cycle. - Batch skill import: Paste a GitHub directory URL to discover skill subdirectories, select via checkbox interstitial, and add all checked skills as individual URI references in a single atomic PUT. URLs are stripped of credentials before logging.
- Scope-based skill collision resolution: Replaces the hard error in
installResolvedSkillswith a precedence dedup pass (project > template > user > hub > platform).Scopefield annotated at all injection sites; collisions logged and recorded inresolved-skills.json. - Ref→SHA deduplication: Duplicate
gh://ref→SHA lookups within a single resolve request are now deduplicated with case-insensitive owner/repo memo keys. - Broker-singleton skill cache: GitHub skill resolution cache promoted from per-request ephemeral to broker-level singleton with extended TTLs (5m → 30m default, 24h for SHA resolution).
- Platform skill expansions: Six skills added or updated — scheduler, git-operations, workspace orientation, messaging, agent management recovery, and shell safety.
⚙️ Settings & Project Management
Section titled “⚙️ Settings & Project Management”- Settings precedence overhaul: Hub agent defaults and env scope ordering corrected, with thinking-level propagation fix and comprehensive design documentation. Project
default-harness-confignow correctly outranks template harness config. - Project clone: Deep-copies settings, labels, env vars, skills, hooks, harness configs, and templates with defer-driven rollback. Frontend displays hub-default placeholders.
- Resolved settings endpoint: New
GET /projects/{id}/settings/resolvedshows hub defaults per-setting, enabling the UI to distinguish inherited from overridden values. - Hub agent defaults pipeline:
DefaultModelandDefaultThinkingLevelwired into the hub defaults pipeline. Canonical shared harness name list replaces three inconsistent hardcoded lists. - Init ordering: Git clone now runs before pre-start hooks — provisioner-created files in
/workspacepreviously causedisWorkspaceEmptyto skip the clone.
💬 Chat Integrations
Section titled “💬 Chat Integrations”/scion threadcommand: Create a Discord thread and a Scion agent in one step, withX-Scion-On-Behalf-Ofdelegated identity middleware, template autocomplete, and in-thread progress feedback./scion sendenhancements: File retrieval from the shared scratchpad by absolute path or partial-name search with button picker and symlink traversal protection. Container-to-host path translation added so agent container paths resolve correctly, with configurablesend_search_root.- System message category: New
type:systemmessages for hub-generated operational notices (delivery-failed,scheduler,port-forward), with rendering support across all chat integrations. - @mention parsing and –cc flag: Multi-recipient notification fan-out via
@mentionparsing in message bodies and a new--ccflag. - Build version display:
/helpcommand output now shows build version and git commit hash via build-time ldflags injection across Discord and Telegram. - Agent status icon corrections: Stopped, errored, and crashed agents now display correct phase-specific icons instead of a generic play icon.
- Thread parent cache fix: Transient Discord API errors no longer permanently block thread parent lookups;
threadParentID()now distinguishes confirmed results from failures. - IAP transport inheritance:
longHTTPClientinherits IAP transport, fixing 401 errors on IAP-protected deployments for long-running operations likeCreateAgent. - Inbound attachment downloads: Configurable
downloads_pathfor inbound attachments in isolated workspace modes.
🖥️ Web UI
Section titled “🖥️ Web UI”- Shoelace dialog migration: All 39 native
alert()calls and 23confirm()calls across 22 files replaced with shared Shoelace-basedshowToast()andshowConfirm()components. - Quick-message buttons: One-click message modal for agents in detail, list, and graph views — Enter sends, Shift+Enter for newline — capability-gated via existing message check.
- Restructured server-config: General tab split into three cards (General, Agent Defaults with sub-tabs, Project Default Settings). Message Broker moved to Hub Server tab; Telemetry toggle moved to Agent Defaults.
- Terminal shortcut on graph cards: Icon-only connect-to-terminal button in graph view, gated by attach capability and disabled for offline agents.
- Agent list improvements:
lastActivityEventshown instead of heartbeat time; harness config dropdown sorted alphabetically; label-filter control added to project-level agent list. - Skill URI handling: Web skill picker now generates canonical
skill://scion/<slug>URIs; long URIs middle-truncated to preserve the identifying skill name, with full URI on hover. - GCP telemetry settings: GCP Project ID and Cloud Logging configuration added to admin telemetry UI.
- Graph view polish: Text selection prevented during drag-to-pan; graph-view toggle removed from the projects list page (where it was meaningless).
🚀 Agent Lifecycle & Runtime
Section titled “🚀 Agent Lifecycle & Runtime”- Agent port forwarding: Agents can expose local HTTP ports through the Hub as authenticated, reverse-proxied URLs. Auto-expose package scans
/proc/net/tcp{,6}with diff-based reconciliation on configurable ticker;auto_expose_portswired through admin settings API. HTML error pages returned for browser requests to unexposed ports. scion resume --force: Recover crashed agents from the error phase with in-place restart and harness resume flag, so interrupted sessions continue rather than starting fresh.- Message attachments through scratchpad: Attachment delivery now routes through the scratchpad shared volume, fixing silent delivery failure in isolated workspace modes.
- Scheduler concurrency: Configurable scheduler interval and per-task concurrency (
max_concurrency, default 2) with jitter before semaphore acquire to avoid thundering-herd. Fixes DB connection pool saturation on small deployments. - Scratchpad auto-provisioning: New projects automatically receive a default scratchpad shared directory via
project_defaults.default_scratchpadtoggle (default: ON). - Claude harness model alias resolution:
provision.pynow resolves model aliases using harness configmodel_aliaseswithSCION_MODELenv var fallback.
🐛 Bug Fixes & Stability
Section titled “🐛 Bug Fixes & Stability”- Chown root-owned files: Provisioner-created root-owned files chowned after provisioning to prevent undeletable agents.
- Runtime error propagation:
ImageExistsnow propagates errors from daemon-unreachable instead of returning(false, nil). Detected runtime used for broker heartbeat instead of hardcodingcontainer. - Image registry validation:
image_registryvalidated before starting runtime broker — fails fast with an actionable error instead of causing opaque image-pull 404s. - Broker message rejection: Inbound messages to non-running agents rejected with 409 instead of being silently swallowed. Non-existent agent messages on Discord now show an error.
- Mention metadata preservation: CC’d agents correctly see primary recipients in delivery messages; group message type set to
group-setinstead ofinstruction. - SA verification honesty: Returns 503 when verifying service account without token generator instead of false
Verified=true. - Config cleanup:
project_idwritten instead of legacygrove_id;Content-Typechecked before falling back to legacy grove endpoint to fix spurious deprecation warnings;schema_versionadvisory warning for settings files. - Hub maintenance guard: Concurrent maintenance operations rejected with 409 Conflict, preventing
go buildpile-up that caused the July 28 outage.
📖 Docs
Section titled “📖 Docs”- A2A Protocol Bridge documentation: Consolidated and revamped A2A bridge documentation.
- Multi-GitHub credential guide: Naming convention, normalization rules, setup examples, credential resolution order, and injection mode semantics.
- Shared directory patterns: Common patterns for project shared directories — build caches, producer/consumer artifacts, shared knowledge base, file-based coordination.
- Agent lifecycle corrections: Fixed false safety guarantee (“committed” is not “pushed”), clarified
--preserve-branchbehavior, replaced “broker slots” with “system resources.” - Skill documentation updates: Messaging skill (2000-rune limit, inbound type discrimination,
--notifydeprecation), agent management (troubleshooting triage table, recovery sections), scheduler (whoami recipe for self-scheduling agents).