Eclipse Foundation · OpenHW Group · Incubating

Eclipse Atesor

Agentic framework for RISC-V software porting.

Point it at a repository: a library, a package, a whole application. A LangGraph state machine runs the port end to end: detecting the build system, resolving dependencies, compiling natively on riscv64, and repairing what breaks. Out come verified binaries and a replayable recipe.

Builds run and are tested on

  • Emulated riscv64 sandboxAlpine (musl) + Debian (glibc), via QEMU/binfmt
  • Native RISC-V hardwareon Cloud-Vcoming
atesor-ai · porting run
$ atesor-ai --repo https://github.com/madler/zlib
 
→ sandbox   alpine-riscv64 · musl · qemu-riscv64
→ cache     miss, running full pipeline
 
  init        clone + quick_analysis            0 LLM
  analyst     build system: autotools  (0.94)   1 call
  plan        heuristic plan accepted           0 LLM
  build       ./configure && make -j4
 
  ✗ relocation truncated to fit: R_RISCV_JAL
  ↻ retry with -mcmodel=medany            heuristic 11/16
 
  build       ok                        42.6s
  verify      libz.so.1.3.1
              ELF 64-bit LSB · UCB RISC-V · riscv64
 
✔ verified riscv64 · $0.0007 · recipe written
  workspace/output/zlib_recipe.md
  • 622packages published for RISC-V
  • 584verified on both musl and glibc
  • 89%of the 701-package catalog
  • 16LLM-free recovery heuristics

The problem

The same handful of things break, every single time.

Porting to RISC-V is repetitive rather than hard. Clone, detect the build system, install the right packages, hit one of a familiar set of failures, patch, retry. Every failure below is one Atesor already knows how to recognise and repair.

  • Stale config.guess

    configure: error: cannot guess build type

    Autotools aux scripts that predate RISC-V support reject the host triplet outright. Atesor regenerates them with autoreconf -fi.

  • x86-only SIMD

    fatal error: emmintrin.h: No such file

    SSE/AVX intrinsics have no portable RISC-V equivalent, and RVV cannot be assumed. Detected by an architecture scan before the build even starts.

  • The Go -buildvcs trap

    error obtaining VCS status: detected dubious ownership

    The sandbox runs as root, so Go's VCS ownership check fails. -buildvcs=false is baked into both images and applied as a recovery step.

  • musl versus glibc

    fatal error: execinfo.h: No such file or directory

    Alpine has no execinfo.h, backtrace() or mallinfo(). Atesor proves every package on both libc families rather than assuming one generalises.

  • Relocation truncated

    relocation truncated to fit: R_RISCV_JAL

    Large functions overflow RISC-V’s default medlow code model. The build retries automatically with -mcmodel=medany.

  • Silent QEMU OOM

    exit status 137, with empty stderr

    Emulated parallel builds get OOM-killed with no error text, masking the real cause. Detected heuristically and retried serialised at -j1.

How it works

A state machine that only pays for judgement.

Atesor is a compiled LangGraph state graph: eleven node registrations, seven routing functions, and one shared state object mutated in place. Most of it never calls a model at all. The language models are reserved for the two places where judgement is genuinely required.

deterministic, zero LLM LLM-backed retry loop
Eclipse Atesor pipeline topologyA repository URL enters at init, is analysed once by an LLM, planned heuristically, then routed by a zero-LLM supervisor into a build, verify and fix retry loop, ending at either a recipe or a human handoff.build_fix_subgraphretry$ atesor-ai --repo <url>init_nodeclone · quick_analysisanalyst_nodereads real build filesheuristic_plan_nodedefault plan, no costscout_nodeonly when deferredsupervisor_nodeheuristic routerbuild_node16 recovery heuristicsverify_noderiscv64 ELF checkfix_nodeevidence-groundedfinish_noderecipe + learningescalate_nodehuman handoff
  1. init_node clones the repo and runs a zero-LLM quick analysis.
  2. analyst_node makes one LLM call that reads the real build files.
  3. heuristic_plan_node builds a default plan at zero cost.
  4. scout_node produces an LLM plan, only when the heuristic plan defers.
  5. supervisor_node is a zero-LLM heuristic router.
  6. build_node, verify_node and fix_node form a retry subgraph.
  7. finish_node writes the recipe, or escalate_node hands off to a human.

