v0.9.0
Released: 2026-08-17
Tag: v0.9.0 · Diff: v0.8.5...v0.9.0
499 commits · 1,367 files (+220k/−38k) · 155 public + 62 private-tracker issues (+21 enterprise PRs closed at merge; see the commit-reconciled addendum) · enterprise submodule e898cef → 65182c1.
Freeze plan and coherence review: v0.9.0-freeze-plan.md.
Highlights
- Workspace — the client surface, now in every build. The client portal moved
from an entitled module into OSS core (trinity-enterprise#356) and became
Workspace: one click from the platform (ent#357), the Session tab absorbed
into it (ent#358), an agent page per agent (ent#360), sidebar IA with agents,
starred and dated chats (ent#359), chats with one or more agents and @mention
to bring an agent in mid-chat (ent#361/#362, rooms-engine, entitlement-gated),
a/playbooks +@agents composer typeahead (ent#392), skill hints in chat
(ent#380), streaming turns (ent#286), sliding session renewal (ent#375),
client sign-out and re-entry blocking (ent#281), per-client rate limits
(ent#287), delegated identity via token exchange (ent#163), the Sessions page
retired (ent#381) — plus a sweep of roster, load-time, layout, readability,
voice-mode, timeout and sign-out fixes (#2196/#2198/#2211–#2214/#2258). - Fresh-install provisioning (trinity-enterprise#122 slice): the agent
catalog now resolves through a remote template registry (ent#14), a
GitHub-repo import wizard with fork / copy / clone-own intents (ent#15),
install a system from a manifest in the UI (ent#126), guided per-agent
credential setup (ent#127) on the new Trinity-installable agent standard
(ent#128), bind an agent to a repo you own from Agent Detail (ent#109), and
template.yamlschedules materialized at creation (ent#89). - Skills platform, phase 2 (trinity-enterprise#182): the Skills tab rebuilt
(ent#235), library lifecycle automation — scheduled auto-sync, fleet re-inject,
removal-on-unassign (ent#236), a multi-source library with a bundled
community repo + per-instance custom repos (ent#237), vendor-neutral layout
(ent#332), the Templates page renamed Library (ent#263) with a tabbed
Skills section that shows which agents hold each skill (ent#384). - A2A, bidirectional: an inbound A2A server — public Agent Card + JSON-RPC/SSE
task endpoint, per-agent opt-in (ent#157) — with a config UI (ent#158) and MCP
control tools (ent#160), plus outboundcall_a2a_agentto operator-
registered external endpoints (#736). - Dashboard: the Agents page folded into a List view (ent#260),
type-to-filter across all views (ent#261), a grid widget chassis with the
first data tiles — Executions by trigger, Recent failures (ent#325/#96/#100
over the newGET /api/executions/timeline, ent#326), an org overlay of
departments and reporting lines (ent#305), the scanline data-loading motion
language (ent#245), the sevenBase*design-system primitives (#2122) and a
dark ink-ladder sweep (#1922). - Agent Reports, complete (Epic #1534): prompt guidance (#1535), Excel/PDF
export (#1536), large-payload paging (#1537), MCP read-back (#1538), search &
filter (#1539). - Reliability at scale: automatic database backups for SQLite and
PostgreSQL (#2216), bounded container logs (#1871 — the disk-full/dockerd
wedge class), rebuilt base images now actually adopted on cold start, fleet
restart and bytrinity-system(#1809/#1860/#1816), the terminal-activity
close contract (#1804), a first-run seeding race fixed (#2215), orphan
containers reclaimed on failed creation (ent#313), log archival un-wedged
(#2205), one shared single-flight lock primitive (#1920), and a canary harness
that runs on prod compose, elects one leader, names its instance, retries lost
Slack alerts, reports its own run-state, and stops paging on four false-positive
classes (#1878/#1881/#1987/#1897/#2217/#1813/#1880/#1990, ent#335/#337/#372). - Security:
require_admin/assert_adminreject agent-scoped principals
(ent#297 — root cause of four prior escalations, incl. ent#293/#346), hardened
YAML everywhere author-controlled input is parsed (ent#314, #1884, #1965), a
path-traversal fix in template resolution (#1900), per-spawn execution
environments so a removed credential stops reaching executions (#1999/#2114),
PAT-scrubber under-match fixes (ent#292/#347, #2052), SSRF fixes on Slack and
WhatsApp media downloads and the CGNAT range (#1951, #1932, ent#393/#394),
durable audit hash-chain (#2015/#1984), portal sign-in brute-force and
enumeration protection (ent#309/#311, #308), first-class agent MCP keys with
verification and rotation (#1854), and the A2A outbound edge sweep
(#2174/#2175, ent#395–#399). - Channels & agent runtime: Telegram in-progress indicator (ent#264) and
long-task report-back (ent#265), ZIP uploads in chat (ent#391),ask_trinity
docs Q&A over MCP (ent#328),.mcp.json.templatefinally rendered for
github:agents (#2007), a committed self-healing plugin manifest (#1704),
Codex runtime model/auth fixes (#1971/#2207), and behavioral-evaluation
foundations — the referee surface (ent#267) and a cross-model referee (ent#277). - Abilities marketplace: structure for agentic systems. This release cycle
pairs the platform with a marketplace cycle that introduces a new level of
organization into agentic systems — the structural primitives fleets need to
collaborate: a shared canon (a canonical-data layer with
publish/consume/reconcile, deterministic linting, and per-counterpart
relations — add-canon 1.0→1.6), system-aware orchestration with
install-time divergence detection, a bundle-wide--autonomousrun mode and
event choreography, playbooks as the unit of inter-agent work
(playbook-call), and repository-first creation & in-place onboarding —
the marketplace half of the platform's pre-installed Trinity plugin
(ent#411/#1704), a tighter integration of the plugin marketplace and the
platform. Full list in the Abilities Marketplace
section below.
Features
- #736
call_a2a_agentMCP tool — outbound A2A protocol calls to registered external agents - #925 client-side cron validation + warning icon for invalid schedules
- #1534 Epic: Agent Reports — richer creation, export, scale, read-back & search
- #1535 report-tool guidance injected into the agent platform prompt
- #1536 download & render reports as Excel / PDF
- #1537 reports at scale — 5 MiB payload cap + row-windowed table reads
- #1538 agents read back their own reports over MCP
- #1539 search & filter reports (fleet + per-agent)
- #1813 canary H-01: fail loud when a SQL-tier collector reads zero rows on a provably non-empty fleet
- #1854 first-class agent-scoped MCP keys — visibility, verification, regeneration, self-heal
- #1987 canary Slack alerts name the instance that fired them
Private tracker (trinity-enterprise):
- ent#14 remote template registry — the agent catalog served from an external, self-updating repo
- ent#15 GitHub-repo import wizard — fork / archive-copy / clone-own with inline compatibility check
- ent#89 materialize
template.yamlschedules at agent creation (disabled by default) - ent#96 grid tile: Executions — hourly chart by trigger type (24h)
- ent#100 grid tile: Recent failures — latest failed executions fleet-wide
- ent#109 bind an agent to a GitHub repo you own — post-creation ownership retrofit from Agent Detail
- ent#126 install a system from a manifest via the UI — paste/upload/pick → dry-run → deploy
- ent#127 guided per-agent credential setup — required-credentials checklist with status and how-to-get
- ent#128 "Trinity-installable agent" standard — per-variable credential setup metadata in
template.yaml+ contract doc - ent#157 A2A inbound server — public Agent Card + JSON-RPC/SSE task endpoint
- ent#158 A2A config UI — per-agent exposure, card URL, skill curation, inbound allow-list & outbound endpoint registry
- ent#160 A2A control over MCP — exposure, card, allow-list & outbound endpoints as MCP tools
- ent#163 Workspace: delegated identity — a trusted backend acts as an end user via token exchange
- ent#199 benchmark selection decision — Terminal-Bench 2.1 + TRB + borrowed-host scorer
- ent#235 Skills management surface — the Skills tab rebuilt (library browse, assignment, injection status)
- ent#236 skills library lifecycle automation — scheduled auto-sync, fleet-wide re-inject, removal-on-unassign
- ent#237 multi-source skills library — bundled public community repo + per-instance custom repos
- ent#245 scanline loading animation — the app's default data-loading motion language
- ent#260 dashboard List view replaces the standalone Agents page (timeline · grid · list)
- ent#261 hotkey type-to-filter across dashboard views
- ent#263 Templates page renamed Library — one surface for agent templates + the skills library
- ent#264 Telegram: in-progress status indicator while a task runs
- ent#265 Telegram: long-running task reports back to the originating chat on completion
- ent#267 behavioral-eval referee surface + Completion relabel (foundation)
- ent#277 cross-model validation — an independent second-model referee
- ent#281 Workspace: log out a signed-in client (revoke sessions) + block re-entry
- ent#286 Workspace: portal-session streaming path
- ent#287 Workspace: per-client rate limits on portal chat and upload
- ent#305 grid view org overlay — department zones + reporting lines
- ent#325 grid widget chassis — InfoTile,
GRID_WIDGETSregistry, layout v2, Tiles menu - ent#326
GET /api/executions/timeline— bucketed execution rollups for the grid data tiles - ent#328
ask_trinitydocs Q&A tool in the Trinity MCP server - ent#332 vendor-neutral skills-library layout — per-source skills root
- ent#348 compliance audit API — auditor-facing pull export of the audit log
- ent#356 Workspace: client portal moved from entitled module to OSS core
- ent#357 Workspace: rename Client Portal and open it in one click from the platform
- ent#358 Workspace: absorb the Session tab
- ent#359 Workspace: sidebar IA — agents block on top, starred chats, dated chats
- ent#360 Workspace: agent page — clicking an agent opens its page
- ent#361 Workspace: create a chat with one or more agents; @mention adds an agent mid-chat
- ent#362 Workspace: admit a workspace user as a room participant
- ent#375 Workspace: sessions survive — sliding renewal instead of a hard 12-hour expiry
- ent#380 Workspace: skill hints in chat
- ent#381 Workspace: retire the Sessions page + nav entry
- ent#384 assign skills to agents from the Library — per-skill agent list, tabbed Library with a Skills tab
- ent#391 ZIP file uploads in chat (Slack/Telegram/WhatsApp + web)
- ent#392 Workspace composer typeahead —
/for the agent's playbooks,@for reachable agents
Fixes
- #1634 toggling a schedule scrolled the Schedules tab back to the top
- #1656 Cornelius seed vault MOCs linked to notes that don't ship
- #1677 platform operator-queue alert emitters bypassed the #1632 ingestion caps
- #1704 agent plugin install-state lost on container recreate → committed
.trinity/plugins.yaml+ boot self-heal - #1741
schedule_executions.tool_callsstored a verbatim copy ofexecution_log - #1775 integration suite ran only 6 of 83 tests when collected as a directory
- #1782 frontend-e2e
changespath-filter hard-failed on PRs >300 files - #1788 docs advertised two install paths that fail on a fresh machine
- #1791 README install + first-time-setup instructions were stale
- #1796 schedules on a non-autonomous agent were silently skipped with a live countdown
- #1804 recovery paths wrote execution terminals without closing the paired activity (agent "running" for up to 2h)
- #1806 self-reminders on a non-autonomous agent were silently held
- #1808
freeze_schedules_if_sync_failingwas never enforced - #1809 a rebuilt agent base image was never picked up — no image-drift predicate
- #1810
/api/versionreported "unknown" withoutstart.sh - #1811
recreate_missing_containerrebuilt a divergent container (dropped mounts, minted a new MCP key) - #1814
start.shnever rebuilt platform images on an in-place upgrade (version now reports the code in service) - #1816
trinity-systemnever adopted a rebuilt base image - #1821
PUT /agents/{name}/labelsilently cleared the label on an unknown body field - #1823 legacy IANA timezone aliases (Europe/Kiev …) crashed schedule creation with a 500
- #1831 mid-string
Zin agent-suppliedfire_atpassed validation then 500'd - #1832 negative
duration_msfrom clock skew reached the Overview chart unguarded - #1833
retention_guard.evaluatecould raise on a non-numeric count - #1834 a failed retention-guard alarm permanently suppressed its own retry
- #1840 Sonnet 5 / Fable 5 recorded a 200K context window on most runs
- #1841 system-deploy dry run passed a manifest with an unresolvable template
- #1842 skill-package prune left empty directories behind
- #1848 MCP key row metadata misaligned for never-used keys
- #1849
errors[0]picked Claude Code's[ede_diagnostic]header, defeating resume-not-found self-healing - #1853
error_during_executionruns stored zero telemetry - #1860 fleet restart bypassed
start_agent_internal— no agent adopted a rebuilt base image on "Restart All" - #1862 default Settings panel too narrow
- #1870 completed turn discarded on
error_during_execution—jsonl_recoverynever consulted - #1871 container logs unbounded — no
json-filemax-size anywhere; filled the disk and wedged dockerd - #1878 canary harness could not be enabled on any deployed instance (
CANARY_ENABLEDabsent from prod compose) - #1880 five Phase-4 canary invariants alerted with no name, runbook, or detail
- #1881 canary had no cross-worker leader lease (double cycles under
--workers 2) - #1888 white overscroll band behind the app
- #1891 CI validated on Python 3.11 while every shipped image runs 3.13
- #1895 108 test files sat in
tests/root where no CI job ran them - #1896 the live-instance integration suite had no CI home
- #1897 a failed canary Slack post was counted as delivered and never retried
- #1898
test_ent183_skill_packagessys.modules stubs poisoned later tests - #1909
test_a13_exact_cutoff_row_is_not_expiredwas wall-clock flaky - #1914 navigating to a non-existent agent rendered a blank page
- #1919 fleet-restart lock: lease refresh not ownership-checked
- #1920 seven hand-rolled Redis single-flight locks → one shared
SingleFlightLock - #1926 fetch failures rendered as empty states or vanished silently
- #1931 the agent catalog still shipped 11
dd-*VC-demo templates and a Dec-2025 GitHub repo list - #1932 WhatsApp inbound media download always failed — SSRF allowlist rejected Twilio's own CDN
- #1941 nightly unit-suite reported a false merge conflict on every PR
- #1945
set_autonomy_statuserased per-schedule enabled intent - #1953 Agent Detail toast overlapped the header controls
- #1967 global GitHub PAT rotation never reached agents without
.env - #1968 manual schedule trigger always returned
execution_id: undefined - #1969 cron tick suppressed by the distributed lock left no execution record
- #1971
codex_runtime.pyunconditionally setCODEX_API_KEY, discarding a valid subscription auth - #1990 canary E-01 had no lease-awareness — fired on legitimately-running pull turns
- #1994
_execute_process_schedulelock-denial branch unaudited (sibling of #1969) - #2006 deploy-local persisted an archive whose
.mcp.jsonfailed validation - #2007
github:templates never rendered.mcp.json.template— declared MCP servers silently absent - #2008
POST /api/credentials/updatehad no callers but was named as the sanctioned MCP-config path - #2016 a duplicated
GITHUB_PATline survived rotation and won - #2017 a backslash in the token raised
re.errormid-rotation - #2019 a single hanging test burned the 25-minute unit-suite budget (no
--timeout) - #2023
.envquote-escaping was write-only — a credential with a double quote round-tripped corrupted - #2027
ask_trinitytruncation could split a surrogate pair; session-less response lost caller context - #2035 #848 inline email auth — a verified session was discarded on the next request
- #2036 base image baked container-only hook paths into
~/.claude/settings.json; external clones bricked - #2048 pull pilot can only route agent-to-agent work — claim corrected, cron/schedule stays on push
- #2050 mcp-server's unbounded
fast-urioverride let a major bump past ajv's declared range - #2052 free-text PAT scrubbers only fired on a literal
https:// - #2068 enterprise submodule pin advance landed two Alembic heads — entitled instances degraded to OSS-only
- #2069 the fleet-wide
.gitignoremerge never ran at agent creation - #2070 first backend Push untracked template-committed
.trinity/pre-checkand pushed the deletion - #2092
recreate_container_with_updated_configunconditionally started the container - #2101 Workspace new-chat briefing rendered capability hints as an unbounded card grid
- #2114
.env-residentANTHROPIC_API_KEYshadowed subscription auth in the per-spawn execution env - #2127 turn ending with background subagents in flight recorded SUCCESS and discarded the work
- #2128 Workspace multi-agent chat picker offered on builds with no rooms backend
- #2130 Agent Detail
?tab=deep-link applied ~10s late and overrode the user's click - #2131 #1804 terminal-activity parity guard didn't scan
client_portal/ - #2133 Workspace
awaitPersistedReplycould poll for an hour on an orphaned in-flight marker - #2140
test_inject_assigned_credentialsleaked a stubbed module intosys.modules - #2153
?tab=deep-links to a2a/loops/playbooks/access/nevermined silently landed on Overview - #2157 agents told Workspace clients the surface is text-only — portal TTS never advertised
- #2159 Workspace sidebar roster — no loading state, unbounded list, slug-as-title
- #2160 Workspace agent page initial load slow — build_page profiled and parallelized
- #2161 Workspace agent page UX — Overview chart reuse, asks get their own tab
- #2162 Workspace Reports tab showed raw JSON to clients — display_hint renderers reused
- #2169 Workspace Overview layout — activity + recent work share a row, asks move below
- #2193 agent-header 7d cost sparkline permanently flat on PostgreSQL
- #2196 Workspace roster listed agents with no container — now a per-card availability state
- #2198 Agent Detail and Workspace over-fetched on load (21 redundant requests, N+1 roster)
- #2199 seven frontend e2e specs failed on stale constants and a missing fixture agent
- #2200
/filter hotkey silently dropped for ~50ms after the dashboard painted - #2204 Deploy to Dev had failed on every run since 2026-08-10
- #2205 log archival was dead —
/data/archivesroot-owned while the backend runs as UID 1000 - #2207 Codex runtime pinned a retired model and mis-estimated cost for every current GPT-5.x model
- #2211 Workspace chat readability — line spacing, message column, composer scrollbar
- #2212 Workspace voice mode started the mic and stopped instantly, every failure silent
- #2213 Workspace composer
/typeahead listed only part of an agent's skills - #2214 Workspace chat turns were hard-capped at 300s, ignoring the agent's execution timeout
- #2215 fresh-install seeding raced itself across workers — two seeders allocated the same SSH port
- #2216 shipped database backup tooling was never invoked — now scheduled, both backends
- #2217 canary harness left disabled on a retired constraint, and nothing reported whether it ran
- #2228 Executions grid tile clipped its legend mid-row
- #2241
MagicMockblockedassert_*attributes — 14 api-tier tests broke at import - #2242 stale test mocks drifted from #1804, #2015 and ent#237
- #2243 calendar-expiring tests and stale strict-xfails kept 17 tests permanently red
- #2245
_git_toplevelmissed a home-rooted repo whenworkspace/is a separate mount - #2247
test_ent96_timeline_splitred on dev since 2026-08-15 — stale date fixture
Private tracker (trinity-enterprise):
- ent#218 rooms: message-budget termination discarded the final agent reply (billed, lost) and 410'd a landed human message
- ent#219 skill-runner: ACL grants survived agent delete/rename
- ent#241
backend/__init__.pyregisteredskill_runnertwice and bypassed the isolation wrapper for 3 modules - ent#313 failed agent creation leaked an orphan container that also blocked its own volume reclaim
- ent#335 canary E-06 fired every cycle on schedules of soft-deleted agents (94% of all violations)
- ent#337 canary R-01 paged critical on a single transient zombie
- ent#372 canary S-03 reconstructed a slot's initial TTL from two readings taken seconds apart
- ent#397 A2A refusal reason derived by substring-matching its own human message
- ent#398 an A2A endpoint on port
:0validated but was permanently refused - ent#399
_same_origincompared IPv6 literals textually
Security
- #1884 harden
parse_manifestagainst YAML anchor/alias expansion and duplicate keys - #1900 path traversal in template resolution:
local:<id>read escape + cross-tenant.mcp.jsonstaging - #1908 sage/scout/scribe templates shipped no
.gitignore— every agent born with 4 hard findings - #1917 exception messages flowed into ops/system-agent API responses (stack-trace exposure)
- #1951 Slack
download_filehad no SSRF allowlist and blind-followed redirects - #1965 agent server still parsed author-controlled YAML with bare
safe_load— vendoredsafe_yaml - #1966
POST /api/settings/ops/resetwrote no audit entry - #1970 scheduler
create_executionnever populated execution origin columns - #1984 audit-log verify returned
valid:truewithchecked:0 - #1999 credential injects mirrored
.envinto the long-lived agent-server env — removed keys kept reaching executions - #2015 audit hash chain did not survive a backend restart — now persisted, chain head read in-transaction
- #2075
_detect_git_dirpicked the wrong repo root for agents with a populatedworkspace/directory - #2094 schedule enable/disable/trigger always 422 (regression from #2081 CSO M1)
- #2174 deleting one A2A endpoint could remove two, destroying a stored credential
- #2175 four low-severity A2A outbound edge defects (origin pin, port 0, reason codes, blank credential)
- #2258 Workspace "Sign out" didn't sign out — the platform JWT silently re-authenticated on refresh
Private tracker (trinity-enterprise):
- ent#220 shared-sessions: turn-engine budget/idempotency edge + role enforcement + participant-cap residuals
- ent#292 orphan sweeper logged reaped process cmdlines verbatim — git PAT leaked to container logs
- ent#293 agent-scoped MCP key passed
assert_admin—skills_library_urlrepoint enabled fleet-wide prompt injection - ent#297
require_admin/assert_admindid not reject agent-scoped principals — admin on all 114 admin-gated routes - ent#308 portal inbox directory collided across client identities — cross-client file read + overwrite
- ent#309 portal sign-in leaked client existence through response timing
- ent#311 portal OTP sign-in had no brute-force protection
- ent#314 harden author-controlled YAML (
template.yaml) against alias-expansion amplification and duplicate keys - ent#334
/skills/library/statusdisclosed source repo URLs to any authenticated principal - ent#346 agent-scoped MCP key could inject a fleet-wide skills source via
PUT /api/settings/skills_library_url - ent#347 both PAT scrubbers under-matched a double-
@URL - ent#393 mapped-CGNAT bypassed the SSRF destination predicate on the A2A outbound and template-registry paths
- ent#394
mcp_validator's internal-address predicate had no CGNAT clause - ent#395
remove_endpointdeleted every A2A endpoint matching an id-or-name - ent#396 a whitespace-only A2A credential silently cleared the stored secret
Refactors
- #1710 audit and retire the
slack.pyinv8 carve-out left by #1310 - #1922 dark ink-ladder sweep — raise dark-theme meta text off gray-500/600
- #2080 test harness: honest full-suite runs — collection breakage, PG/Alembic + git-sync tiers, skip-audit gate
- #2086 centralize the selectable model catalog — one source of truth for three hand-synced lists
- #2104 retire the vestigial agent
typetaxonomy - #2122 the seven
Base*primitives the design-system contract mandates - #2132 delete orphaned
views/enterprise/Sessions.vue - #2137 align the agent-compatibility catalog with what the platform implements (88 checks, 12 categories)
Documentation
- #2055
TRINITY_ONBOARD_PLUGIN.mdPhase 7 documented an.mcp.jsonwriter onboard no longer has - #2089 consolidate three drifting screenshot stores into one manifest-guarded store
- ent#83 Workspace: API-completeness matrix re-verified + gaps filed
- Design system: system of record, builder contract, reference page + raw-color scanner & ratchet baseline
- Trinity FAQ — 264 grounded Q&As across 14 topic pages; architecture explainer video; CSO full-codebase audit report (2026-07-13); open research folder
Other changes
- Retention community floor applied by seeding fresh installs, not by lowering prune-time defaults (no-issue, #1638 follow-through)
- Skill paths sanitized at one chokepoint (no-issue)
- Avatar generation: thinking-token truncation no longer drops the color-scheme block (no-issue)
- 34 dependency bumps (dependabot)
Abilities Marketplace (ecosystem)
Added post-release by the marketplace sweep. Window: v0.8.5 → v0.9.0
(2026-07-26 → 2026-08-17), plus the post-tag v0.9.0 platform-truth sync.
Marketplace items reference abilityai/abilities PRs or short commit SHAs.
The abilities plugin marketplace ships
as part of the platform ecosystem, and this cycle is the thematic companion to
v0.9.0: together they introduce a new level of organization — and a new level
of control — into agentic systems, the structural primitives agents need to
collaborate as systems rather than as individuals, with tighter integration
between the marketplace and the platform (the platform now pre-installs the
Trinity plugin in every agent image, ent#411/#1704; the marketplace answers with
in-place onboarding and platform-truth syncs). Four primitives carry the theme:
a shared canon, system-aware orchestration, playbooks as the unit of
inter-agent work, and repository-first creation & onboarding.
Canon — a shared canonical-data layer (agent-dev)
- add-canon 1.0: fleet canon repo on plain git — per-agent owned folders with publish/consume/reconcile skills; add-orchestrator goes canon-aware (
5830340) - add-canon 1.1: fleet enrollment — align mapped agents with the canon from the orchestrator; discover-agents canon coverage (
32e785e) - add-canon 1.2: access verification + the deployed-credential story; new
/canon-doctorruntime skill (9bd3c47) - add-canon 1.3: live-delivery guarantee — pull-first reconcile, fleet activation offer, undeliverable-agent visibility (
bd55171) - add-canon-lint 1.0: deterministic (no-LLM) canon KB linting on push/PR + the two-zone lintable schema (ent#274) (
fb3a808) - add-canon 1.5: the publish test — what belongs in canon; canon-publish review gate (
387f80f) - add-canon 1.6: relations — per-counterpart collaboration memory, read before acting on a counterpart's ask, appended before closing (
749d924)
Playbooks — the unit of inter-agent work (agent-dev / create-agent)
- playbook-call: playbooks become the unit of inter-agent work — agent-dev 1.14.0, create-agent 1.13.0 (
70c1e60) - 9 generated schedule messages conformed to the playbook-call grammar (
898ede4) - library-grade playbook authoring: create-playbook 2.12/2.13 (bundled tier templates) + adjust-playbook 1.8/1.9 Trinity-first refresh (
7c91354,ddf0420)
Orchestration (agent-dev / add-orchestrator)
- install-time divergence detection —
--checkmode + overwrite-prompt wiring (Abilityai/abilities#13) --autonomouspromoted to a bundle-wide run-mode convention (Abilityai/abilities#14)- allowed-tools realigned with skill bodies (Abilityai/abilities#9); stranded sync-fleet-to-head & profile-fleet universalized (Abilityai/abilities#10)
- event choreography: orchestrate v1.11 teaches the event layer's emit side; onboard v5.1 custom-events note (
4305e5e)
Creation, deployment & onboarding — tighter platform integration (trinity / create-agent / agent-dev)
- deploy-as-is → onboard-in-place:
/trinity:onboard6.0 in-place mode,/trinity:syncplugin reconcile,plugins:blocks everywhere — the marketplace half of the platform's pre-installed Trinity plugin (ent#411 / #1704) (b39a110) - repository-first agent deployment across trinity, create-agent and agent-dev (
19e8f1f) /trinity:start-here: a guided, resumable first journey into Trinity, grounded in live platform docs (5cd6a27,629aabb)- create-agent 1.8.0: Trinity-connected deploy becomes the default (confirmation-gated) end-of-wizard action (
6988238)
Fleet analysis & migration (agent-dev)
- agent-fleet-analysis v2.3: universal fleet analysis across paradigms — Claude Code, n8n exports, LangChain/CrewAI/AutoGen, freeform-coded agents (
aa14e23) - agent-fleet-migrate v1.0: execute the fleet-analysis work order into a verified Claude Code fleet, non-destructively (
8ba9ac4)
Collaboration conventions (agent-dev / create-agent)
- cross-actor project management: add-project-management v1.0/v1.1 (intake primitive, headless task creation, reconciler), then folded into agent-dev (
4c48dca,4a43766,2a07655,9b9b2d8) - Request Dispatch SOP convention — create-agent 1.9.0 + agent-dev 1.7.0 (
1c351fd) - loop-closure: close the loop with the user, hand back the loops owed to others (
9c9a9ab)
Marketplace-wide
- platform-truth realignment with Trinity dev — five production blockers + stale contracts fixed (
dc855a3); post-tag v0.9.0 platform-truth refresh of the trinity-knowledge pack — headless fork wait (#2127),.mcp.jsonpublic-URL rule (ent#394), agent-scoped report guard, autonomy banner (#1796) (4e3d050) - create-agent:website v1.3 (
13deed4)
⚠️ Behavior changes / upgrade notes
Rebuild the platform images (backend image gains postgresql-client-17)
As in v0.8.5 (#1814): start.sh does not rebuild platform images. This release
changes all four platform Dockerfiles — the backend now bakes
postgresql-client-17 for PostgreSQL backups (#2216) and both Python images
carry the tz-database + Python-version parity guards (#1823/#1891):
git checkout v0.9.0
docker compose build # or: docker compose build backend frontend mcp-server scheduler
./scripts/deploy/start.shGET /api/version reports version (code in service) and image_version
(the build it runs inside) — if they differ, the image is stale.
Base-image rebuild + agent recreate — and it now actually propagates
25 files under docker/base-image/ changed. A fleet on the old image degrades
safely but silently lacks:
.mcp.json.templaterendering forgithub:agents (#2007) — declared
MCP servers were never installed before.- Per-spawn execution environments (#1999/#2114) — a credential removed from
.envstops reaching the next execution; a stale.envANTHROPIC_API_KEY
no longer shadows subscription auth. - Committed, self-healing plugin manifest
.trinity/plugins.yaml(#1704). - Hardened YAML parsing (#1965), the container-only hooks path fix (#2036),
the discarded-turn recovery (#1870), PAT-free orphan-sweep logging (ent#292),
Codex auth/model fixes (#1971/#2207).
Operator action: ./scripts/deploy/build-base-image.sh, then stop and
start each agent (or use Operating Room → Restart All). Unlike v0.8.5, a cold
stop/start now detects a rebuilt image and recreates the container (#1809), the
fleet restart routes through the same lifecycle (#1860), and trinity-system
adopts on its next stop/start (#1816). A start of an already-running agent
never image-recreates it.
Template catalog now resolves through a remote registry by default (ent#14)
The GitHub half of the catalog is fetched at runtime from
TEMPLATE_REGISTRY_URL (default: the public Abilityai/trinity-templates
registry) — a new outbound fetch, and the bundled GitHub-repo floor plus the
11 dd-* demo templates were removed (#1931). Air-gapped / egress-controlled
installs: set TEMPLATE_REGISTRY_ENABLED=false (or use the admin override —
Settings → Template Registry shows live status). Fetches are byte-capped,
SSRF-validated (incl. CGNAT, ent#393), and fail open to the bundled catalog.
Automatic database backups are ON (#2216)
A nightly (03:30 UTC) verified recovery point lands under ~/trinity-data/backups/
(/data/backups/) for both SQLite and PostgreSQL, plus a boot-time
pre-migration copy when a migration is pending. Retention backup_retention_days
(default 14, floor 3 kept). Budget disk accordingly — free-space preflight skips
loud, never prunes-to-make-room. DB_BACKUP_ENABLED=false disables. Same-disk
scope only: this protects against corruption and bad migrations, not disk loss.
Container logs are bounded (#1871)
json-file logging is capped (10m × 3 by default; CONTAINER_LOG_MAX_SIZE/ _MAX_FILE for platform services, AGENT_LOG_MAX_SIZE/_MAX_FILE for agents).
Platform services adopt on the next docker compose up; agents on recreate.
Vector's aggregate under /data/logs remains the primary queryable log.
/data/archives is now writable by the backend, so log archival runs again
(#2205) — expect it to reclaim a backlog on the first pass.
Admin gates reject agent-scoped principals (ent#297)
require_admin / assert_admin now refuse any agent-scoped MCP key, closing
the class where an admin-owned agent's TRINITY_MCP_API_KEY was admin on every
admin-gated route. Automation that drove admin endpoints with an agent's key
must switch to a user-scoped key. Agent self-check flows (heartbeat, reports,
result callbacks) are unaffected.
Skills library: skills_library_url → skill_sources (ent#237)
The single skills_library_url setting is replaced by a multi-source table
with a bundled community source (TRINITY_DEFAULT_SKILL_SOURCE, tag-pinned;
set to "" to disable — the passthrough is now wired in both composes) plus
admin-added custom repos. An existing skills_library_url is adopted as a
custom source; the legacy checkout keeps rendering until you re-sync. Tag pins
that move are refused, never adopted (moved_tag).
Navigation IA changes (all legacy routes redirect)
- Templates → Library (
/library, ent#263) with tabs Agent Templates ·
Systems · Skills (ent#126/#384). - Agents page → Dashboard List view (
/agents→/?view=list, ent#260). - Agent Detail Session tab → Workspace (
?tab=session→/workspace?agent=,
ent#358); the Sessions page and its nav entry are retired (ent#381). - Client Portal → Workspace (
/workspace), available in every build
(ent#356/#357). The/api/enterprise/client-portalprefix and
enterprise_portal_*table names are retained history, not licensing.
Schedules and autonomy
- Toggling autonomy no longer rewrites per-schedule
enabled(#1945); an
off→on cycle restores prior per-schedule intent. - Schedules on a non-autonomous agent are surfaced as held instead of silently
skipped with a live countdown (#1796); same for self-reminders (#1806). freeze_schedules_if_sync_failingis now enforced (#1808).
Enterprise instances
Bump the src/backend/enterprise pin to 65182c1 (enterprise-main tip). The
pin advance includes the Alembic single-head fix (#2068) — earlier pins made
entitled PostgreSQL instances silently degrade to OSS-only — and the removal of
the enterprise client_portal module (ent#356), which would otherwise mount a
duplicate router on the same prefix.
New environment variables (all optional, forwarded in both composes)
TEMPLATE_REGISTRY_ENABLED / TEMPLATE_REGISTRY_URL · DB_BACKUP_ENABLED /
_HOUR / _MINUTE / _PG_DUMP_TIMEOUT_SECONDS · CONTAINER_LOG_MAX_SIZE /
_MAX_FILE · AGENT_LOG_MAX_SIZE / _MAX_FILE · TRINITY_DEFAULT_SKILL_SOURCE
/ _REF · SKILLS_FLEET_INJECT_CONCURRENCY / SKILLS_RECONCILE_MAX_REMOVALS ·
PORTAL_CHAT_BURST_LIMIT / _HOURLY_LIMIT · PORTAL_UPLOAD_BURST_LIMIT /
_HOURLY_LIMIT · PORTAL_TITLE_MODEL / _TIMEOUT_SECONDS · A2A_OUTBOUND_ENABLED
· MCP_A2A_TIMEOUT_MS · MCP_INLINE_AUTH_ENABLED / _TIMEOUT_MS ·
OPERATOR_ALERT_MAX_PENDING_PER_TYPE · CANARY_ENABLED / CANARY_SLACK_WEBHOOK_URL
(now reach prod compose, #1878) · TRINITY_INSTANCE_NAME · TRINITY_MANIFESTS_DIR
· ASK_TRINITY_ENDPOINT · AGENT_IDLE_FINALIZE_S. See .env.example.
Reminder: SQLite end-of-support September 1, 2026 (#1278)
PostgreSQL is the forward path; migration guide at
docs/migrations/SQLITE_TO_POSTGRES.md.
Known limitations
- Agent evaluations ship as a foundation — the referee surface and the
"Completion" relabel are live; graders and agent/UI read surfaces follow
(trinity-enterprise#205). - A2A inbound exposure is per-agent opt-in and cards are unsigned — signed
Agent Cards (JWS) are tracked in trinity-enterprise#159. Outbound
call_a2a_agentis default-OFF (A2A_OUTBOUND_ENABLED) with an admin-managed
endpoint registry. - Skill-runner has no admin surface yet — enable/provision/sync via MCP/API
only (trinity-enterprise#242); per-agent skill-pack toggles are
trinity-enterprise#342. - Workspace multi-agent chats ride the rooms engine and are
entitlement-gated; the picker hides itself on builds without it. Workspace
exposure config is API-only — no Settings panel yet. - Grid data tiles: Executions and Recent failures shipped; Next schedules
(trinity-enterprise#99) did not. - MCP keyless email sign-in (#848) ships dark — enable via
MCP_INLINE_AUTH_ENABLED. - Pull-mode pilot routes agent-to-agent work only — cron/schedule triggers
stay on push dispatch (#2048 / #1081). deploy_local_agentarchive path still lacks integrity verification
(#2060). Codex API-key auth remains inert (#2208); subscription auth works.- CI:
dev's required checks still run no unit tests (#1958) — the release
PR is the first full-suite run over a payload.
Commit-reconciled addendum (post-release)
Post-release reconciliation of the release PR's commit payload (#1781 head
e9eb40da → #2268 head bcf67116) against the status-in-dev issue set
surfaced shipped work the label-driven notes above missed:
Post-v0.8.5 hotfixes promoted to main on 2026-07-28 (#1839, untagged) —
in the v0.8.5→v0.9.0 diff but in neither release's notes:
- #1795 agent base image hardcoded
TZ=America/New_York— agents ran 4h off UTC - #1790 Cornelius seeder marked itself seeded on a volume-conflict 409 — Cornelius never provisioned
- #1793 / #1759 a nonexistent
local:template silently created an empty agent (200) — now rejected, and the missinglocal:defaultships (v0.8.5's Known-limitations entry for #1759 is resolved) - #1830 Dashboard stats bar right controls overlapped host telemetry below ~1170px — elastic degrade instead of clipping
Shipped in the payload, closed outside the label sweep:
- #2186 starting a stopped agent 500'd when a recreate was needed —
require_runninggate narrowed to the one call site (#2187) - #2259 Workspace composer buttons aligned to the input, not to the typeahead wrapper (#2260) — was still
status-in-progress; closed by reconciliation - ent#336 canary S-03 built its TTL floor from the agent cap, not the execution's own timeout — every shorter-timeout scheduled run paged critical (via #2022)
- ent#339 canary S-03's
below_floorarm is an internal-coherence check, not a dispatch-timeout check — documented honestly (via #2022)
Correction: the Known-limitations line claiming @abilityai/trinity-docs-mcp
was not yet on npm has been removed — the helper MCP server has been published
as the unscoped trinity-docs-mcp (0.1.0; npx -y trinity-docs-mcp per the
README). trinity-enterprise#330 closed as completed.
Headline count corrected: 155 public + 62 private-tracker issues.