Behavior Changes
Session-scoped active task runtime
Active task state now uses a per-session runtime file:.trellis/.current-task is no longer used as the active-task fallback.
Session file shape:
task.py start exits with code 1 when no session identity is available:
Bootstrap and joiner tasks
trellis init still creates bootstrap and joiner task directories, but it no longer writes .trellis/.current-task.
The generated PRDs now tell the AI to start the task from a session that exposes Trellis session identity.
Workflow task-creation policy
workflow.md and hook fallback breadcrumbs now use a softer task-creation policy.
Platform Integration
Shell session identity handling
Several hosts expose session identity differently. beta.15 adds host-specific handling fortask.py start/current/finish.
Other platforms use the same
.trellis/.runtime/sessions/ storage, but beta.15 does not add new shell-command handling for them.
Cursor sub-agent hook matching
Cursorhooks.json now matches both tool names:
inject-subagent-context.py also parses Cursor custom-agent payloads in these shapes:
Pi Agent session runtime
Pi Agent now reads active task state from.trellis/.runtime/sessions/.
Context key sources, in priority order:
Nested Pi sub-agent runs receive the same
TRELLIS_CONTEXT_ID.
Workflow-state override copy
workflow-state breadcrumbs now use exact Trellis agent names:
Bug Fixes
OpenCode sub-agent name normalization
OpenCode now:- recognizes
OPENCODE_RUN_IDas session identity - strips the
trellis-prefix before matching sub-agent names - keeps
implement.jsonl/check.jsonlinjection working with renamed agents
Git-backed private registries
Template registry downloads now support private Git-backed registries. When a registry source requires local Git credentials, Trellis uses Git to readindex.json and copy template directories instead of relying on anonymous raw HTTP.
This applies to self-hosted GitLab / GitHub Enterprise sources and SSH registry URLs. Registry errors are classified separately for authentication failures, missing refs, missing paths, invalid index.json, and network failures, so trellis init --registry no longer misclassifies those cases as direct-download mode.
Shared-hook cleanup
writeSharedHooks and collectSharedHooks now use the same platform capability table:
.claude/hooks/statusline.py or configure statusLine in .claude/settings.json.
Existing projects keep their installed Claude Code statusLine behavior: trellis update preserves .claude/hooks/statusline.py and carries an existing .claude/settings.json statusLine entry forward into the updated settings file.
The manifest includes 10 hash-verified safe-file-delete entries for hooks that were written to projects but are now orphaned.
Modified local files are preserved with a warning.
Docs
Beta task docs
Updated beta docs now describe:- current task state under
.trellis/.runtime/sessions/<session-key>.json - session-scoped task ownership instead of a global project pointer
continue/finish-workas the primary user-facing task commandstask.py startas a session-bound operation- Cursor, Codex, Claude Code, OpenCode, and Pi hook/sub-agent behavior
Multi-agent docs
The beta multi-agent docs now describe native Git worktrees plus Trellis tasks. Removed references to Trellis-managed/trellis:parallel and worktree.yaml.
Upgrade
Existing projects:--migrate gate is required for beta.15.
Existing task directories and jsonl files remain valid. Existing .trellis/.current-task files are preserved but ignored by the new active-task resolver.
Manual shell usage requires an explicit context id: