Skip to content

v0.8.5 — Skills platform, shared sessions, and ghost agents

Choose a tag to compare

@vybe vybe released this 28 Jul 14:52
· 33 commits to main since this release
b8cf94c

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 public github: templates
    (trinity-enterprise#123), per-user GitHub PATs (trinity-enterprise#162) with gh CLI
    wiring (#1574).
  • Async orchestration: system-emitted agent.task.completed/failed events 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 gh CLI + 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/failed events 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 .git bloat
  • #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 ImportError reported 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: fork placeholder
  • #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 .git bloat only exist in the new
    image.
  • gh CLI preinstalled + GH_TOKEN/GITHUB_TOKEN wiring (#1574) — agents
    on old images still need a manual gh install.
  • 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_calls duplication (#1741) is NOT fixed in this release —
    the fix regressed the #1083 apply_result contract 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]