Changelog
Copy Markdownv0.6.4 (2026-07-01)
Changed
Oi.Dispatch.Confignow ownsdatatype and drafts construction:build_drafting/2andassemble_run_opts/2moved fromOi.execute/2into Config, reducing the entry module to delegation-only.Optionsnew internal-only, called exclusively through Config.- Worker calls
Oi.Dispatch.Config.assemble_run_opts/2instead of reaching into Options directly.
Docs
- README slimmed down; core concepts relocated to
Oimodule doc. - Fully-qualified module names in all
@docreferences. - Added AGENTS.md.
v0.6.3 (2026-06-30)
Changed
resolve_data/2now validates input format explicitly. Returns{:error, :invalid_data_format}for unrecognised shapes instead of silently producing empty maps.build_drafting_inputs/2propagates the error tuple.orchid_stratum/1→orchid_stratum/2— accepts%Oi.Dispatch.Config{}as second argument. Same fororchid_intervention_and_stratum. Callers in tests updated.unwrap_tuple/1now handles list input — resolveslist param map ↔ tuple datamismatch.flatten_data/1detects format per-entry instead of requiring homogeneous maps.- Intervention value format documented:
{type, value}wheretypeis an atom (:override,:offset, or a custom module). Plain values default to:override. Tuple payloads should use%Orchid.Param{}to preserve type info. Oi.Stepdocs translated from Chinese to English.
Fixed
- README: broken hex.pm URLs (
packges→packages).
v0.6.2 (2026-06-29)
Added
Oi.Flowgraph.many_step/1— batch-add steps that share no options. Expands to a block ofstep/1calls.graph do many_step [LoadPosts, LoadPages, LoadImages] step Markdown, as: :md, opts: [...] ... end
Changed
orchid_symbiontis now an optional dependency. Session auto-detects whetherOrchidSymbiont.Runtimeis available at runtime and omits the child spec when the dep is not installed.Oi.Stepraises a clear error at compile time ifsymbiont?: trueis used without the dep.stepmacro: removed compile-timefunction_exported?validation (unreliable across files during macro expansion). Validation is deferred toadd_step/3at runtime. For compile-time enforcement, addCode.ensure_compiled!(Module)at module level in your graph file.
Fixed
stepmacro:unquote(module)→unquote(resolved)so thatadd_step/3receives the expanded module atom instead of the alias AST, fixing graphs that were silently producing zero nodes.many_stepexpansion: fully-qualifiedOi.Flowgraph.step/1calls to guarantee resolution regardless of import context.- Avoid compile-time warnings about undefined
OrchidStratum.*modules whenorchid_stratumis not installed (optional dep).
v0.6.0 (2026-06-29)
Added
Oi.FlowgraphDSL macros —graph/1,step/2,~>/2for declarative graph building. Supports bothnode.portdot-notation and{node, port}tuple form.stepvalidates at compile time that the module implements__node_spec__/0.Oi.Adapters.orchid_symbiont/1— opt-in adapter that prependsOrchidSymbiont.Hooks.Injectorat runtime whenorchid_symbiontis available.
Changed
Oi.Result.fetch/2andreify/2now return{:error, :not_found}instead of bare:error— consistent with the rest of the codebase.Oi.Dispatch.Drafting.fetch/2— same{:error, :not_found}change.merge_results/2inOi.Dispatch.Orchestratorno longer silently dropsnilvalues from step outputs.Oi.Compile.Bundle.compile_graph/2now sorts bundles deterministically by cluster name.Oi.Runtime.Session.Instancessupervisor strategy changed fromone_for_alltoone_for_one— Task.Supervisor and OrchidSymbiont.Runtime no longer cascade-kill each other.
Removed
OrchidSymbiont.Hooks.Injectorinto the hooks stack. UseOi.Adapters.orchid_symbiont/1in the:orchid_adapterschain instead.unwrap_interventions/1in Options — replaced bywrap_interventions_for_orchid/1that does a single wrap instead of unwrap-then-rewrap.
Fixed
- Intervention data no longer goes through an unnecessary
wrap → unwrap → wrapcycle — raw values are stored in Drafting and wrapped once inassemble_run_opts/3.
v0.5.0 & v0.4.0 (2026-06-26)
Update
Unified
:dataoption — replaces separate:inputs/:interventionswith a singledata:map. Ports are auto-split by topology: no incoming edge → memory, has incoming edge → intervention. Legacy:inputs/:interventionsoptions deprecated. Now two formats supported:# Nested (recommended) Oi.execute(compiled, data: %{step1: %{in: "foo"}, step2: %{result: {:override, "bar"}}}) # Tuple keys Oi.execute(compiled, data: %{{:step1, :in} => "foo"})Splits unified data into memory/intervention maps based on graph topology (edge presence).
Compiledstruct now carriesedges: MapSet.t(Edge.t())for downstream port resolution.Intervention type wrappers (
{:override, v},{:offset, v},{:custom, v}) preserved as-is through the pipeline.
Fixed
Oi.Executor.TaskSup:Keyword.fetch!→Keyword.fetch(via-tuple pattern match was always failing, causing all TaskSup-backed sessions to crash).
v0.3.0 (2026-06-25)
Changed
- Renamed
:pluginsoption to:orchid_adapters, simplified to function-only form. Module-based adapter dispatch removed — use Orchid hooks for step-level concerns. - Moved
:interventionsfrom Config to Drafting. Config is now purely immutable dispatch configuration; Drafting holds per-dispatch mutable state. :interventionskeys now accept both{:port, node, port}tuples (auto-converted viaPortRef.to_orchid_key/1) and raw orchid_key strings.merge_results/2simplified — dead%Orchid.Param{}branch removed.
Removed
:hookslifecycle callbacks from Config. Oi intentionally defers step-level concerns to Orchid's hook system via:orchid_opts.resolve_from_intervention/2in Worker. Intervention injection now happens at Drafting construction time, not per-bundle.
Fixed
- Intervention priority: interventions now override drafting memory (were previously ignored when a drafting key already existed).
v0.2.0
Breaking
Oi.compile/1(takingWorkspace) replaced byOi.compile/2(takinggraph, cluster)- Oi.dispatch/2 replaced by
Oi.execute/2(takingCompiled.t()) Oi.Workspacestruct removedOi.Compiler.RecipeBundlerenamed toOi.Compile.BundleOi.Workspace.Planningrenamed toOi.Compile.PlanningOi.Configuratorrenamed toOi.Dispatch.ConfigOi.Dispatcherrenamed toOi.Dispatch.OrchestratorOi.Draftingrenamed toOi.Dispatch.DraftingOi.Workerrenamed toOi.Dispatch.WorkerOi.Session/Oi.Registrymoved toOi.Runtime.*
Added
Oi.Compiledstruct — static compilation product (bundles + plan)Oi.Resultstruct — execution result withmemoryandreify/2:inputsoption forOi.execute/2— external inputs seeded into drafting memoryOi.run/2convenience — compiles + executes in one callWorker.resolve_dependenciesreturns explicit{:error, {:missing_input, key}}
Changed
RecipeBundle.interventionsfield removed — interventions moved toDispatch.ConfigCompiler.bind/2removed — Worker filters interventions from config at runtimeDrafting.memoryunified to storeOrchid.Param.t()throughout (no payload extraction)Planning.buildno longer called twice (compile once, reuse plan in execute)- Drafting nil filtering commented out (pending review)
Internal
- Namespace reorganized:
Oi.Compile.*,Oi.Dispatch.*,Oi.Runtime.*