/ Docs
GitHub
Getting started / Overview

Aestra documentation

Aestra is a deterministic execution sandbox and testcase engine built to accurately enforce hardware constraints — CPU time limit and peak RAM limit — on untrusted binaries with microsecond precision. It is designed for competitive programming online judges, automated grading systems, and local problem testing workflows.

Why Aestra exists

Traditional testcase runners use wall-clock timeouts and heuristic memory checks. This leads to inconsistent verdicts across machines with different CPU speeds or system loads. Aestra solves this by using POSIX kernel-level resource limits (setrlimit) that enforce constraints at the hardware scheduler level, making results deterministic regardless of host load.

The engine measures CPU time (user + kernel) via the wait4 system call with sub-millisecond resolution, and reads peak RSS from kernel accounting — not by polling /proc or sampling memory at intervals.

Core capabilities

Hardware enforcement

POSIX setrlimit for hard CPU and memory ceilings enforced by the Linux kernel scheduler, not userspace timers.

Microsecond telemetry

User + kernel CPU time and peak resident set size via wait4 with rusage accounting.

Cross-platform

Native Rust POSIX sandbox on Linux/WSL. Automatic SubprocessEngine fallback on Windows and macOS.

Process isolation

Forked child process with empty environment, capped file descriptors, and bounded pipe buffers. No network access.

Technology stack

LayerTechnologyRole
SandboxRust + libc cratePOSIX fork, execve, setrlimit, wait4
FFI bridgePyO3 0.20Zero-cost Rust ↔ Python interop with ABI3 stable API
BuildMaturinCompile Rust extension and install into venv
FrontendPython 3.10+CLI, test runner, output checker, config
CIGitHub ActionsRuff, Mypy, Cargo Clippy, Cargo Test, Maturin Build

Release v0.1.2. Hardened POSIX sandbox with non-blocking pipe multiplexing, active wall-clock watchdog, and real-time cross-platform peak memory tracking.

Getting started / Installation

Installation (Windows)

Aestra is built for Windows with zero host pollution. You do NOT need Rust, MSVC, or any C++ compiler to run Aestra. Only standard Python 3.10+ is required.

Prerequisites

ToolVersionDetails
Windows10 / 11Supported operating system
Python3.10+Required for the frontend CLI and execution engine
Rust / C++NoneNot required! Universal SubprocessEngine runs natively via Windows APIs

Windows Native Installer (.msi)

Install Aestra using the standard Windows graphical installer:

cmd
# Download Aestra-Setup.msi from GitHub Releases and double-click or run:
msiexec /i Aestra-Setup.msi /quiet

Or install via Windows Package Manager (winget):

powershell
winget install Aestra.Aestra

Or install globally via pip:

bash
pip install aestra

What the MSI installer configures:

  • Installs to %ProgramFiles%\Aestra with proper system permissions
  • Permanently registers aestra in the system PATH
  • Creates a Desktop shortcut with the native aestra.ico emblem
  • Supports seamless in-place updates and rollback via native Windows MSI MajorUpgrade

Safe, offline & private. Aestra is 100% offline with zero network phone-home, zero remote telemetry, and zero background services.

Verify installation

Run diagnostic checks to verify runtime engines and toolchain compilers:

powershell
aestra doctor

Uninstall

To cleanly remove Aestra at any time, use Windows Settings or run msiexec:

cmd
# In Windows Settings -> Installed apps -> Aestra -> Uninstall, or:
msiexec /x Aestra-Setup.msi /quiet
Getting started / CP Quickstart

Competitive Programmer's Quickstart

Aestra acts as your automated local judge for competitive programming and coding contests. Never manually copy-paste test inputs again.

1. Where do I keep my code?

Anywhere on your computer! You never need to save files inside the Aestra folder. Work directly in your usual contest directory:

file tree
C:\Users\YourName\Documents\Contest\
├── solution.cpp             # Your solution (or .py, .rs, .go)
└── cases\                   # Sample test cases folder
    ├── 01.in                # Input from problem statement
    ├── 01.out               # Expected output
    ├── 02.in
    └── 02.out

2. How to create test cases

For each sample test given in the problem statement, create matching pairs of files in cases/:

  • 01.in: Paste the sample input from the problem statement.
  • 01.out: Paste the expected answer from the problem statement.
  • For test 2: create 02.in and 02.out, and so on.

3. Running the automated judge

Open your terminal in your contest directory and test your solution with a single command:

bash
aestra test solution.cpp --cases cases

Supports .cpp, .py, .rs, .go, or .exe. C++, Rust, and Go are automatically compiled with instant 0ms SHA-256 build caching.

4. Drag-and-drop interactive mode

If you prefer not to type commands, launch the interactive dashboard:

  1. Run aestra in any terminal.
  2. Press 2 for Batch Test Suite.
  3. Drag and drop your solution.cpp file from File Explorer into the terminal window, press Enter.
  4. Drag and drop your cases/ folder into the terminal window, press Enter.
Getting started / Safety

Safety and system integrity

Aestra is designed to execute untrusted code safely. It runs entirely in user space, never requests root or administrator privileges, never modifies system files, never writes outside its own directory, and leaves no persistent background processes or services.

No system risk. Installing and running Aestra cannot corrupt your operating system, registry, PATH, or personal files. It behaves identically to any standard Python development tool — it lives inside a virtual environment and cleans up completely on uninstall.

How untrusted code is contained

When the native POSIX sandbox executes a binary, it applies multiple layers of kernel-enforced constraints before the target program starts running. These are not heuristic — they are enforced by the Linux kernel scheduler itself.

ThreatAttack vectorMitigation
CPU spin while(true); infinite loop RLIMIT_CPU sends SIGXCPU when time limit is reached. A watchdog SIGKILL fires 1 second later as a hard backstop.
RAM flood malloc(64GB) allocation RLIMIT_AS causes mmap and brk to fail once the ceiling is hit. Host memory is never touched.
Fork bomb fork() in a loop RLIMIT_NPROC caps total child processes for the user.
Disk fill 50 GB stdout dump RLIMIT_FSIZE limits maximum file write size. Stdout is read through bounded pipe buffers (output_limit_bytes).
Network exfiltration Socket open to external host Empty environment passed to execve. No environment variables, no proxy configuration, no DNS resolution context.

What Aestra does NOT do

  • Never requests sudo, root, or administrator privileges
  • Never writes outside the project directory
  • Never installs system-wide services, daemons, or startup scripts
  • Never modifies your shell profile, PATH, registry, or system configuration
  • Never sends telemetry, analytics, or crash reports to any server
  • Never opens network connections (the sandbox itself is fully offline)

Subprocess engine safety

On Windows and macOS where the native POSIX sandbox is not available, SubprocessEngine uses Python's subprocess.run() with strict timeout enforcement. While this does not provide kernel-level memory limits, the process is still killed after the timeout expires. No zombie processes are left behind — the watchdog ensures cleanup.

Getting started / Use cases

Target use cases

Aestra is engineered for environments where untrusted or user-submitted code must be executed with microsecond-level determinism, strict hardware boundaries, and zero risk to the host system.

Competitive programming judges

Online judge platforms, contest engines, and internal team training environments require predictable time and memory accounting across thousands of heterogeneous submissions. Traditional judges rely on wall-clock measurements that fluctuate with server CPU load, causing false Time Limit Exceeded verdicts during traffic spikes.

Aestra solves this by delegating time limits to Linux kernel scheduler accounting:

  • Deterministic CPU time: Measures strictly user_time + kernel_time via the wait4 system call with microsecond resolution. Background server operations never inflate submission runtimes.
  • Hardware memory ceiling: Uses RLIMIT_AS to restrict address space. When a submission allocates beyond its quota (e.g. vector<int> a(1e9)), the allocation immediately fails without touching host swap or triggering the OS OOM killer.
  • Sub-millisecond startup: Uses native fork and execve without the multi-hundred-millisecond latency overhead of container lifecycle management.

Automated academic grading

Computer science university courses and autograding portals (such as automated submission runners and evaluation environments) frequently run untrusted student code that may contain infinite loops, memory leaks, or accidental system calls.

  • Zero root privilege: Runs entirely in user space. Student submissions cannot modify system configuration, write outside the designated sandbox, or corrupt other processes.
  • Fork bomb protection: Enforces RLIMIT_NPROC to cap child process creation, preventing malicious or accidental recursive fork() calls from locking the grading server.
  • Standardized verdicts: Direct mapping to educational grading categories (ACCEPTED, WRONG_ANSWER, TIME_LIMIT_EXCEEDED, MEMORY_LIMIT_EXCEEDED, RUNTIME_ERROR).

Local problem setting & stress testing

Contest problem setters and competitive programmers preparing for algorithmic contests need to stress-test candidate solutions against edge cases before publishing:

  • Automated test discovery: Scans test suites matching .in with .out or .ans and executes full batches with aggregated verdicts.
  • Diff inspector: Pinpoints exact token differences between actual program output and expected answers using TOKEN or EXACT mode.
  • Generator stress loops: Can be scripted inside a Python loop to continuously generate random test cases, run a brute-force $O(N^2)$ solution against an optimized $O(N \log N)$ solution, and stop upon finding a counterexample.

AI & LLM code evaluation

Autonomous AI agents, coding assistants, and research benchmark suites (such as HumanEval, MBPP, or SWE-bench) generate and execute arbitrary code strings at high velocity. Running LLM-generated code directly on the host machine presents substantial risk of system pollution, rogue network sockets, or infinite execution loops.

  • Environment isolation: Unsets all host environment variables, removing API keys, credentials, and network proxy access from the executed child process.
  • Hard backstop watchdog: If a runaway AI-generated process ignores SIGXCPU, a hard kernel SIGKILL terminates the process cleanly within 1 second.
  • Machine-readable telemetry: The Python SDK returns structured dataclasses (ExecutionResult) ready for automated reward scoring and validation pipelines.
Guides / Running programs

Running programs

Execute a compiled binary or script under hardware-enforced CPU and memory constraints, and receive structured telemetry about the execution.

CLI usage

The aestra run command executes a single binary with the specified constraints:

shell
aestra run ./solution.out --time-limit 2000 --memory-limit 512

Or invoke directly via Python module: python -m src.cli run ./solution.out --time-limit 2000 --memory-limit 512

Telemetry output

After execution completes (or is terminated), Aestra prints a structured telemetry block:

output
[Telemetry]
Status: TIME_LIMIT_EXCEEDED
CPU Time: 2003ms
Peak Memory: 12.1MB
Exit Code: 137 (SIGKILL)

The CPU time shown is user + kernel time measured by the kernel via wait4 — not wall-clock time. This means background system load does not affect the measurement.

Available flags

FlagDefaultDescription
--time-limit2000Maximum CPU time in milliseconds. Maps to RLIMIT_CPU on POSIX systems.
--memory-limit512Maximum memory in megabytes. Maps to RLIMIT_AS on POSIX systems.
--input""String piped to the program's stdin via POSIX pipe.

Python SDK

Use the engine directly from Python for programmatic execution and result inspection:

python
from pathlib import Path
from src.config import ExecutionLimits
from src.engine import get_engine

engine = get_engine()
limits = ExecutionLimits(time_limit_ms=2000, memory_limit_mb=512)
result = engine.execute(Path("./solution.out"), limits, input_data="42\n")

print(result.status.value)        # OK | TIME_LIMIT_EXCEEDED | ...
print(f"{result.cpu_time_ms:.2f} ms")
print(f"{result.peak_memory_mb:.1f} MB")
print(result.stdout)

Execution statuses

Every execution returns an ExecutionStatus enum. These map directly to competitive programming judge verdicts:

StatusTriggerExit code
OKNormal termination with exit code 00
TIME_LIMIT_EXCEEDEDCPU time exceeded limit or SIGXCPU/SIGKILL128 + signal
MEMORY_LIMIT_EXCEEDEDSIGSEGV with peak memory ≥ limit128 + 11
RUNTIME_ERRORNon-zero exit or uncaught signalVaries
OUTPUT_LIMIT_EXCEEDEDStdout exceeds output_limit_bytesVaries
INTERNAL_ERRORSandbox infrastructure failure (pipe, fork, import)1
Guides / Batch testing

Batch testing

Run a program against a full directory of test cases, automatically discover input/output pairs, and receive aggregated verdicts with per-case timing.

Basic usage

shell
aestra test ./solution.out --cases ./tests/ --mode token

Or invoke directly via Python module: python -m src.cli test ./solution.out --cases ./tests/ --mode token

Test case discovery

Aestra automatically discovers paired input/output files in the test directory. It supports multiple naming conventions commonly used in competitive programming:

Input fileExpected output
1.in1.out or 1.ans
test_01.intest_01.out or test_01.ans
sample.insample.out

Files are matched by base name — foo.in pairs with foo.out or foo.ans. Input files without a matching output file are skipped with a warning.

Verdicts

Each test case produces one of the following verdicts:

VerdictMeaning
ACCEPTEDProgram output matches the expected answer after applying the comparison mode
WRONG_ANSWERProgram ran successfully but output does not match
TIME_LIMIT_EXCEEDEDCPU time exceeded the configured limit
MEMORY_LIMIT_EXCEEDEDMemory usage exceeded the configured ceiling
RUNTIME_ERRORProgram crashed or returned non-zero exit code

Comparison modes

The --mode flag controls how actual output is compared against expected output. See the Output comparison section for detailed behavior.

Guides / Output comparison

Output comparison modes

The OutputChecker class compares actual program output against expected answers using one of three comparison strategies. The mode you choose affects whether trailing whitespace, extra newlines, or formatting differences cause a WRONG_ANSWER verdict.

Available modes

ModeBehaviorUse case
TOKEN Splits both strings by whitespace (.split()), then compares the resulting token sequences. Any amount of whitespace between tokens is treated identically. Standard competitive programming problems. Ignores trailing spaces, extra newlines, and inconsistent indentation.
IGNORE_WHITESPACE Strips leading and trailing whitespace from both strings (.strip()), then performs exact string comparison on the result. Problems where internal formatting matters but trailing newlines should be tolerated.
EXACT Byte-for-byte equality comparison. No normalization applied. Strict output problems: formatted text, ASCII art, CSV output, or any case where whitespace is significant.

Python usage

python
from src.checker import OutputChecker, CheckerMode

checker = OutputChecker(CheckerMode.TOKEN)
result = checker.check(actual="42 \n", expected="42")
print(result.is_correct)  # True — whitespace difference ignored in TOKEN mode

# EXACT mode would reject this:
strict = OutputChecker(CheckerMode.EXACT)
result = strict.check(actual="42 \n", expected="42")
print(result.is_correct)  # False — trailing space and newline cause mismatch

CheckResult object

The check() method returns a CheckResult dataclass:

FieldTypeDescription
is_correctboolWhether the output matched under the chosen mode
diffstr | NoneA human-readable diff showing expected vs. actual (only set when incorrect)
Reference / Interface & layout

Interface and system layout

Aestra provides structured interfaces at every layer: a clear terminal output layout for interactive debugging, a composable Python SDK for automated pipelines, and hardware-enforced boundaries at the kernel level.

System architecture layout

The system is organized into decoupled layers communicating across language boundaries:

┌─────────────────────────────────────────────────────────────────────────────┐ │ ORCHESTRATION LAYER │ │ │ │ CLI Interface (src/cli.py) Python SDK Scripts (src/) │ │ aestra run | aestra test get_engine(), ExecutionLimits │ └───────────────────────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────────────────────▼─────────────────────────────────────┐ │ ENGINE ABSTRACTION │ │ │ │ BaseEngine (src/engine.py) │ │ ├── NativeEngine ───► Linux / WSL (Hardware enforcement) │ │ └── SubprocessEngine ──► Windows / macOS (Cross-platform fallback) │ └───────────────────────────────────────┬─────────────────────────────────────┘ │ (PyO3 ABI3 FFI) ┌───────────────────────────────────────▼─────────────────────────────────────┐ │ RUST CORE (aestra_core) │ │ │ │ lib.rs ────────────► PyO3 FFI bridge (execute_native) │ │ sandbox_posix.rs ───► fork() ──► setrlimit() ──► execve() ──► wait4() │ └───────────────────────────────────────┬─────────────────────────────────────┘ │ (POSIX System Calls) ┌───────────────────────────────────────▼─────────────────────────────────────┐ │ LINUX KERNEL SUBSYSTEM │ │ │ │ RLIMIT_CPU (SIGXCPU) │ RLIMIT_AS (Heap cap) │ wait4 rusage telemetry │ └─────────────────────────────────────────────────────────────────────────────┘

Terminal CLI output layout

When running through the command line, Aestra produces structured visual output designed for rapid terminal inspection.

Single execution layout

terminal
$ aestra run ./solution.out --time-limit 2000 --memory-limit 512

[Telemetry]
Status: OK
CPU Time: 14.8ms
Peak Memory: 8.4MB
Exit Code: 0

[Output]
42

Batch test runner layout

terminal
$ aestra test ./solution.out --cases ./tests/ --mode token

Running 4 test cases on solution.out...
Limits: 2000ms CPU, 512MB RAM | Mode: TOKEN

  [ACCEPTED]               test_01.in        12.4ms    8.2MB
  [ACCEPTED]               test_02.in        15.1ms    8.4MB
  [TIME_LIMIT_EXCEEDED]    test_03.in      2001.2ms   12.0MB
  [WRONG_ANSWER]           test_04.in         9.8ms    6.1MB
      Expected:
      42 100
      Actual:
      42 99

Verdict: 2/4 test cases accepted.

Verdict badge taxonomy

Verdicts represent standardized competitive programming judge outcomes:

VerdictBadgeCondition
AcceptedACCEPTEDProcess exited 0 and output matched expected answer under active comparison mode
Wrong AnswerProcess exited 0 but output differed from expected answer
Time LimitTIME_LIMIT_EXCEEDEDCPU time exceeded limit or terminated by SIGXCPU / SIGKILL
Memory LimitMEMORY_LIMIT_EXCEEDEDProcess exceeded configured RAM ceiling or crashed with SIGSEGV under memory pressure
Runtime ErrorRUNTIME_ERRORProcess crashed with non-zero exit code or uncaught signal (e.g. SIGABRT)

Python SDK dataflow layout

The programmatic interface follows a unidirectional dataflow pipeline:

python
from pathlib import Path
from src.config import ExecutionLimits
from src.engine import get_engine
from src.checker import OutputChecker, CheckerMode

# 1. Configure resource limits
limits = ExecutionLimits(time_limit_ms=1000, memory_limit_mb=256)

# 2. Acquire appropriate engine (NativeEngine or SubprocessEngine)
engine = get_engine()

# 3. Execute binary and capture telemetry
result = engine.execute(Path("./solution"), limits, input_data="10 20\n")

# 4. Compare output against expected answer
checker = OutputChecker(mode=CheckerMode.TOKEN)
check_result = checker.check(actual=result.stdout, expected="30\n")

print(f"Verdict: {'ACCEPTED' if check_result.is_correct else 'WRONG_ANSWER'}")
print(f"CPU Time: {result.cpu_time_ms}ms | Peak RAM: {result.peak_memory_mb}MB")
Reference / Architecture

Architecture

Aestra uses a two-tier execution model. The Rust core handles low-level POSIX sandboxing, while the Python frontend provides CLI orchestration, answer verification, and configuration management. The two layers communicate through a zero-cost PyO3 FFI bridge.

Tier 1 — Native POSIX sandbox

On Linux and WSL, aestra_core (compiled from src/sandbox_posix.rs) performs the following sequence:

  1. Creates three POSIX pipes for stdin, stdout, and stderr IPC
  2. Calls fork() to create a child process
  3. In the child: applies setrlimit for RLIMIT_CPU, RLIMIT_AS, RLIMIT_NPROC, and RLIMIT_FSIZE
  4. Redirects file descriptors with dup2 and calls execve with an empty environment
  5. In the parent: writes input data to stdin pipe, then reads stdout and stderr through bounded buffers
  6. Calls wait4 to collect the exit status and rusage struct containing CPU time and peak RSS
  7. Interprets the exit signal (SIGXCPU, SIGKILL, SIGSEGV) to determine the verdict

Tier 2 — Subprocess fallback

On Windows and macOS, or when the native extension is not compiled, SubprocessEngine in src/engine.py provides an equivalent interface using Python's subprocess.run(). It passes timeout= for time enforcement and measures wall-clock time via time.perf_counter().

Limitations of the fallback engine:

  • Memory measurement is not available (reports 0 bytes)
  • Wall-clock time is used instead of CPU time — affected by system load
  • No kernel-level process limits — the target runs with normal user permissions

Automatic selection. The get_engine() factory function detects available backends at import time. It tries to import aestra_core and returns NativeEngine if successful, otherwise falls back to SubprocessEngine. No configuration or environment variables needed.

Project structure

tree
aestra/
├── src/
│   ├── core/
│   │   ├── lib.rs               # PyO3 module definition — exposes execute_native()
│   │   └── sandbox_posix.rs     # Rust POSIX sandbox: fork, setrlimit, execve, wait4
│   ├── __init__.py              # Package exports
│   ├── checker.py               # OutputChecker & FloatToleranceChecker
│   ├── cli.py                   # Production CLI (run, test, fuzz, doctor)
│   ├── compiler.py              # Multi-language compiler pipeline & SHA-256 caching
│   ├── config.py                # ExecutionLimits dataclass
│   ├── engine.py                # NativeEngine & SubprocessEngine
│   ├── models.py                # ExecutionResult & ExecutionStatus
│   ├── runner.py                # BatchRunner engine & testcase discovery
│   └── sdk.py                   # High-level SDK, concurrent Fuzzer & Minimizer
├── tests/
│   ├── test.py                  # Master test suite runner
│   └── test_*.py                # Modular unit & integration tests
├── scripts/
│   ├── aestra.wxs               # WiX v4 definition for native Windows MSI installer
│   └── build_msi.ps1            # Automated zero-cost WiX build script
├── assets/                      # Application icons & emblem branding
├── Cargo.toml                   # Core Rust extension crate configuration
├── pyproject.toml               # Python build & packaging metadata
└── .github/workflows/           # CI, release packaging, and MSI workflows
Reference / API reference

API reference

Complete reference for all public classes, methods, and data models in the Aestra Python SDK.

ExecutionLimits

Python src.config.ExecutionLimits

Frozen dataclass that defines resource constraints for a single execution run.

FieldTypeDefaultDescription
time_limit_msint2000Maximum CPU time in milliseconds
memory_limit_mbint512Maximum memory in megabytes

Properties

PropertyReturnsDescription
.time_limitintTime limit in whole seconds (floor division, minimum 1)
.memory_limit_bytesintMemory limit converted to bytes

ExecutionResult

Python src.models.ExecutionResult

Frozen dataclass containing the outcome and telemetry from a single execution.

FieldTypeDescription
statusExecutionStatusVerdict enum
exit_codeintProcess exit code (128 + signal if killed)
cpu_time_msfloatUser + kernel CPU time in milliseconds
wall_time_msfloatWall-clock time in milliseconds
peak_memory_bytesintPeak resident set size in bytes
stdoutstrCaptured standard output
stderrstrCaptured standard error
error_messagestr | NoneInternal error description (if applicable)

Properties

PropertyReturnsDescription
.peak_memory_mbfloatPeak memory converted to megabytes
.is_successboolTrue if status is SUCCESS, OK, or ACCEPTED and exit code is 0

get_engine()

Python src.engine.get_engine() → BaseEngine

Factory function that returns the best available execution engine. Attempts to import aestra_core and returns NativeEngine if available, otherwise returns SubprocessEngine.

python
from src.engine import get_engine

engine = get_engine()
# Returns NativeEngine on Linux/WSL, SubprocessEngine on Windows/macOS

OutputChecker

Python src.checker.OutputChecker

MethodArgumentsReturns
__init__mode: CheckerMode = TOKEN—
checkactual: str, expected: strCheckResult

execute_native()

Rust aestra_core.execute_native() → dict

Low-level Rust function exposed via PyO3. Called internally by NativeEngine.

ParameterTypeDescription
commandstrPath to the executable binary
argslist[str]Command-line arguments
input_datastrData piped to stdin
time_limit_msintCPU time limit in milliseconds
memory_limit_mbintMemory limit in megabytes
Community / Contributing

Contributing

Contributions to Aestra are welcome. We maintain strict engineering standards to preserve deterministic execution and FFI boundary safety. This guide covers development setup, quality checks, pull request workflow, and project conventions.

Development setup

You need both Rust and Python to work on the full codebase:

Prerequisites

ToolVersionInstall
Rust1.75.0+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Python3.10+python.org

Environment setup

bash
git clone https://github.com/Elitsuv/aestra.git
cd aestra

python3 -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

pip install maturin ruff mypy pytest
maturin develop

Quality standards

All pull requests must pass the following checks locally before submission. The CI pipeline runs these automatically on every PR.

