v0.8.5 — Skills platform, shared sessions, and ghost agents
v0.8.5
Released: 2026-07-26
Tag: v0.8.5 · Diff: v0.8.0...v0.8.5
773 commits · 619 files (+97.7k/−14k) · 78 public + ~17 private-tracker issues.
Highlights
- Skills as a first-class platform capability (trinity-enterprise#182): full-directory
skill packages with a hardened frontmatter contract, tree-SHA versioning, and
manifest-based pruning (trinity-enterprise#183); a stateless skill-runner agent
executing library skills over MCP with per-skill permissions (trinity-enterprise#139,
entitlement-gated); configurable exposed skills on the A2A card (trinity-enterprise#180). - Shared sessions (rooms) — multi-agent rooms with a mention-wake turn engine, budgets,
MCP tools, and a dashboard Sessions view (trinity-enterprise#169/#170, entitlement-gated). - Agent display names — a human-facing label separate from the immutable slug, settable
at creation, rendered across the UI, pickers, search, and operator surfaces
(#1639–#1643, trinity-enterprise#181). - Telemetry, two-tier: Tier-1 local product events, default-on, never leave the box
(trinity-enterprise#184); Tier-2 opt-in fleet sharing with benchmarks (#1723,
trinity-enterprise#12 — hosted benchmark service still pending). - Ephemeral "ghost" agents — disposable budgeted agents that hard-discard at their
execution/TTL budget (trinity-enterprise#69, entitlement-gated). - Voice replies v2 — voice as a per-message agent capability with agent-level settings
and a platform ElevenLabs key (trinity-enterprise#117). - First-run experience: default system manifest seed on fresh installs
(trinity-enterprise#124), PAT-free clone of publicgithub:templates
(trinity-enterprise#123), per-user GitHub PATs (trinity-enterprise#162) withghCLI
wiring (#1574). - Async orchestration: system-emitted
agent.task.completed/failedevents wake
subscribed callers at execution terminal (#1578); agent self-reminders (#1296);
re-delivery caps + operator-queue human-gate lever (#1402). - Fleet hygiene at scale: git bloat root-caused and bounded (#1595/#1596), Docker
volume lifecycle + orphan reclaim (#1581, #1664/#1665/#1667/#1671), retention
blast-radius guard with an in-product approval path (#1638/#1644/#1709). - Trinity Helper MCP server — docs Q&A via Vertex AI Search as a dedicated MCP
surface (#1459).
Features
- #1077 canary: execution-row integrity invariants E-04, E-03, G-03 (Phase 4)
- #1142 operator_queue retention sweep in cleanup_service
- #1164 CI: gitleaks secret-scanning so embedded API keys (incl.
re_-prefixed) cannot reland - #1167 configurable loop failure policy: fail-fast vs continue-on-error
- #1296 agent self-reminders — agent-callable one-shot deferred self-trigger
- #1402 MAX_REDELIVERY cap + async operator-queue human-gate lever (lease-reaper backstop)
- #1459 dedicated Trinity Helper MCP server (docs Q&A via Vertex AI Search)
- #1574 wire the agent GitHub PAT for the
ghCLI + REST API (not just git) - #1575 one-click copy MCP connection config (embedded scoped key) for an exposed agent
- #1578 system-emitted
agent.task.completed/failedevents at execution terminal - #1609 configurable proactive channel-message rate limits (Slack/Telegram/DM)
- #1639 agent display_name — schema, API, and MCP surface
- #1640 set an agent's display label at creation time
- #1641 render agent display name on the nine roomy UI surfaces
- #1642 agent display name in pickers, search, and sort
- #1643 agent display name across remaining surfaces — operator, monitoring, executions
Private tracker (trinity-enterprise):
- ent#69 ephemeral "ghost" agents — disposable budgeted containers, auto-discarded
- ent#117 voice replies v2 — per-message voice choice, agent-level settings, platform ElevenLabs key
- ent#123 PAT-free clone of public
github:templates (source-mode, read-only) - ent#124 first-run seed of a default system manifest — starter fleet on fresh install
- ent#125 resilient system-manifest deploy — continue-on-error + partial-success report
- ent#139 skill-runner agent — stateless skill execution over MCP with per-skill permissions
- ent#144 portal: attach/upload a file directly in the portal chat composer
- ent#162 per-user GitHub credentials — each user supplies their own PAT
- ent#169 shared sessions core — room store, mention-wake turn engine, budgets + MCP tools
- ent#170 Sessions view — rooms rail, multi-party transcript, participants rail
- ent#180 a2a: configurable exposed skills on the agent card
- ent#181 rename the label, not the slug — editable display name, immutable agent id
- ent#183 skill package format — full-directory library sync/injection + frontmatter contract
- ent#184 telemetry Tier-1 local product events — activation funnel, default-on, local-only
- ent#186 (+ent#216) portal: LLM-generated thread titles + agent avatars on history rows, with subscription-OAuth fallback
- ent#212 portal: per-user memory injected into portal/delegated chat answers
Fixes
- #1474 schedule-triggered executions stored naive
started_at— UI showed wrong relative time - #1485 Config Validation: 4 critical config issues (2026-07-06)
- #1486 OPERATOR_INTAKE_ENABLED / DO_NOT_TRACK privacy kill switch was inert (not forwarded by compose)
- #1487 DISPATCH_BREAKER_ENABLED global gate unwired — breaker un-enableable, UI toggle no-op
- #1488 PUBLIC_ACCESS_REQUESTS_ENABLED documented but not forwarded by compose
- #1525 operator-queue create_item KeyError on missing created_at caused infinite sync-retry loop
- #1526 CI: frontend-e2e only ran on ui-labeled PRs — specs rotted silently
- #1533 Sharing-tab client roster showed 0 messages for every client
- #1540 canary invariant harness was blind on PostgreSQL (read stale SQLite)
- #1557 disabling agent autonomy forced circuit breaker DORMANT, blocking all inbound responses
- #1558 tests: conftest api_client fixture deleted every live agent named
test-* - #1559 soft-delete recovery dead-ended when the container was gone
- #1560 stale circuit-breaker Redis keys survived agent delete/recreate — fresh agents fast-failed
- #1561 sync-health poller hammered soft-deleted agents and poisoned their breakers
- #1562 Agent Permissions Matrix: bigger labels + no grid jump on grant/revoke
- #1577 proactive messaging toggle lost in Access tab redesign
- #1581 Docker volumes were never deleted — agent purge now reclaims workspace/public/shared volumes
- #1582 tests: TestAcquireCeilingClamp order-dependent flake (sys.modules stub leak family)
- #1593 operator intake delivery failures were logged at debug — outage invisible for 3 weeks
- #1595 git auto-gc could never complete inside agent containers — silent multi-GB
.gitbloat - #1596 git-sync workspaces grew unboundedly — auto-committed data churn bloated
.git - #1598 platform Help widget overlapped the portal chat composer Send button
- #1600 proactive messages (send_message) never persisted to channel session history
- #1601 ephemeral budget gate counted the execution's own row — max_executions=1 ghosts could never run
- #1615 password ssh-access was broken end-to-end — removed (key-based BYOK only)
- #1616 injected SSH public keys were silently wiped on container recreate
- #1617 /api/telemetry/containers cold cache reported running_count 0
- #1629 pull-claimed turns bypassed platform system prompt composition
- #1631 operator_queue global-id cross-agent collision silently swallowed requests
- #1632 operator-queue create path had no rate limit or size caps (flooding surface)
- #1636 Enterprise pages lost the top nav bar
- #1638 retention floor silently deleted pre-existing execution history on upgrade
- #1644 retention prunes had no blast-radius guard
- #1646 Cornelius template advertised semantic_search/skills the bundled template didn't ship
- #1649 proactive group messages never persisted to channel session history
- #1653 enterprise
except ImportErrorreported real registration bugs as "submodule not present" - #1660 Fable 5 / Sonnet 5 missing from platform default-model dropdown + channel whitelist
- #1661 agent-server leaked a busy-spinning reader thread (100% CPU) on stdout-pipe-race
- #1664 orphan-volume sweep could destroy a live renamed agent's home volume
- #1665 renamed agent's soft-delete recovery mounted a fresh empty workspace volume
- #1667 agent creation silently reused a pre-existing Docker volume of the same name
- #1671 agent rename now gated on volume-base ownership (one-row-per-base invariant)
- #1672 'Continue as Chat' (EXEC-023) validated across the full trigger matrix
- #1673 agent-server masked error_during_execution as a successful
context: forkplaceholder - #1702
.claude/plugins/added to the fleet-wide gitignore (plugin caches were auto-committed) - #1709 retention blast-radius guard gained an in-product approval path (agent purge could never run)
- #1712 per-agent circuit-breaker toggle no longer reports success while the global gate is off
- #1713 src/scheduler/utils.py byte-parity vendoring claim now test-enforced
- #1714 bulk watchdog sweeps now emit task-completion events (#1578 residual)
- #1743 fleet execution totals reconciled with per-agent view (soft-deleted agents' spend)
- #1745 security: deleting an agent now revokes its MCP API keys
- #1747 an agent whose container is gone is no longer invisible/undeletable
- #1768 deploy-local 500 — create_agent_internal facade dropped adopt_existing_workspace
Private tracker:
- ent#196 security/reliability: telemetry module import-order bug disabled ALL enterprise modules
- ent#213 security: deploy-local now validates archive-supplied
.mcp.json - ent#220 (partial) rooms: moderator-only lifecycle mutations + participant cap enforced
Refactors
- #1310 auth: consolidated duplicated auth/dependency patterns behind factories (INV-8)
- #1449 reliability: callback-path chat-session persistence + backlog_metadata PII scrub
- #1481 db: split db/schedules.py (2,928 lines) into concern-scoped mixins
- #1483 routers: split routers/chat.py (2,095 lines), chat logic pushed into services
- #1484 agents: decomposed create_agent_internal (830 lines, CC 120) into fenced phase-helpers
- #1652 frontend: removed superseded /enterprise/client-portal (operator-auth portal)
- #1689 decommissioned the dashboard Graph view (Vue Flow node canvas)
Documentation
- #1607 CONTRIBUTING.md — self-contained external-contributor PR guide
- #1711 per-user GitHub PAT requirements entry
- ent#151 operationalised the enterprise/OSS docs boundary (doc-follows-code routing)
- ent#206/#215 agent behavioral-evaluation strategy design (foundation ships next cycle)
- Full user-docs reconcile for 0.8.5 (#1765): FAQ, rooms, telemetry, reminders,
customer portal, What's New,llms.txt
⚠️ Behavior changes / upgrade notes
Skill loading changed for every agent (#183, ent#182)
v0.8.5 replaces single-file skill injection with full-directory skill
packages (.claude/skills/<name>/ — SKILL.md plus scripts/, templates/,
resources/), a hardened frontmatter contract, tree-SHA versioning, and
manifest-based pruning. This changes sync_agent_skills / list_skills /
get_skill for all agents — there is no feature flag.
This is a deliberate unflagged change (decision: ent#187 — accept the risk).
It is safe because it is strictly additive and backward-compatible, verified
by tests/unit/test_183_skill_packages_backward_compat.py:
- A skill with no frontmatter still lists, loads, and stays user-invocable —
a missing frontmatter block parses to an empty contract (no deps, no warnings),
with the description falling back to the first paragraph exactly as before. - An agent whose skills were synced under the old format (no injection
manifest) is re-injected in full and never destructively pruned — the
platform only ever deletes files a prior package injection wrote, so an
un-managed skill directory is overwritten, not lost. Agents self-heal to the
new package format on their next sync.
No operator action is required. If a skill directory carries a malformed
frontmatter block it is reported as frontmatter_invalid and skipped for that
skill only (the rest sync normally).
Rationale for shipping without a kill-switch, in full, is recorded on ent#187:
the change is additive, and Phases 2-3 of the skill epic (#139 placement/skill-
runner, #178 unified exposable-skills config) build on this contract, so a flag
would have a deliberately short life.
Base-image rebuild + agent recreate required for several v0.8.5 features
Ten files under docker/base-image/ changed this release. A running fleet on an
old base image degrades safely but silently lacks:
- PAT-free clone of public
github:templates (trinity-enterprise#123) — an
old image skips the tokenless clone path entirely, so a credential-less agent
created from a public template comes up empty. - Git maintenance ownership (#1595/#1596) — auto-gc disable + the auto-sync
repack/gc cycle that prevents multi-GB.gitbloat only exist in the new
image. ghCLI preinstalled +GH_TOKEN/GITHUB_TOKENwiring (#1574) — agents
on old images still need a manualghinstall.- Pull-worker scaffolding (dark,
PULL_MODE_PILOT_AGENTS-gated) and hardened
credential sanitization.
Operator action: run ./scripts/deploy/build-base-image.sh, then recreate
agents (a config-drift recreate or stop/start-with-recreate picks up the new
image). Create-before-rebuild ordering matters for ent#123: build the image
before creating tokenless-template agents.
System-manifest deploy default changed: continue-on-error (trinity-enterprise#125)
deploy_system / POST /api/systems/deploy now continues past per-agent
failures and reports partial success (HTTP 200 with status: "partial" and a
per-agent result list) instead of aborting on the first failure. Pass
strict: true in the request body to restore the previous
abort-on-first-failure behavior. Automation that treated any HTTP 200 as
"everything deployed" must check the status field.
Known limitations
- Shared sessions (rooms) ship entitlement-gated. The participant roster is
fixed at room creation — the add/remove-participant endpoints exist but have
no UI or MCP surface yet; per-message cost is not yet shown in the transcript;
turn chains run synchronously (long chains can outlive the HTTP request).
Moderator-only lifecycle mutations and the participant cap are enforced
(ent#220 fix included). Remaining residuals: trinity-enterprise#220. - Skill runner ships default-OFF behind its entitlement. Activation —
enable, provision, library sync, and per-agent access grants — is currently
API-only (no UI or MCP admin tools). Grants are not revoked when an agent
is deleted/renamed (trinity-enterprise#219); the scratch-sweep runs on
successful runs only. - Rooms and skill-runner MCP tools are advertised to all MCP clients, even
on instances without the corresponding entitlement; calls fail with a clear
error instead of the tools being hidden. - Telemetry Tier-2 sharing is opt-in and default-OFF (double-gated, honors
DO_NOT_TRACK). Fleet benchmarks show a pending status until the hosted
benchmark service ships (trinity-enterprise#12 follow-up). - Executions
tool_callsduplication (#1741) is NOT fixed in this release —
the fix regressed the #1083apply_resultcontract and was held (PR #1742). - Default system seed (trinity-enterprise#124) fires on fresh installs
only — existing instances will not see the starter fleet. An absent
local:template currently creates a blank agent silently (#1759). - The dashboard Sessions view had no visual e2e pass at merge time; smoke it
on an entitled instance.
Full diff: v0.8.0...v0.8.5
Contributors: dolho, Eugene Vyborov, andrii.pasternak, Oleksii Dolhov, obasilakis, vybe, oleksandr-korin, Pavlo Shulin, Alex, webmixgamer, tokristinamay, dependabot[bot]