server@1.3.0
Minor Changes
- 18bc769: Enforce allow-all shadow MCP policies in the hook path. Under an allow_all policy every non-Gram-hosted MCP server is permitted unless a risk_policy:block grant names its URL; bypass grants and the fail-closed inventory checks remain block_all concepts and are skipped. Projects are now limited to one enabled shadow MCP blocking policy so dispositions can never conflict at enforcement time.
- becc03b: Add
shadow_mcp_blocked_urlsto risk policy create/update payloads. Allow-all shadow MCP policies carry a canonical blocked-URL list stored asrisk_policy:blockRBAC grants held by the all-users principal — the mirror ofshadow_mcp_allowed_urls, which reconciles intorisk_policy:bypassgrants on block-all policies. The two lists are disposition-exclusive: blocked URLs are only valid on allow_all policies and allowed URLs only on block_all policies. Blocked URLs may name servers not yet observed in the project inventory (proactive blocking).
Patch Changes
-
679d489: Let the project's managed assistant act on risk findings, not just read them.
Addsplatform_list_risk_exclusionsandplatform_create_risk_exclusionfor
suppressing a whole class of findings, plus
platform_mark_risk_false_positiveand
platform_unmark_risk_false_positivefor dismissing (and restoring)
specific findings. The writes go through the same risk service methods the
dashboard uses, so they stay gated on org admin and audited against the
invoking user. Exact and regex match values are fingerprinted before they reach
the model, soplatform_create_risk_exclusionreuses an equivalent existing
exclusion rather than duplicating one the model had no way to recognise.Also keeps the assistant's context from ballooning while it triages: the
agent-facing findings listing now defaults to 25 results and caps at 50
(a 200-row page was tens of thousands of tokens that stayed in context for the
rest of the turn), and the newplatform_get_risk_rule_breakdownanswers
"which rules fire most" in one small call instead of many large pages. -
6ca548f: Add the
chatgptandchatgpt-worksources to the product-surface taxonomy now that ChatGPT/Work compliance usage is admitted to the summaries. The compliance importer now routes Work rows to thechatgpt-workhook source (ChatGPT and unknown surfaces staychatgpt) so the per-product split survives summarization — hook_source is a summary GROUP BY dimension while the rawcodex.compliance.productattribute is not, and summaries outlive the raw-row TTL. Also: achatgptchat source alias, ChatGPT/ChatGPT Work labels and the OpenAI mark in the dashboard label/icon maps and onboarding live-tail, broadened "OpenAI Compliance Logs" settings copy, and local seed fixtures emitting compliance-shapedchatgpt:usage:metricsrows for both products. -
f8ff561: Codex-product compliance COSTS rows (
codex:usage:metrics) now meter cost only. Their token counts previously rode ongen_ai.usage.*keys, which the ClickHouse agent-usage predicates sum on top of the Codex OTEL stream — the token source of truth — double counting token metering for orgs running both feeds. The raw counts are preserved under newcodex.compliance.*_tokensattributes (summed by nothing) because the compliance feed also covers surfaces OTEL never sees (cloud-delegated tasks, GitHub code review); a future surface-partitioned metering pass can promote them. Parked non-Codex rows (chatgpt:usage:metrics) keep theirgen_ai.usage.*token counts since the compliance feed is ChatGPT/Work's only usage source. -
62fce4c: Emit OpenTelemetry metrics for the device-integration sync pipeline:
gram.device_integration.sync.outcome(sync runs by provider and outcome) andgram.device_integration.sync.auto_pause(schedules auto-paused after a streak of credential rejections). These back the sync-failure-rate and auto-pause monitors for the MDM integrations rollout. -
11b3586: Fix OAuth token exchanges failing with invalid_client against providers that strictly decode HTTP Basic credentials (e.g. Snowflake): client id and secret are now form-urlencoded before being placed in the Authorization header, per RFC 6749 §2.3.1.
-
d4d8de2: The project assistant can now create project skills from complete
SKILL.mdcontent. The newplatform_create_skilltool uses the same validation, versioning, permissions, feature gating, and audit logging as manual skill creation. -
9161dc7: Internal data changes to the risk findings backfill tooling.
-
af439f5: Internal schema changes to the risk findings store.
-
1dbad64: Internal data changes to risk finding ingestion.
-
ae3979c: Admit
chatgpt:usagerows (ChatGPT/Work usage+spend from the OpenAI compliance COSTS import, previously retained but unread) into the agent-usage predicates ofattribute_metrics_summaries_mvandchat_session_summaries_mv, via atomic MODIFY QUERY migrations. ChatGPT tokens now count toward tokens-under-management and appear in usage/cost analytics going forward, matching how Claude Chat (Anthropic Admin Analytics) and Cursor (Admin API) polled usage already bill. Applies to new rows only — previously parked rows are retained but not backfilled into the summaries. Also updates the stale MV comments that claimed no newcodex:usagerows are written (the compliance import writes them, cost-only since the token double-count fix). -
3e1ad9e: Exclude unattributed authz challenges from the challenge buckets endpoint so the Challenges page pagination and totals match what is rendered
-
b131cea: Project assistant tool calls now render Claude-style: the assistant precedes each tool batch with a terse activity phrase ("Investigating failures in the last 30 days") which becomes the heading of a single collapsed tool group. Consecutive batches merge into one group whose heading advances (with shimmer) as the investigation progresses, groups never auto-expand, and the global thinking loader hides while a tool group is streaming. The dashboard output-channel guidance instructs the model to emit the phrase before every tool call.