Python linting Python

bash
ruff check .              # Lint check
ruff format --check .     # Format check
mypy src/                 # Type check

Rust linting Rust

bash
cargo fmt --all -- --check                                    # Format check
cargo clippy --all-targets --all-features -- -D warnings      # Lint check
cargo test --all                                              # Unit tests

Pull request lifecycle

  1. Branch naming: Use scoped branch names like feat/sandbox-limits, fix/zombie-pid, or docs/api-reference
  2. Atomic commits: Write clear, imperative commit messages following conventional commits — e.g. feat(rust-core): enforce rlimit AS
  3. Target main: All PRs target the main branch. Ensure both Python and Rust CI checks pass before requesting review.
  4. PR quality audit: The PR template includes a checklist for code quality, test coverage, and documentation updates.

Label taxonomy

Attach appropriate labels to your PR for categorization and changelog generation:

Size labels

LabelLines changed
size: xsmall< 10 lines
size: small< 50 lines
size: mid< 250 lines
size: large< 1000 lines

Type labels

LabelUse for
type: featureNew functionality
type: bugBug fixes
type: perfPerformance improvements
type: refactorCode restructuring without behavior change
type: choreBuild system, CI, dependency updates
type: docsDocumentation only

Domain labels

LabelScope
domain: rust-coreRust engine, PyO3 FFI, POSIX sandbox
domain: python-coreCLI, config, checker, test runner

CI pipeline

The CI pipeline runs on every push to main and every pull request. It has two jobs:

Python quality CI

Runs on ubuntu-latest with Python 3.11. Executes Ruff lint, Ruff format, and Mypy type checking against src/.

Rust core build CI

Runs on both ubuntu-latest and windows-latest in a matrix. Executes cargo fmt --check, cargo clippy -D warnings, cargo test, and maturin build --release to verify the extension compiles cleanly on both platforms.

Branch protection. The main branch has protection rules enabled: force pushes are blocked and branch deletion is restricted. All CI checks must pass before merge.

Community / Changelog

Changelog

Release notes and version history for Aestra.

v1.1.1 Production October 2026

Production release: WiX v4 native Windows MSI installer, concurrent fuzzing engine with delta-debugging minimizer, modular 54-test suite, and complete telemetry purge.

  • Native Windows MSI Installer: Professional Aestra-Setup.msi generated via WiX Toolset ($0 cost), providing native Windows Add/Remove Programs integration and automatic PATH registration.
  • Concurrent Fuzzer & Minimizer: Multi-worker testcase stress testing with hierarchical delta-debugging algorithm for automatic minimal reproduction extraction.
  • 100% Offline & Private: Complete deletion of all remote telemetry and network checkers in strict compliance with engineering ethics.
  • Core Separation: Rust kernel sandbox moved to dedicated src/core/ crate architecture with clean Python bindings.
  • Modular 54-Test Suite: 100% clean test pass rate covering batch execution, floating-point tolerance, compiler caching, and CLI command workflows.
v1.0.1 Stable September 2026

Windows UX polish, 1-click installer reliability fixes, ANSI colored terminal engine, and clean uninstaller suite.

  • Win32 Console Virtual Terminal API: Replaced slow subprocess spawning with native kernel32 virtual terminal mode for vibrant, immediate ANSI colors.
  • Input & Empty File Validation: Solution paths are now verified before execution; empty or whitespace-only files produce clear colored warnings rather than blank telemetry.
  • Installer Wizard Loop Fix: Fixed variable scoping in PowerShell WinForms wizard so "Launch Aestra" immediately opens the command terminal instead of repeating installation.
  • Windows Security Warnings Prevented: Integrated automatic file unblocking in install.bat and PowerShell scripts to eliminate Mark-of-the-Web and SmartScreen warnings.
  • Dedicated Uninstallation Wizard: Added uninstall.bat and scripts/uninstall.ps1 for clean 1-click removal of ~/.aestra, PATH entries, and shortcuts.
  • Cropped High-Resolution Emblem: Removed 106px of black border padding from aestra.png and updated multi-resolution aestra.ico.
v1.0.0 Stable September 2026