Architecture

Three pillars hold the whole thing up.

Scripted operations layer

src/scripted_ops.py

Deterministic, zero-LLM repo inspection: clone and reset, build-system detection across 11 systems, per-ecosystem dependency extraction, and an architecture-pattern scan. This is what makes the pipeline cheap.

  • 11 build systems detected
  • Zero LLM cost
  • Runs before any model call

LangGraph state machine

src/graph.py

A compiled StateGraph with per-node conditional routing and an embedded build, verify and fix subgraph. One AgentState dataclass is threaded through every node and mutated in place.

  • 11 node registrations
  • 7 routing functions
  • Uniform error handling

Platform abstraction

src/platforms.py

One frozen profile per distro carries libc, target triplet, package-manager templates, canonical package maps and name corrections. Adding a sandbox is a single entry, and the rest of the code stays distro-agnostic.

  • Alpine / musl
  • Debian / glibc
  • One entry per new sandbox

Capabilities

Built to keep working when things go wrong.

Rate limits, flaky emulation, hallucinated package names, silent OOM kills. The failure modes of an autonomous build agent are well understood here, and each has a deterministic answer.

Eclipse Atesor capabilities, grouped by area, with the benefit of each.
CapabilityWhat it gets you
Build & verification
Native RISC-V buildsNo cross-compilation, so no surprises at deploy time.
ELF architecture verificationEvery artifact confirmed riscv64; wrong-arch output hard-fails.
Expected-artifact searchHunts for the analyst’s expected outputs before tolerating a caveated pass.
Artifact curationRanks output primary, secondary or noise so the recipe shows the real deliverable.
Autonomy & recovery
16 LLM-free heuristicsThe most common failures are fixed deterministically.
Evidence-grounded diagnosisThe fixer reads real source around each error reference, not just the message.
Bounded investigationOne read-only round, at most four whitelisted commands.
Error-loop detectionThree same-category failures in a row escalates instead of burning budget.
Cost & safety
Hard $1.00 cap per packageA runaway port cannot run up a bill.
Real token accountingEvery call priced from reported usage; free-tier models bill zero.
Command whitelistEvery shell command passes a regex validator inside the sandbox boundary.
Deterministic fallbacksAgents keep working when every LLM is rate-limited or down.
Memory & scale
Recipe cacheA repeat port skips all LLM and Docker work, with no API key needed.
Per-sandbox cache keysAn Alpine hit never satisfies a Debian build.
Few-shot auto-learningSuccessful runs persist novel patterns, capped at 100 per agent.
Parallel batch runsOne container per worker, avoiding apt and apk lock contention.

Get started

One command per package.

The packaged CLI bundles its own runtime. You supply a Docker daemon with riscv64 emulation enabled, and an API key for Gemini, OpenAI or OpenRouter.

  1. sudo apt-get install ./atesor-ai_<version>_<arch>.deb
    
  2. Add an API key

    cp /opt/atesor-ai/app/.env-example ~/.config/atesor-ai/.env
    
  3. Port a package

    atesor-ai --setup-only
    atesor-ai --repo https://github.com/madler/zlib
    

What you get back

A recipe a human or a CI job can replay.

The point isn’t just a binary. It’s the reproducible path to that binary. Every run writes a Markdown recipe, the verified artifacts, the patches applied, and a full audit trail of every model call and what it cost.

  • {repo}_recipe.mdThe replayable Markdown porting recipe.
  • {repo}_report_*.mdDetailed per-run build report.
  • {repo}_state_*.jsonFull AgentState snapshot for debugging.
  • {repo}_patches_*/Every patch applied during the run.
  • {repo}-*-{platform}.zipPackaged artifact: recipe, manifest, sources, logs.
  • agent-call_{repo}.logFull LLM audit trail with tokens and cost.
zlib_recipe.md

# Porting recipe: zlib

sandbox: alpine-riscv64 · musl · verified

## Dependencies

apk add build-base autoconf

## Build

./configure --prefix=/usr

make CFLAGS="-mcmodel=medany"

## Artifacts

libz.so.1.3.1 · RISC-V ELF ✔

Every archive Atesor has published is browsable, with its recipe inside.

Browse downloads