Roadmap — Done
Archive of shipped work and completed TODO items.
Split out of roadmap so the main roadmap stays focused on open work. This file is the historical record. Read the per-field ADRs for the architectural reasoning behind the ADR-labelled items below. Note: entry names are ship-time snapshots — some have since been renamed or removed (e.g. the "DAG executor", the "Ephemeral" reducer,
BatchEvalOrchestrator); the glossary is the source of truth for current names.
§1Done — Shipped Features
- Two-layer canvas architecture (outer graph + inner graph editor)
- Dataflow executor with IterIn/IterOut iteration gates
- DAG executor for acyclic graphs
- Component system with auto-discovery from
workspace/ - WebSocket streaming with
execution_idrouting (8 event types) - Single
/runendpoint with pause/resume/stop lifecycle - Graph presets: Straightforward (CMA), NavGPT-CE
- Wire type system: IMAGE, DEPTH, ACTION, STATE, TEXT, BOOL, METRICS, OBSERVATION
- Hydra eval harness with native + external policy paths
- MkDocs Material documentation site
- Typed graph model (
GraphDefinition,NodeDef,EdgeDefingraph_def.py) — backend validation, JSON file management, CRUD API - AutoServerApp: write-once deploy-anywhere for nodesets (ADR-server-001)
- Unified canvas paradigm (ADR-canvas-002) — one editor, one registry, one catalog at every graph level
- NodeSet Manager page (ADR-canvas-001) — dedicated UI for nodeset load/unload, server start/stop/restart
- BaseEnv removed — environments are NodeSets (ADR-components-002)
- Standardized node types
nodeset__nodeconvention, auto-load nodesets on graph open (ADR-components-003) - Legacy two-layer files deleted (
nodeTypes.ts,innerNodeTypes.ts,FlowCanvas.tsx,InnerGraphEditor.tsx,AgentLoopCanvasNode.tsx, …) - Python-driven node UI (
NodeUIConfig+ConfigFieldonBaseCanvasNode) — all node rendering driven from Python,GenericBlockRendererhandles block + strip layouts - Mock/legacy node cleanup — deleted 23 mock
.tsxfiles, all mock nodes labelled[Mock]in sidebar + canvas - Custom
.tsxreduced from 23 → 10 (6 custom UI + 1 renderer + 2 shared + 1 composite helper) - State container system (dual-wire architecture):
StateContaineras dict of namedBaseStateentries, 4 reducer types (Accumulator, LastWrite, Counter, Ephemeral), extensible value type registry, state edges as separate wire system, canvas toggle, executor integration, flatten support - Graph node system (ADR-canvas-003):
kindfield on GraphDefinition, dual storage (graphs/+graph_nodes/), Explorer split into Graphs + Graph Nodes sections, VS Code-style tree expansion, "Save as Node" button, snapshot semantics - Auto-layout system: swim-lane layout algorithm (
app/layout.py),POST /api/graphs/layoutendpoint, Auto Layout button. Updated 2026-04-19 for ADR-dataflow-006 three-pivot: nodes split into init band + loop band stacked vertically withBAND_GAP - Per-node LLM/VLM model selection via profile config field in
LLMCallNode - LLM config system redesign (ADR-platform-003): layered field-level env var fallback (profile > AGENTCANVAS_* > VLM_* > registry), argparse CLI (8 commands, works without server), mtime-based ProfileStore cache invalidation, key validation, interactive setup script
- VS Code-like UI layout: ExplorerPanel (tree sidebar), TabBar (tabbed multi-graph editing), OutputDrawer
BaseSkillremoved — skills refactored toBaseCanvasNodesubclasses in vln_skills nodeset- agentcanvas general-purpose env (ADR-platform-004):
agentcanvas(Python 3.10+, modern torch/transformers + FastAPI) as THE environment for all development, research, and runtime;vlnce(Python 3.8) retained only for the habitat-sim 0.1.7 binary constraint. Framework import guard test enforces the boundary. - ADR-components-004 recorded for Python-driven node UI
- NodeUIConfig documentation with examples in
capabilities/customizable-node-system.md - Eval page redesign (ADR-eval-001): graph-driven batch evaluation via
BatchEvalOrchestratorwrappingLoopRunner,ExecutionPrinciplesfor batch mode,ExecutionGuardfor exclusive canvas/eval lock, env metadata interface onBaseNodeSet, registry-backed graph introspection, shared nodeset auto-loading, v2 API at/api/eval/v2, new frontend (9 components) - Node output log system (ADR-observability-003): two-layer execution logging — automatic exterior (executor captures port I/O + timing per node firing) + voluntary interior (
_self_log()onBaseCanvasNode).ExecutionLoggerwith JSONL persistence.log_serialize()truncates large values.exec_logWS events (suppressed in eval mode). REST API at/api/logswith 4 GET endpoints. FrontendLogPanelin OutputDrawer Logs tab. - Canvas environment & episode control (ADR-legacy-002): standalone
EnvControllerProtocol.HabitatEnvControllerdelegates toHabitatEnvManager.get(). REST API at/api/env/{name}/(5 endpoints). POST endpoints guarded byExecutionGuard. Pre-flight pattern: frontend callsenvSetEpisode()beforerunPipeline()— keepsRunRequest/LoopRunnerenv-agnostic.EnvContextBarcomponent, auto-advance on episode completion. - Configurable IterIn/IterOut ports (ADR-dataflow-003):
config.portsonNodeDefoverrides class-level ports per instance.BaseCanvasNode._resolve_ports(config)classmethod. Domain ports removed from framework class defaults. FrontendresolveInstancePorts()utility,PortListEditorcomponent. All 3 graph presets migrated with explicitconfig.ports. LIST[T]wire-type modifier (ADR-dataflow-005): opt-in list modifier with consumer-side coercion.LLMCallNode.rgbmigrated toLIST[IMAGE], unblocking MapGPT/MC-GPT/DiscussNav/VLN-Zero multi-image prompts.graph_def.validate_edge_wire_typecompatibility helper; frontendPortListEditorcheckbox modifier +isCompatibleWireConnection+ doubled-ring handle visuals.- Viewer system refactor: per-instance viewer data via
viewer_dataWS events keyed bynode_id._SinkBase.forward()serializes wired inputs viaserialize_for_display(). Display type registry (viewerFieldRegistry.ts) with lazy-loaded field renderers.DisplayField.accumulatefor log-type fields. 5 viewer sinks: ImageViewer, ThinkingLog, ActionLog, Metrics, TextViewer. - Configurable
imageViewerreplaces fixedobservationViewer(ADR-components-007): newImageViewerSinkwith_resolve_portsderiving ports fromconfig.ports(IMAGE/DEPTH only) +rows/colsgrid; newimageGridfrontend layout +ImageGridViewerLayout.tsx; 4 workspace graphs migrated. - Hybrid data-layout unification (ADR-platform-005):
data/restructured intohabitat/(VLN-CE framework mirror) +mp3d/v1/scans/(asset-kind namespace) +opennav/(tool namespace) +outputs/{eval, eval_mock, eval_native}. Newscripts/data/migrate_data_layout.sh(atomicrename(2),--dry-run, idempotent),scripts/data/gen_skybox_rgb_mp3d.sh(inline cv2 merger),scripts/smoke/vlnce_smoke.py. Bugs fixed:matterport3d.py:245passed parent of v1/scans tosetDatasetPath;MATTERPORT_DATA_DIRsuffix match was unanchored. - Worker-pool batch eval + batched inference tier (ADR-eval-002): three-phase rollout — Phase A foundation (
controller_overrides,EvalConfig.worker_count/per_step_budget_sec,BaseNodeSet.default_per_step_budget_sec,EnvWorkerPoolseam atworker_count=1), Phase B multi-worker env fan-out (worker_count=Nspawns N tagged subprocesses + per-worker URL routing +asyncio.gatherover shared episode queue withresults_lock), Phase C batched inference (BaseCanvasNode.batched/batch_dimClassVars;BatchedInferenceServer+_BatchQueue+BatchedClient;policy_cma__forwardopted in).
§2Completed TODO Items
IDs are permanent, never reused. Full context in Done section and Changelog.
- 1 Doc-site: add glossary entries for NodeUIConfig, GenericBlockRenderer, ConfigField; document mock cleanup in relevant docs
- 2 Doc-site: update
capabilities/customizable-node-system.mdwith NodeUIConfig examples for nodeset authors - 3 Doc-site: update
capabilities/real-time-observability.md—/node-schemasresponse now includesui_config - 4 Doc-site: record ADR for Python-driven node UI (NodeUIConfig replacing custom .tsx)
- 5 Dynamic sidebar catalog — show only tools from activated NodeSets + built-ins
- 7 Delete
docs-site/docs/tmp_trash/— deleted;installation.mdrescued - 8 Layout Component System (ADR-components-006): DisplayField,
layout="viewer", refactor GenericBlockRenderer into dispatcher + layout components, eliminate 4 output viewer .tsx files - 9 Verify saved graphs (Straightforward, NavGPT-CE) render correctly with GenericBlockRenderer
- 10 Add
ui_configto nodeset tools — every node inhabitat.py,sam.py,policy_cma.py,others.pyhas aNodeUIConfigClassVar - 12 Implement
basic_agent_nodeset— general-purpose canvas nodes for LLM agents: note_write/note_read/note_list, web_search/web_fetch, image_analyze, measure_distance/compute_heading, get_instruction/get_step_count/get_history - 15 Correct skills logic — BaseSkill removed; skills refactored to BaseCanvasNode subclasses
- 16 State container system (dual-wire architecture)
- 18 Better LLM/VLM call — per-node model selection via profile config field
- 20 Choose the actual running env for agentcanvas — ADR-platform-004
- 21 General UI & filesystem refactor — VS Code-like layout
- 24 Call for contribution — CONTRIBUTING.md, label good-first-issues
- 26 File explorer with sub-graph pull-down and graph node
- 31 Running log system — two-layer node output logging (ADR-observability-003)
- 33 Unified proxy node types —
auto_server_app.py:132,140carriestool.node_typeinto manifest asFunctionSchema.name - 35 Refactor episode control to use proper AutoServerApp protocol — ADR-server-002: replaced env-specific
HabitatEnvController+ 5 hidden tools with genericBaseController - 38 Refactor viewer system — per-node
viewer_dataWS events,_SinkBaseself-serializes - 42 env nodeset should have a setted pattern, need refactor
- 43 Figure out MP3D data story — resolved by ADR-platform-005: 90 skybox zips downloaded (18 GB), 10,912 panoramas across 90 scans
- 50 Decouple VLM backend from explore-eqa nodeset
- 51 Refactor auto-layout to handle the note built-in node
- 52 Make the Explorer panel resizable like VSCode — drag handle to adjust sidebar width
- 65 VoxPoser-LIBERO gripper convention inverted at the actuation boundary — fixed 2026-06-28 at exactly the
env_libero__step_poseboundary (+ two more stacked convention bugs + grasp geometry);voxposer_libero_decomposedre-evaled and promoted tovla/verified/(libero_object SR 0.88, 2026-06-30) - 67 Server-mode transport contract — resolved 2026-06-15 with a msgpack codec replacing JSON+base64 (
pack_body/unpack_body,blobExtType for ndarray/torch/PIL with receiver-side degrade); formalized as ADR-server-004 - 68 Guardrail: stateful state-container on a
sharedserver nodeset — resolved 2026-06-15 as a load-time warning (registry._check_container_ownership, escalatable to hard-reject);state_demomigrated toparallelism="replicated" - E1 Matterport3D Simulator nodeset — shipped 2026-04-18 as
EnvMP3DNodeSetwith three-field controller cascade (dataset → split → episode_index) - E5 Benchmark data pipeline —
scripts/data/fetch_episodes_vln.shtakes--r2r / --r4r / --rxr / --rxr-full / --reverie / --reverie-features / --cvdn / --all / --dry-run / --forceflags and lands 20 GB of episodes - E6 HM-EQA dataset/benchmark integration — completed 2026-05-09:
workspace/nodesets/env/env_hmeqa/(5 tools, free-pose teleport,ac-hmeqaenv) + explore-eqa method nodesets; closed end-to-end on the 100-episode HM-EQA val standard split at SR 0.43 (≥ paper 0.38) - E9 OpenEQA (EM-EQA) integration — completed 2026-05-04:
workspace/nodesets/env/env_openeqa_em.py(5 tools) + three graphs (blind-LLM / single-frame / multi-frame); first benchmark exercising free-text reasoning + LLM-as-judge eval - E11 SIMPLER nodeset — shipped 2026-05-01 as
workspace/nodesets/server/simpler/withreset/step/observe/metric/dataset_split/controllertools, paired withac-simplerconda env (SAPIEN/ManiSkill2) - E12 LIBERO nodeset — shipped 2026-05-01 covering the four LIBERO task suites (Spatial / Object / Goal / 100), built on robosuite + MuJoCo via
ac-liberoconda env - E13 VLA Policy nodeset — shipped 2026-05-02 as
workspace/nodesets/server/policy_vla/. Hosts Pi0 / SmolVLA / Diffusion Policy / DROID-DP via 4-node decomposition. End-to-end verified with Pi0 LIBERO finetune: 5/5 success, avg 83.8 steps, 5.4 s wall