All notable changes to the AetherCode Execution Engine are documented here.
This project follows Keep a Changelog and uses semantic versioning.
First open-source release.
- Gateway — HTTP ingest (
POST /api/v1/execute), SSE delivery (GET /api/v1/stream), logging / CORS / client-IP middleware, and Prometheus metrics + pprof. - Queue — Redis 7 Streams with a
DualConsumer(weighted submit:run), a reclaimer viaXAUTOCLAIM, poison-message dead-lettering, and an orphan reaper. - Worker — language-aware compile (with caching) and per-test run for C, C++, Java 21, Go, Python 3, JavaScript, and SQLite; verdict normalization with trailing-whitespace tolerance.
- Sandbox — go-judge client with per-language compile/run command builders and CPU/memory/output limits.
- Persistence — PostgreSQL 18 as the system of record, embedded migrations guarded by an advisory lock, tenant RLS, and idempotency.
- Auth — optional OIDC (Zitadel) JWT validation with tenant/user auto-provisioning and a TTL resolution cache.
- Rate limiting & admission — sliding-window per-user limits plus a queue-depth admission gate.
- Releases & tooling — AGPL-3.0 license,
Makefile, root and go-judgeDockerfiles,docker-compose.ymlfull dev stack,deploy/systemd unit + env example, and.github/workflows/ci.yml(build, vet, gofmt,go test -race, golangci-lint). - Tests — hermetic unit tests for the judge, event log, client-IP parsing, config validation, and the rate limiter (in-process miniredis).
- Zero lost jobs at up to 5,000 concurrent connections / 15,000 submissions
(see
docs/benchmark-results.md).
- Per-request
checkerfield onPOST /api/v1/execute(exact|token|float).
- Migration 007 drops legacy problem bank tables (
problems,problem_versions,test_cases), obsolete columnssubmissions.problem_version_idandsubmissions.mode, and the legacy 4-column idempotency indexidx_submissions_idempotency. POST /api/v1/executeno longer acceptsmodeorproblem_version_id; the engine is a pure executor. Requests withmodeother thanrun, or with anyproblem_version_id, now get400instead of being silently ignored; a leftover"mode":"run"is tolerated.testsis always required (at least one). Callers that usedmode: submitmust now send their own tests.- Idempotency keys are no longer scoped by mode: the same key and user returns the original job ID.
- Every new job receives a
stream_token(previously only unauthenticated run-mode jobs). - Per-test results now always include full
stdout/stderrand previews (no hidden-test masking). - Migration 006 clears the idempotency key on later duplicates that reused a key across run/submit (the oldest row keeps it).
- Upgrade order: move callers off
mode: submit(sendtests) before deploying this release. - Unauthenticated
DELETE /api/v1/submissions/{id}requiresstream_token; the404for an unknown problem version is gone.
- Requests accept
time_limit_msandmemory_limit_kb; runs also get a wall-clock limit (2x CPU + 1 s). - VERDICT results include the complete
stdout/stderr; test data up to 8 MB, output up to 8 MB. - Job deadline grows to the worst case of its tests and limits instead of cutting off late tests.
- Unauthenticated requests are no longer rate limited by IP;
AC_TRUST_PROXYis removed. - Output comparison treats CRLF and lone CR as line breaks.