First official stable release: interactive AI-CLI terminal window, Windows 1-click installer wizard with App Icon, transparent multi-language compiler caching, and zero-toolchain execution sandbox.

  • Interactive AI-CLI Console: Typing aestra without arguments launches a rich terminal dashboard with interactive run, test, fuzz, and system doctor diagnostics.
  • Windows 1-Click Setup Wizard: Instant installation via install.bat with automatic User PATH registration, custom desktop shortcut with aestra.ico, and zero administrative rights required.
  • Multi-Language Compiler Pipeline: Transparent detection and compilation of C++, C, Rust, and Go with SHA-256 caching in .aestra/build.
  • Zero Rust Requirement: Native Windows memory telemetry via K32GetProcessMemoryInfo. Only standard Python 3.10+ is needed to run.
  • Zero Host Pollution: Full sandboxing isolation ensuring temporary binaries and child processes never interfere with the host system.
  • Unified 27-Test Verification Suite: 100% test coverage spanning engine safety, compilers, and CLI diagnostics.
v0.1.2 September 2026

Engine hardening release: POSIX sandbox deadlock elimination, wall-clock watchdog, and real-time cross-platform memory telemetry.

  • POSIX Pipe Buffer Deadlock Resolution: Replaced sequential blocking pipe reads with non-blocking libc::poll event multiplexing (POLLIN | POLLHUP | POLLERR) to prevent 64KB kernel buffer deadlocks when children emit verbose stderr logs.
  • Active Wall-Clock Watchdog: Added parent-side deadline enforcement using std::time::Instant and libc::SIGKILL to prevent sleeping or deadlocked binaries from bypassing RLIMIT_CPU and hanging the runner.
  • Cross-Platform Peak Memory Tracking: SubprocessEngine now accurately reports peak working set size on Windows via K32GetProcessMemoryInfo and peak child RSS on macOS/POSIX via resource.getrusage(RUSAGE_CHILDREN).
  • Strict Memory Limit Enforcement (MLE): Automatic enforcement of limits.memory_limit_bytes across all platforms, reliably returning MEMORY_LIMIT_EXCEEDED on breach.
  • Strict Type Compliance: Added full return type annotations and Callable[[], None] type hints across tests/test.py for 100% strict Mypy compliance.
  • Automated Release CI Pipeline: Added .github/workflows/release.yml to build native wheel packages via Maturin and publish official GitHub Releases on tags.
v0.1.1 September 2026

Official release: global PATH integration, native Python solution testing, and CLI visual overhaul.

  • Global Command Installation: install.ps1 and install.sh install aestra into user PATH (Python Scripts/ and ~/.local/bin) for global execution from any directory.
  • Native Python Solution Support: SubprocessEngine automatically executes .py scripts without requiring shell wrappers or pre-compilation.
  • Modern Terminal Interface: CLI upgraded with clean boxed headers, command groupings, and formatted ASCII telemetry tables.
  • Installer Directory Self-Healing: Automated pre-check cleans broken directory artifacts before cloning to prevent git destination conflicts.
  • Complete CP User Guide: Hands-on guides for evaluating competitive programming solutions against .in/.out testcase suites.
v0.1.0-beta September 2026

Initial public beta release. Core sandbox and testing infrastructure.

  • Rust POSIX sandbox with fork, execve, setrlimit, and wait4 telemetry (sandbox_posix.rs)
  • PyO3 FFI bridge exposing execute_native() to Python via lib.rs
  • Cross-platform SubprocessEngine fallback for environments without a native Rust toolchain
  • Batch test runner with automated .in/.out testcase discovery and verdict aggregation (runner.py)
  • Terminal CLI with run and test subcommands, colored badges, and microsecond telemetry (cli.py)
  • Output checker with TOKEN, EXACT, and IGNORE_WHITESPACE comparison modes (checker.py)
  • Domain models with immutable ExecutionLimits and rich ExecutionResult status telemetry
  • Zero-dependency installers for Linux/macOS Bash (install.sh) and Windows PowerShell (install.ps1)
  • Enterprise CI/CD pipeline with Ruff formatting/linting, strict Mypy types, and Rust test matrices
  • Documentation portal hosted on GitHub Pages with 12 guides, dark mode, dynamic TOC, and live commit feed
  • Engineering standards including branch protection, standardized PR/issue templates, and PR commenter bot

Recent commits

Loading from GitHub…