This release adds a second reference workflow that runs before code
exists: plan-implementation branches off, has the agent study the issue
and the code read-only, and hands you a plan to discuss. To make that
possible the engine now carries the issue's own text, workflows can create
branches and persist files or beads issues, and the CLI agent can run in
plan mode. The anthropic_api SDK backend is removed; claude_code_cli
is the sole execution path (see Changed for the one breaking default).
Added
plan-implementationworkflow (workflows/plan-implementation.yaml,
manual).yta run <id> --workflow=plan-implementationcreates the branch
<id>-<slug-of-summary>fromdefaults.git_base_branchand switches to
it, runs the agent read-only in plan mode against the issue summary and
description, posts the plan as a YouTrack comment, then persists it in the
project: as a beads issue (external-ref = the YouTrack id) when the repo
hasbd+.beads/, otherwise committed todocs/plans/<id>.mdon the
new branch. Prompt:prompts/implementation_plan.md.- Issue text in the context.
IssueDetails(summary, description,
state) is fetched from YouTrack and exposed asctx.issue_details.
yta runnow makes one GET instead of two; a failed fetch marks
task_metaunavailable instead of failing the run. - New action types:
git_branch(idempotent create-or-switch from a
base branch; refuses to switch over uncommitted tracked changes;
deterministic{task_id}-{slug}naming that matches
defaults.branch_pattern),write_file(persist an upstream action's
text inside the repo, optionally committing just that file),bd_issue
(create a beads issue from an upstream text, withfallback_pathor a
self-skip when beads is unavailable). New adapters:
GitWorkspaceAdapter(write-side git) andBeadsCliClient. ai_report.mode: planruns the CLI agent with--permission-mode plan(read-only; the final message is the deliverable).AgentModeis
part of theAgentRunnerProtocol.yta run --workflow=NAMEbypasses trigger matching, so a
trigger: manualworkflow can finally be fired from the CLI. The poll /
daemon path is unchanged. Idempotency still applies.yta run --show-outputprints each action's text output after the
summary table; the NOTE column shows a one-lineoutput.notefor
successful actions ("created PROJ-12-… from dev; switched to it").- Live progress for
yta run. On an interactive terminal the command now
shows a live region with each action's state (pending / running / ok / fail /
skipped) and a per-second elapsed timer, so a multi-minute CLI-agent run no
longer looks hung. Non-TTY callers (pipes, tests, daemons) are unaffected. - Per-action wall-time is measured for every action and recorded on
ActionResult.duration_ms; the finalyta runsummary gains a TIME column. - The engine emits
ProgressEvents through an optionalon_progresscallback
threaded from the runtime/CLI;engine/stays free of any renderer import.
(Per-action tokens/cost is tracked separately as a follow-up.)
Removed
anthropic_apiSDK backend. The direct-APIAgentRunner
(AnthropicAgentRunner+AnthropicLLMClient,adapters/llm/anthropic.py)
is dropped;claude_code_cliis now the sole execution path. The SDK path
only inlined the git diff into the prompt, so the model had no way to
explore the repository — the CLI agent does, via its own file/git tools.
This completes the CLI pivot rather than reversing it (Phase 2 keeps adding
CLI backends under the same Protocol).anthropic.default_modelconfig field. Now dead — the CLI takes its
model from the per-actionmodel:field, falling back to theclaude
CLI's own default when omitted.- The
anthropicruntime dependency, now unused.
Changed
- BREAKING:
defaults.default_agentnow defaults toclaude_code_cli
(wasanthropic_api). Configs that relied on the old default, or that set
agent: anthropic_apion any action, must switch toclaude_code_cli. anthropic.api_keyis retained but is now only consumed by
claude_code_cliincli_agent_mode: bare; it is unused inoauthmode.task_metainput semantics: available when the issue text could be
fetched (previously "always").- Report prompts emit bold section labels instead of
##headings, so a
report inside a YouTrack custom field no longer renders larger than the
field's own label. --dry-runalso disables the new git and beads writes.
Fixed
yta runno longer reports "No matching workflows." when the real reason
was idempotency dedup. Every skipped workflow is listed with its reason
(trigger mismatch vs. already dispatched, with the idempotency key) and
the closing line says what to do ("Re-run with --force").- Skip notes for unavailable inputs carry the cause: the branch glob that
matched nothing, the ambiguous branch list, or the git error including
the base branch name — instead of a baremissing inputs: ['git_diff'].