Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
Versions before 1.0.0 do not follow Semantic Versioning. Any release may contain breaking changes without prior notice.
0.0.7 - 2026-03-24¶
Added¶
- Graceful shutdown: on
SIGTERM/SIGINTthe orchestrator now drains running workers (up to 30 s), persists final state to SQLite, flushes pending agent events, and cancels retry timers before exiting. - Issue handoff via
tracker.handoff_stateconfig field — when an agent session completes normally and the issue is still in an active state, the orchestrator transitions it to the configured handoff state (e.g., "In Review") and skips the continuation retry. TransitionIssueoperation on theTrackerAdapterinterface — Jira adapter uses the workflow transitions API; file adapter uses an in-memory override map.- Per-issue effort budget via
agent.max_sessions— limits total agent sessions dispatched per issue before releasing the claim. Default 0 (unlimited). - Documentation site at https://docs.sortie-ai.com/ with initial configuration reference.
Fixed¶
- Orchestrator: continuation retry attempt counter now increments correctly across sessions instead of resetting to 1 on every normal exit.
- CLI: orchestrator-only fields (
max_turns,max_concurrent_agents,max_retry_backoff_ms,max_concurrent_agents_by_state) removed from the adapter config map, fixing silent shadowing of adapter extension keys such asclaude-code.max_turns. - Jira adapter:
extractStringSlicenow handles[]stringfrom the config layer — previously only[]anywas handled, silently reverting to default states and causing configuredactive_states/terminal_statesto be ignored. - Jira adapter:
FetchIssueStatesByIDsnow queries by numericidinstead ofkey, and results are keyed by issue ID, fixing reconciliation failures where state changes on running issues were never detected. - Jira adapter: non-numeric IDs are now rejected instead of silently mangled,
and empty ID lists no longer produce invalid
id IN ()JQL. - File and Jira adapters now return
ErrTrackerNotFoundfor missing issues inFetchIssueByIDandFetchIssueComments. - Orchestrator: INFO-level tick summary log after each dispatch cycle with candidate, dispatched, running, and retrying counters to distinguish normal operation from a stall.
0.0.6 - 2026-03-23¶
Added¶
- Orchestrator engine with state management, concurrency-limited dispatch, worker lifecycle, exponential-backoff retry scheduling, active-run reconciliation, and event-driven poll loop with graceful shutdown.
- Full startup sequence: workflow load, preflight validation, database open, state reconciliation, and poll loop — in that order.
- Dispatch preflight checks that validate adapter availability, required API keys, and agent configuration before dispatching work.
- Adapter metadata via
AdapterMetaandRegisterWithMetaso adapters can declare requirements (e.g.,RequiresAPIKey) checked during preflight. - Retry classification on
TrackerErrorKindandAgentErrorKind— errors are now classified as retryable or permanent for dispatch decisions. ErrTrackerNotFounderror kind for HTTP 404 responses from tracker adapters.- Configurable
db_pathfield in workflow configuration with~and$VARexpansion. - Workflow validation callback (
ValidateFunc) that guards config promotion during hot-reload.
Fixed¶
- Workspace
CleanupByPathnow rejects non-canonical paths and uses the actual workspace path for pending cleanup instead of reconstructing it from config. - Startup: preflight checks now run before opening the database, preventing
.sortie.dbcreation when configuration is invalid. - Startup:
.sortie.dbis now created adjacent toWORKFLOW.mdinstead of in the working directory.
0.0.5 - 2026-03-21¶
Added¶
- Workspace manager: safe path computation from issue identifiers with containment validation and symlink rejection.
- Workspace manager: atomic directory creation and reuse with
CreatedNowflag for hook gating. - Workspace hook execution with configurable timeout, truncated output
capture, and restricted subprocess environment (only
PATH,HOME,SHELL, andSORTIE_*variables are inherited). - Workspace lifecycle orchestration:
Prepare,Finish, andCleanupfunctions that sequenceafter_create,before_run,after_run, andbefore_removehooks with appropriate failure semantics (fatal vs best-effort) andcontext.WithoutCancelfor teardown hooks. - Batch workspace cleanup (
CleanupTerminal) for removing terminal-state issue workspaces with per-identifier error collection and best-effortbefore_removehook execution. ListWorkspaceKeysfor enumerating workspace directory names under a root, skipping non-directories and symlinks.
0.0.4 - 2026-03-20¶
Added¶
AgentAdapterinterface and normalized event model: 13 event types,TokenUsage,AgentConfig,Session,TurnResult, andAgentErrorwith 9 error kinds.- Agent adapter registry (
registry.Agents) for registration and lookup by kind. - Mock agent adapter (kind
"mock") with configurable turn outcomes, delays, and cumulative token accumulation for orchestrator and integration testing. - Claude Code agent adapter (kind
"claude-code") that launches the CLI as a subprocess, reads JSONL events from stdout, and normalizes them to domain event types. Supports graceful SIGTERM→SIGKILL shutdown on context cancellation and session resumption viaResumeSessionID.
Fixed¶
- Claude Code adapter: double-wait race between
RunTurnandStopSession—gracefulKillis now fire-and-forget with timer-based SIGKILL escalation. - Claude Code adapter: error on missing binary now includes the actual command name instead of a hardcoded string.
0.0.3 - 2026-03-20¶
Added¶
- Normalized
Issuemodel andTrackerAdapterinterface for multi-tracker support. - Typed adapter registry with thread-safe registration and lookup.
- File-based tracker adapter for local JSON task definitions.
- Jira Cloud REST API v3 adapter with cursor-based paginated search, issue detail retrieval, state tracking, and comment fetching.
- BFS flattener for Atlassian Document Format (ADF) descriptions to plain text.
- JQL builder with string escaping and optional
query_filterclause support. query_filterfield in tracker configuration for custom JQL expressions.- GoReleaser configuration for reproducible cross-platform binary releases (linux/darwin/windows, amd64/arm64).
Fixed¶
- Jira search endpoint migrated from retired
/rest/api/3/searchto/rest/api/3/search/jql(Atlassian returns 410 Gone on the old endpoint). - Infinite loop guard in Jira comment pagination when the API returns inconsistent offsets.
0.0.2 - 2026-03-19¶
Added¶
- SQLite persistence layer with WAL mode and single-writer enforcement.
- Schema migration runner with versioned SQL files.
- CRUD operations for retry entries, run history, session metadata, and aggregate metrics.
- Startup recovery loader that resumes incomplete retry entries on restart.
Fixed¶
- Deterministic ordering for session metadata queries via
session_idtie-breaker.
0.0.1 - 2026-03-18¶
Added¶
WORKFLOW.mdfile loader with YAML front matter and prompt body parsing.- Typed configuration layer with
$VARenvironment variable resolution and~home directory expansion. - Prompt template engine using Go
text/templatein strict mode (unknown variables and filters cause hard errors). - Turn-based prompt builder for multi-turn agent conversations.
- Filesystem watcher for live
WORKFLOW.mdreload viafsnotify. - CLI entry point (
sortie) with graceful shutdown and signal handling.
Fixed¶
- Environment variable expansion now preserves inline
$VARreferences inside URIs instead of silently dropping them. - Fractional float values no longer silently coerced to integers during config parsing.
0.0.0 - 2026-03-18¶
Added¶
- Go module scaffold and project directory structure.
- Structured logging built on
log/slogwith issue-aware and session-aware contextual fields. - CI pipeline with
golangci-lint,gofmtenforcement, and test execution via GitHub Actions. - Architecture Decision Records (ADR-0001 through ADR-0005).