Week of September 7 -- 13, 2026
The week’s defining event was the landing of the full authorization audit — 131 commits classifying every registered route — followed by an intensive stabilization effort that resolved a cascade of P0 regressions across progeny secrets, broker reads, template resolution, and agent scoping. In parallel, GCP identity support for sandbox runtimes was unblocked end-to-end with passthrough-to-assign credential translation, and broker lifecycle management matured with heartbeat timeouts, hub-level default selection, and clean unregistration. The week closed with credential-leak prevention hardening, a new Meta Muse Code harness, and a tighter agent messaging permission model.
Highlights
Section titled “Highlights”1. Authorization Audit Landing & Stabilization
Section titled “1. Authorization Audit Landing & Stabilization”Scion’s authorization kernel reached full coverage: all 177 registered routes and 194 permission classifications are now enforced, backed by role-binding CRUD, a project membership service, access constraints, and structured denial responses. The audit’s merge on September 7 triggered a week-long tail of P0 fixes — progeny agents losing inherited secrets due to missing scopes and wrong permission derivation, brokers denied template and harness-config reads by the new security gate, agents unable to assign GCP service accounts or resolve templates, and the WebServer login path failing to create super-admin RoleBindings. Each regression was resolved promptly, and two missing mutation-classification entries were added to restore CI on main. By week’s end the authorization catalog was complete and stable.
2. GCP Identity for Sandbox Runtimes
Section titled “2. GCP Identity for Sandbox Runtimes”gVisor-sandboxed agents on Cloud Run could not reach the GCE metadata server, leaving GCP passthrough mode non-functional. The hub now translates passthrough to assign using the broker’s host service account at create and PATCH time, with downstream JWT scoping, resolved environment, and the gcp-token endpoint working automatically. Companion fixes propagated GOOGLE_CLOUD_LOCATION into sandbox containers, taught the auth autodetect path to recognize translated agents, and corrected Vertex AI hostname generation when the region was set to global. The result is reliable GCP credential delivery on every supported runtime.
3. Broker Lifecycle & Multi-Broker Infrastructure
Section titled “3. Broker Lifecycle & Multi-Broker Infrastructure”Multi-broker deployments gained a hub-level DefaultRuntimeBroker setting — step 2.5 in the broker resolution cascade — with an admin UI dropdown, agent-create fallback, and seven new cascade tests. Operators can now cleanly decommission brokers via an admin-gated Unregister button that tears down HMAC secrets and join tokens. A new 5-minute heartbeat timeout scheduler marks stale brokers offline when WebSocket disconnects fail to fire, and the agent delete path was hardened to skip broker dispatch for never-provisioned agents, with a force-delete fallback dialog on 502/503 and a reduced timeout.
🔐 Authorization & Access Control
Section titled “🔐 Authorization & Access Control”- Route-level authorization enforcement (#1487): 131-commit authorization audit covering all 177 routes and 194 classifications, with role-binding CRUD, project membership service, access constraints, structured denial responses, D-002 migration coexistence, and cold-start super-admin binding.
- Progeny secret inheritance fix (#1489): Three stacked defects — missing scopes on synthetic identity, wrong
CheckAccesspermission derivation, andwalkDelegationChainignoring the Permission field — prevented progeny agents from receiving inherited secrets. - Broker template and harness-config reads (#1494): Broker and agent-scoped reads denied after the audit merge. Added broker-identity bypass and
AgentScopesto the permission registry. - Agent template resolution (#1504): Three compounding defects — missing
AgentScopesontemplate.read/list, error mislabelled as authentication failure, and scope-fallback path abort. - Global template and harness-config listing (#1535): Parentless global-scoped resources could not match project-scoped agent bindings. Grants
hasAdminViewto agents withScopeProjectRead. - Full-role template management (#1506): Added
project:template:writescope for template create/update, granted toagent-role-full. - WebServer super-admin RoleBinding (#1508): Both login paths now call
ensureSuperAdminBinding, fixingIsSystemAdminreturning false for admin-role users. - Agent messaging permission tightening (#1543): Removed
agent.messagefrom the project-member role. Messaging now requires owner/admin role or creator ancestry, matching the terminal attach gate. - Metrics dashboard admin gate (#1581): Moved metrics nav to
ADMIN_SCOPEABLE_ITEMSand registeredhub.metrics.readin the permission maps. - AllowProgeny propagation on secret promotion (#1580): The
setEnvVarpromotion path now propagates theAllowProgenyflag, restoring progeny inheritance for promoted secrets.
☁️ GCP Identity & Credentials
Section titled “☁️ GCP Identity & Credentials”- Passthrough-to-assign translation (#1509): Hub translates GCP passthrough to assign using the broker’s host SA for sandbox runtimes at create and PATCH time, unblocking credential delivery on
cloudrun-sandbox. GOOGLE_CLOUD_LOCATIONpropagation (#1517): Three compounding bugs —ResolveAuthcollapsing the variable,cloudrun_sandbox_runtime.goskippingapplyResolvedAuth(), and Gemini CLI missing GCP vars inallowedEnvironmentVariables.- Auth autodetect for translated agents (#1514):
hasRequiredAuthCredentials()now recognizes passthrough-to-assign translated agents via a newagentHasGCPIdentityAssigned()helper. - Secret Manager user-managed replication (#1533): Optional
ReplicationLocationsconfig field for GCP orgs enforcingconstraints/gcp.resourceLocations, exposed via settings YAML, admin UI, and Postgres config store. - Credential leak on clone failure (#1577): Deferred
.git/cleanup after workspace init prevents credential-bearing URLs from persisting on disk. - PullImage credential safety (#1582): Switched to
runSimpleCommandwith per-site error enrichment, eliminating credential exposure in diagnostic output.
🔧 Broker & Agent Lifecycle
Section titled “🔧 Broker & Agent Lifecycle”- Hub-level default runtime broker (#1521):
DefaultRuntimeBrokeradded toAgentDefaultsSettingswith admin UI, agent-create fallback, and cascade tests. - Broker unregister button (#1515): Admin-gated button with confirmation dialog; backend cleans up HMAC secrets and join tokens.
- Heartbeat timeout scheduler (#1518): 5-minute-cycle scheduler marks stale brokers offline when WebSocket disconnect events fail to fire.
- Agent delete on stale broker (#1520): Phase-aware delete skips broker dispatch for never-provisioned agents. Force-delete fallback dialog on 502/503, timeout reduced from 90s to 15s.
- Embedded broker passthrough gate (#1507): Co-located brokers registered without
CreatedBy; admin-role users now treated as owners for the passthrough identity gate.
🤖 Harness Ecosystem
Section titled “🤖 Harness Ecosystem”- Muse Code harness (#1541): Complete harness bundle for Meta’s Muse Code terminal coding agent —
config.yamlwith API key auth and MCP mapping,provision.py,dialect.yamlmapping all 13 hook events, Dockerfile, seed files, and 14 unit tests. - grok-build hook events and quality (#1536): Wired 4 missing hook events, increased stop hook timeout to 60s, updated model aliases to grok-4.5/grok-4.6, added
--no-ask-userfor headless reliability. - grok-build Vertex AI publisher prefix (#1530): Pre-resolved models without a
/now fall back to the default vertex model, fixing Vertex AI 400 errors. - grok-build global region normalization (#1529): Normalizes
GOOGLE_CLOUD_REGION=globalto empty string, yielding the correctaiplatform.googleapis.comhostname. - Claude harness startup fix (#1513): Wildcard
*inpermissions.allowand an invalid hook event caused an interactive Settings Warning prompt, blocking headless startup. - Harness-config bootstrap in hosted mode (#1525): Removed the bulk
SkipIfAnyExistguard that short-circuited after the first existing config; per-resourceOverwritePolicyhandles dedup.
🖥️ UI & Platform Stability
Section titled “🖥️ UI & Platform Stability”- Chat markdown HTML truncation (#1565): Angle-bracket text interpreted as real HTML caused message truncation. Custom marked renderer hook entity-escapes raw HTML tokens.
- Template pagination overflow (#1528): Lowered page size from 200 to 100, added
apiFetchAllPages()with cursor pagination andMAX_PAGES=50safety bound. Hubs with 100+ templates no longer silently drop entries. - Agent Start/Stop UI capability (#1490): Buttons now gate on
attachcapability, matching server-sideauthorizeAgentLifecyclesemantics across 12 call sites. - Chat terminal window (#1505): Terminal link opens a named window per agent instead of replacing the chat tab, with popup-blocker fallback.
- Restart button 502 fix (#1519): Fire-and-poll with exponential backoff on
/healthzreplaces fire-and-check, showing a spinner and success toast. - Duplicate access-denied toasts (#1503): Added
suppressAccessDeniedToastto 7apiFetchcalls for admin-only requests that degrade gracefully on 403. - Web chat store initialization (#1524): Store initialization moved outside the
MessageBroker.Enabledgate so single-node Cloud Run instances render correctly. - Stale project marker on recreation (#1573):
buildStartContextdetects and overwrites stale on-disk markers using external config dir existence as the staleness heuristic. - isGit preservation for skill injection (#1570): Original
isGitvalue preserved before the container override soinject_when: git_workspacematches in clone-per-agent workspaces. - ADO clone URL
.gitsuffix (#1584): Strips trailing.gitsuffix from Azure DevOps repository URLs. - Default
--registryfrom env var (#1576):build-images.shnow defaultsREGISTRYfromSCION_IMAGE_REGISTRYwith a warning when neither is set.
🏗️ Build & Infrastructure
Section titled “🏗️ Build & Infrastructure”- BuildKit enabled in cloudbuild-omni (#1484): Added
DOCKER_BUILDKIT=1to all 8 build steps to supportRUN --mount=type=secretin upstream Dockerfiles. - Internal Python package index (#1488):
PIP_INDEX_URLbuild-arg and BuildKit secret mount forpip.confenable image builds behind corporate proxies blocking PyPI. - Telemetry cloud export gating (#1578): Gates GCP export on
ProjectID, bounds re-buffer loop with consecutive failure counter, adds gRPC error classification and startup warnings.
📖 Documentation
Section titled “📖 Documentation”- Python package index proxy (#1512): Added proxy section to
custom-images.mdmirroring the npm pattern;project:template:writescope added to the Full role list insecurity.md. - Multi-broker resolution cascade (#1527):
DefaultRuntimeBrokerin admin-settings, 5-step cascade table in multi-broker guide, health monitoring and unregistration in runtime-broker guide, and sandbox passthrough-to-assign callout in auth docs. - BYO-TLS for internal GCE deployments (#1572): Section added to
hub-setup-gce.mdcoveringSCION_SERVER_BASE_URL, skippable scripts, and Caddy config with custom certs.