Changelog¤
Changelog¤
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased¤
Added¤
Changed¤
Removed¤
[0.5.0] 2026-08-19¤
Added¤
- Every release now publishes
antikythera.protoand the generated bindings for each supported language (TypeScript, C#, C++, Java, Objective-C, PHP, Ruby) as release assets. Downstream packages pin a schema version and download it, instead of reading.protofiles out of this repository — the frontend previously fetchedantikythera.protofrom themainbranch on every build, so its wire contract silently followed whatever was merged. Built byinvoke create-class-assets, reusing the taskscompas_pbprovides, in a dedicated CI job so the wheel build is unaffected. Blueprint.check_dataflow()reports condition expressions (taskconditionandwhile_policy.condition) that read session names no task in the blueprint declares as an output.POST /blueprints/uploadrejects such a blueprint with400and adetail.problemslist, and does not store it. Loading a blueprint from file only logs them, so blueprints already in storage stay loadable.
Changed¤
- Breaking: Upgraded
compas_pbto>=1,<2; MQTT protobuf messages now use the v1 wire format and are incompatible with v0 readers and writers. - Migrated CI, documentation, pull-request, and release automation to the consolidated
compas-dev/compas-actions/*@v1actions and the reviewed release-PR/OIDC publishing flow. - Renamed
typetotype_hinton task inputs, outputs and params (TaskIOand subclasses) to disambiguate it from a task'stype(agent.tool). Blueprint JSON accepts either key on load and always emitstype_hint;typeis a deprecated alias and atypeproperty is kept for in-process readers. See ADR-0003. - Breaking:
antikythera-agentsnow requires an explicit subcommand.antikythera-agents runstarts the launcher with the same flags the bare command used to accept (--broker-host,--broker-port,--dev,--sys-only); invokingantikythera-agentswith no subcommand exits non-zero with usage text instead of starting the launcher. Argument parsing moved into theclimodule, leaving__main__as a thin entry point. - Tool signatures now bind task inputs, not just params: an unannotated parameter (or one explicitly marked
Input[T]) binds by name fromtask.inputs. Binding is strict — a required input the task doesn't supply, an input the task declares that the tool doesn't accept, or a non-optional input resolving toNoneall fail the task before the tool runs, reported asTaskError(code="TOOL_BINDING_ERROR")rather than the blanketTOOL_FAILURE.Task-typed (opaque) tools are exempt. See ADR-0002. - A tool parameter can be annotated
Context[T]to bind by name from the task's expansion context (task.context) — the identity of the item a dynamically expanded inner blueprint is working on, distinct fromExecutionContext. A required context key absent fromtask.contextraisesToolBindingError, naming the key. The catalog reports these underrequires_context. See ADR-0002. - A tool whose return type is a
TypedDicthas its returned dict checked against it: a declared key missing from the result fails the task withToolBindingError, naming the key; a key markedNotRequiredmay be absent without error. The catalog reports each output'stype_hintandoptional. Tools takingTask, and tools returning a plaindict/Dict[str, Any], are exempt —system.compositestays opaque permanently. See ADR-0002. - A bound value is now checked against a plain-class annotation (
Frame,str, ...) on inputs, params and context values alike, failing withToolBindingErrornaming the argument and the expected/actual type on mismatch. Parameterised generics (list[X], ...) are not checked.int/floatbind leniently in both directions to absorb the wideningcompas_pbdeserialisation can introduce. Opaque tools are exempt. See ADR-0002. - Each input, param and output in the catalog gets a
description, parsed by hand from the tool's NumPy-style docstringParameters/Returnssections. A missing docstring, missing section, undocumented field or malformed block degrades to no description for the affected field rather than raising. No new dependency added. See ADR-0002. - Breaking:
antikythera-agents describenow exits non-zero and writes nothing to stdout if any plugin fails to import, naming each failed plugin and its exception on stderr — a catalog that silently omitted agents due to a missing dependency was worse than a hard failure, since it gets committed to a repo and read by LLMs. Pass--allow-partialto emit the catalog for the agents that did load anyway, with afailedsection naming the rest. The launcher (antikythera-agents run) is unaffected — it still starts with a broken plugin present and warns, as before. See ADR-0002. - Added
ReferenceAgent(agent typereference), a dependency-free worked example exercising every part of the tool convention — a plain task input, an explicitInput[T], a required and a defaultedParam[T], aContext[T]value, anOptional[T]input, aTypedDictreturn with both a required and aNotRequiredkey, theTaskescape hatch, andExecutionContextcancellation.examples/reference_agent_demo.jsondrives it end to end. See ADR-0002, issue-td-10. - Breaking:
io.copynow declaressourceanddestinationas task inputs instead of reading them from either input or param; blueprints must wire them as inputs (literal value orget_from). See ADR-0002, issue-td-04. system.start,system.endandsystem.demo_meshno longer takeTask— they take no arguments at all and each declares aTypedDictreturn (process_start_time,process_end_time,meshrespectively), so their outputs now appear in the catalog.system.sleepandsystem.compositekeep takingTaskdeliberately (to log the task id/type alongsideduration, and because a composite task's output shape is decided by the blueprint) and document why in their docstrings.user_interaction.notifywas evaluated for migration and deliberately kept opaque rather than narrowed: it resolvestitle/message/levelfrom either an input or a param depending on what the blueprint wires, and interpolates them against arbitrary keys from the expansion context and inputs — neither has a fixed shape the new binder can express, and narrowing either would change already-deployed blueprints' behaviour for no benefit.user_interaction.user_inputanduser_interaction.user_outputwere already opaque and now document why in their docstrings. See ADR-0002, issue-td-11.- Fixed
TaskErrornot callingData.__init__, which made any session carrying an error fail to serialize withAttributeError: '_name'. The orchestrator swallows save failures, so a failed session silently stopped persisting its state and stayedrunningin storage. - Session failures now record the reason in
BlueprintSession.last_task_error(task failures, dispatch failures and scope condition errors). The field existed and was read by the frontend but was never written. - Fixed a scope
while_policycondition that cannot be evaluated (e.g. it reads a name no task wrote to session data) being silently treated as False, which skipped the loop and ran the session to completion as if it had succeeded. The session now fails withScopeConditionError, listing the names actually available in session data.
Removed¤
[0.4.1] 2026-07-07¤
Added¤
Changed¤
- Fixed session fails when COMPAS types are used in task data.
Removed¤
[0.4.0] 2026-07-02¤
Added¤
- Orchestrator-side re-dispatch polling loop: unclaimed
READYtasks are re-published with exponential backoff (min(base * 2^attempts, max)) and failed with error codeNO_AGENT_CLAIMEDafterMAX_REDISPATCHESattempts. Configurable viaREDISPATCH_BASE_DELAY(default 2 s),REDISPATCH_MAX_DELAY(default 90 s), andMAX_REDISPATCHES(default 5) env vars. GET /sessions/{id}/streamSSE endpoint that pushestask_state_changedandsession_state_changedevents as the orchestrator transitions state.datastore_updatedSSE event emitted after each task that writes outputs, carrying enrichedblueprint_id+datapayload.
Changed¤
- Changed
compas_timberfrom pre-release to>=2.1.2in requirements.txt. - Fixed session state gets overwritten to
STOPPEDinstead ofSUCCESSorFAILED. - Fixed orchestrator stays subscribed after session failure.
Removed¤
[0.3.1] 2026-05-19¤
Added¤
- Added MCP Server service to dev docker compose file.
Changed¤
- Outputs from failed tasks are disregarded as to not overwrite valid data in session data.
- Fixed MCP server fails to start when using sse as transport.
- Bumped min
compas_eveversion to2.3.0. - Added passthrough transport and tls to agent launcher.
Removed¤
[0.3.0] 2026-04-24¤
Added¤
- Added MCP server.....
- Added
invoke dockerwhich builds both images
Changed¤
- Fixed scope reset behavior
- Allow deleting sessions which are still in-memory
Removed¤
[0.2.0] 2026-04-20¤
Added¤
Changed¤
Removed¤
[0.1.2] 2026-04-17¤
Added¤
Changed¤
Removed¤
[0.1.1] 2026-04-17¤
Added¤
Changed¤
Removed¤
[0.1.0] 2026-04-17¤
Added¤
- Named sessions: new session API endpoint accepts an optional session name.
- API endpoint to remove/delete sessions.
--sys-onlyflag to agent launcher to restrict to system agents only.- MQTT traffic dumper script decodes protobuf messages; now continuously flushes entries to file.
compas_timberadded to Docker image.- Scopes: new scope mechanism for controlling looping/retry/skip behavior within blueprints.
scope_start/scope_endtask properties define contiguous DAG regions.- Three policies: skip (condition-gated), retry (fixed N retries), while (condition-based loop with optional iteration cap).
- Scopes are identified by the opening task's ID;
scope_endreferences that ID. - Blueprint validation ensures matched start/end pairs with no interlaced scopes.
- New
ScopeRegistryandScopeclasses inantikythera_orchestrator.scopes. - Updated blueprint JSON schema with
scope_start,scope_end,RetryPolicy, andWhilePolicydefinitions. - Example blueprints for scope skip, retry, and while policies.
- Unit tests for all scope policies (skip, retry, while, max_iterations).
Changed¤
- Swapped NanoMQ for Eclipse Mosquitto as the MQTT broker.
- Migrated storage backend from immudb to Redis.
- Agent launcher now uses logging instead of print statements; launcher errors during task execution are caught and reported as task failures.
- Fixed static composite task execution.
on_task_claim: checktask is Noneinstead oftask_id is Noneto correctly handle unknown task IDs.- Session state writes to storage are now wrapped in try/except to prevent secondary failures from masking the original error.
- Added debug logging in strategic places across the orchestrator scheduling path.
- Moved immudb storage mock to shared conftest; removed obsolete storage module.
- Built Docker image for antikythera orchestrator/agents.
- Fixed broken tests after static composite fix.
Added¤
- Strict validation for Blueprint JSON files, requiring explicit list-of-dictionary formats for inputs, outputs, and parameters.
- Unit tests for failed task resume scenarios, including session revival from storage.
- Add support for competitive execution of tasks.
- New API endpoint
get_blueprint_contextto get the fabrication context of a composite blueprint. - New API endpoint
get_running_compositesto get the currently running composite blueprints. - Add new
user_interaction.notifyagent for sending user notifications with including support for string interpolation of session data. - Add API endpoint and backend support for reseting tasks (and downstream dependencies) to a pending state to allow re-execution after a failure or user intervention.
- Added API endpoint for skipping tasks.
- Added
TaskState.SKIP_REQUESTEDto represent tasks that have been requested to skip but are waiting for their dependencies to be met before transitioning toSKIPPED. - Added a redis backend to the storage interface and places behing a unified interface in package
storage.
Changed¤
- Moved
composite_to_inner_blueprint_mapandblueprint_contextsfromOrchestratortoBlueprintSessionfor proper serialization and session restoration. - Simplified
SessionStorageAPI to usesave_session()andload_session()for complete session persistence instead of piecemeal updates. - Added
load_session_with_metadata()toSessionStoragefor retrieving session data with storage metadata (used bylist_sessionsAPI). - Added
mock_agent_discoveryfixture to orchestrator tests to prevent loading external agents during testing. - New explicit accessor methods for
Taskvalues (get_input_value,get_output_value,get_param_value,set_input_value,set_output_value,set_param_value). - New JSON Schema for strictly validating Blueprint files.
BlueprintJsonParsernow supports full validation and symmetric read/write of Blueprints.- Added
protofile to release artifacts - Added paging to sessions list API.
- Added
max_grpc_message_lengthconfiguration for immudb client to handle larger messages. - Added demo agent to return the Standard 3d bunny as a COMPAS mesh.
- Added
io.copyagent/tool to copy files with support for glob patterns. - Do not implicitly propagate skip status to child tasks, as it generates an non-intuitive workflow where skipping a parent task causes all child tasks to be skipped without the ability to override.
- Extended the context of condition eval, so that it includes fab context and session data.
- Fixed resuming not doing anything due to tasks being in RUNNING or READY state when session was stopped.
- Fixed condition doesn't get carried over to dynamically expanded tasks.
Changed¤
- Refactored
Taskclass to enforce a single data access pattern. - Changed build system to
hatchlingto hook the protobuf compilation into the build process.
Removed¤
Task.input_valuesandTask.param_valuesconvenience properties have been removed to prevent ambiguity.
[0.0.0] - Initial Capabilities¤
Added¤
- Orchestration:
- Centralized
Orchestratorbased on an Event-Driven (MQTT) architecture. - REST (FastAPI) for interacting with the system programmatically.
- Dynamic Task Expansion:
Sequencersystem to allow runtime procedural generation of tasks based on fabrication model geometry (Based oncompas_model). - Composite & Conditional Logic: Support for nested task groups and data-driven branching.
- Centralized
- Data & Trust:
- Immutable Ledger: Data storage via
immudbto provide a tamper-proof, cryptographically verifiable audit trail of every fabrication step. - Model Management: Native handling of COMPAS models, with specialized support for Stock and Element management in digital fabrication (
compas_timber).
- Immutable Ledger: Data storage via
- Connectivity:
- Transport Agnostic: Built on
compas_eve, using MQTT for high-throughput messaging and Protocol Buffers for efficient serialization. - REST API: Comprehensive API for session management, blueprint uploading, and system monitoring.
- Transport Agnostic: Built on
- Blueprints:
- JSON-based definition format for fabrication processes.
- Agents:
- Plugin System: Fully extensible agent architecture using
@agentdecorators and auto-discovery.
- Plugin System: Fully extensible agent architecture using