Skip to content
ARTEX.sh

How ARTEX works:a planner, three workers and a guard, over two graphs.

ARTEX is one Go binary with a Next.js console, over PostgreSQL. This page walks through a run, the parts inside the binary, the 31 tools the model can call, the guard and every release from v0.3.2 to v0.3.25.

The ARTEX loop:plan, work, guard, prove, then plan again.

  1. 01

    Plan

    A change in the graph wakes the planner. It reads coverage and scope, updates its todolist and dispatches intents, each tied to an asset.

  2. 02

    Work

    Three workers by default. Each claims one intent, runs real tools like nmap, curl and Playwright, writes facts and findings back, then stops.

  3. 03

    Guard

    Every tool call passes intercept rules, then an LLM judge, then a human. All traffic runs through a recording proxy on port 8788 as evidence.

  4. 04

    Prove

    Each write wakes the planner again until prove_goal closes the goal. A reporter merges duplicates, a retester checks fixes.

Isometric illustration of connected blocks and a data path
  1. 01A graph change wakes the planner (debounced, about 800 ms).
  2. 02The planner reads graph_overview, coverage and scope.
  3. 03It dispatches 0 to N intents into the frontier queue.
  4. 04A worker claims one intent and loads its assets.
  5. 05The worker runs tools through the guard and the recording proxy.
  6. 06It writes facts, assets and findings back to both graphs.
  7. 07The write wakes the planner again, until prove_goal.

A full ARTEX run,from new task to merged report, in 9 steps.

  1. 01

    Create a task

    A description, targets, an optional template, per-task allow and block rules, and an ordered chain of LLM profiles. A task can inherit facts from earlier tasks.

  2. 02

    Load the assets

    Assets enter the shared asset graph, typed by the agent or imported from ScopeSentry. DNS and HTTP enrichment runs in the background.

  3. 03

    Split into goals

    The goals agent breaks the task into goal nodes and pulls out the scope.

  4. 04

    Plan

    The planner wakes, reads the graph overview, coverage and scope, updates its todolist and dispatches intents tied to assets. Blocked assets are refused here.

  5. 05

    Work

    Workers, 3 by default, each claim one intent and run real tools through the guard and the recording proxy.

  6. 06

    Write back

    Workers write facts, new assets, optional credentials and findings, each with evidence and the captured traffic.

  7. 07

    Repeat

    Every write wakes the planner again, until the goals are proven or the budget or time runs out. A worker gets 1,200 seconds by default.

  8. 08

    Report

    A reporter writes one report per finding, merges duplicates of the same defect into vuln folders and can push alerts to chat apps. A retester re-checks fixes.

  9. 09

    Steer

    People can step in at any time: chat with the main agent, add hints, message a running worker, pause it, or ask a /btw side question.

Two graphs inside ARTEX:assets and findings, linked by anchors.

ARTEX is one Go binary with the Next.js console embedded, over PostgreSQL. It keeps what it knows in two graphs.

tools exposed to the LLM
31
PostgreSQL tables
60
LLM wire formats
4
workers per task by default
3

Exploration graph

One per task

  • goal
  • intent
  • fact
  • finding
  • hint

Anchors link each intent, fact and finding to the assets it touched. That powers the coverage map.

  • root domain
  • subdomain
  • ip
  • service
  • app
  • endpoint

Asset graph

Global, shared by every task

Inside the ARTEX binary:12 parts, from the planner to the traffic recorder.

Source: the ARTEX README and code at RuoJi6/ARTEX
  • Engine

    server/engine.go

    One planner loop and N worker routines per task. Claims intents, handles timeouts, pause and drain.

  • Goals agent

    agent/goals.go

    Breaks a task into goals and extracts the scope.

  • Planner

    agent/planner.go

    The only agent that creates intents. Keeps a shared todolist across wake-ups so multi-step chains stay in order.

  • Worker

    agent/worker.go

    Claims one intent, runs tools, writes results back to both graphs, then stops.

  • Main agent

    agent/mainagent.go

    The chat agent inside a task. A person can talk to it and it can add intents and hints.

  • Reporter and retester

    agent/finding_recorder.go

    Writes finding reports, merges duplicates into vuln folders and re-tests a finding as reproducible, fixed or unconfirmed.

  • Guard

    guard/, intercept/

    Checks every tool call: intercept rules, then an LLM judge, then human approval. Keeps an audit log.

  • Traffic recorder

    traffic/

    A recording proxy with its own certificate authority on port 8788. All worker HTTP and shell traffic is saved as evidence.

  • Enrich

    enrich/enrich.go

    Resolves DNS and HTTP details for new assets in the background.

  • LLM pool

    llmpool/, llmrec/

    Holds the model profiles, fails over between them and records raw requests and replies.

  • Notify

    notify/

    Pushes findings to DingTalk, Feishu, WeCom, Telegram, email or a webhook, live or as a 30 minute digest.

  • Self update

    selfupdate/

    One-click update from GitHub Releases with checksum, smoke test and rollback after 3 failed boots.

31 tools the ARTEX model can call,plus the shell, HTTP, web search and MCP.

These are the graph and report tools ARTEX gives the LLM. Workers also get a shell, HTTP requests, file reads, web search, remote MCP servers and skills.

Graph and report tools31

  • add_intent
  • add_hint
  • prove_goal
  • graph_overview
  • node_detail
  • list_goals
  • list_facts
  • record_fact
  • record_intelligence
  • insert_assets
  • list_assets
  • list_untested_assets
  • list_companies
  • report_finding
  • update_finding_report
  • update_finding_case_report
  • search_finding_duplicates
  • list_findings
  • list_task_findings
  • get_finding_record
  • get_finding_case
  • get_finding_traffic
  • search_all_worker_traces
  • list_worker_traces
  • get_worker_trace
  • get_worker_output
  • get_task_graph
  • get_task_node_detail
  • list_task_worker_traces
  • get_task_worker_trace
  • spawn_task

Programs in the Docker image12

  • nmap
  • curl
  • wget
  • ripgrep
  • jq
  • git
  • dig
  • netcat
  • whois
  • Node.js 22
  • Playwright + Chromium
  • Playwright MCP

The ARTEX guard:rules, then an LLM judge, then a person.

Every tool call passes the guard before it runs. These are the controls in the open code, with the version that added each one.

  1. Intercept rules

    v0.3.15

    Allow and deny rules, plus built-in rules for destructive calls like HTTP DELETE and delete-like paths.

  2. LLM judge

    v0.3.11

    Reviews calls the rules do not settle. Since v0.3.23 a judge failure falls back to human approval instead of letting the call through.

  3. Asset blocklist

    v0.3.13

    Blocks .gov, .gov.cn, .edu and .edu.cn by default, with per-task allow and block lists on top.

  4. Script review

    v0.3.18

    The judge sees a snapshot of each script: path, size and SHA-256. An incomplete snapshot forces human review.

  5. Basic Auth

    v0.3.16

    Optional HTTP Basic Auth in front of the console, added by RuoJi6.

  6. Recording proxy

    All tool traffic runs through the proxy on port 8788, so every request a worker makes is kept as evidence.

The open code once had a rules-of-engagement scope check. It was removed, and ThreatBook says the open edition has no built-in safety controls.

Models ARTEX can run on:any Anthropic or OpenAI compatible endpoint.

  • anthropic

    Messages API

  • openai

    Chat Completions

  • openai-responses

    Responses API, since v0.3.5

  • jev

    TypeSafe System One, for approval judging

  • A base URL setting lets DeepSeek, GLM, Qwen and gateways plug in as profiles.
  • Each task has an ordered chain of profiles. It fails over only on quota or billing errors.
  • Five retry layers: connect, empty reply, safe replay, circuit breaker and intent re-run.
  • CrowdStrike saw ARTEX run on DeepSeek v4.1-flash, with GLM-5.3 and Grok 4.6 nearby.

The ARTEX stack:Go, Next.js, PostgreSQL and SQLite.

tools exposed to the LLM
31
PostgreSQL tables
60
LLM wire formats
4
workers per task by default
3
Backend
Go 1.26, one binary, REST API with server-sent events
Console
Next.js 16, React 19, Tailwind 4, embedded in the binary
Agent SDK
norma v0.4.3 by Autumn-27, Apache-2.0, still public
Main store
PostgreSQL 16: both graphs, tasks, findings, settings, 60 tables
Traffic store
SQLite under ./data
Port 8787
Web console, API and live stream
Port 8788
Recording proxy, bound to localhost in Docker Compose
Docker image
ruoji6/artex for amd64 and arm64. The original autumn27/artex is gone
Code size
173,504 lines in v0.3.25: Go 100,569, TypeScript 62,418
History
458 commits, first on 2026-07-26
License
AGPL-3.0

Every ARTEX release,v0.3.2 to v0.3.25, original and RuoJi6.

Releases up to v0.3.15 come from Autumn-27, the original author. From v0.3.16 on they come from RuoJi6/ARTEX, the main maintained fork.

VersionDateByWhat changed
v0.3.252026-10-29RuoJi6Egress IP banner, auto titles, findings sort fixes, runtime excludes pause
v0.3.242026-10-26RuoJi6Go 1.26.10 (eMudhra CA distrust), Burp-Repeater-like request replay on findings, removed 'flag' wording from prompts
v0.3.232026-10-20RuoJi6Model judge failure defaults to human approval; optional task intelligence recording
v0.3.222026-10-19RuoJi6Mock demo auto-deploy to Vercel, update proxy, scheduled task fix
v0.3.212026-10-15RuoJi6Judge retry on failure, strict LLM request rate limit
v0.3.202026-10-13RuoJi6Script snapshot false positive fixes, default model review
v0.3.192026-10-12RuoJi6Command misjudgment fixes, script review policy config
v0.3.182026-10-12RuoJi6Script review snapshots, approval side Q&A, approval search
v0.3.172026-10-10RuoJi6Calendar scheduled tasks
v0.3.162026-10-09RuoJi6Optional HTTP Basic Auth; duplicate finding merge into vuln folders
v0.3.15Last original release2026-10-07Autumn-27Delete-path intercept rule; judge token metering; IM push to DingTalk/Feishu/WeCom/webhook/Telegram/email with SSRF hardening. RuoJi6 re-published it as its first release on 2026-10-09
v0.3.14Login bypass2026-09-24Autumn-27Task list vuln column; slimmer graph_overview. Has the fail-open auth bug exploited by ARTXploit (commit b55ceb1)
v0.3.132026-09-19Autumn-27Global asset blocklist (default .gov/.edu), per-task allow/block, tighter judge output to avoid fail-open
v0.3.122026-09-17Autumn-27Exploration broadcast board; soft/hard intent delete. v0.3.12 prebuilt binaries mirrored at bear20252026/ARTEX-release
v0.3.112026-09-15Autumn-27Approval source jump; slimmer judge input; experimental noa compaction (norma v0.4.0)
v0.3.102026-09-13Autumn-27DeepSeek web search backend; worker cross-trace search; add_hint triggers; base for the enwjx/artex-ymh offensive branch
v0.3.92026-09-11Autumn-27Multi-session main agent; /btw side questions; spawn_task source_task_ids; empty-turn fix
v0.3.82026-09-09Autumn-27Five configurable retry layers; session header; in-place wrap-up on timeout; planner stall guard
v0.3.72026-08-31Autumn-27Max output tokens; message running workers; streamed archives (OOM fix). Baseline kept by Core-RCE/ARTEX-original-version; version analyzed in the contest write-up
v0.3.62026-08-27Autumn-27LLM test checks real reply; paginated list_facts; tool call stats
v0.3.52026-08-25Autumn-27Streaming toggle per LLM profile; OpenAI Responses API format; raw LLM wire recording
v0.3.42026-08-24Autumn-27Batch task categories; main agent add_intent on finished tasks
v0.3.32026-08-23Autumn-27Worker pause/cancel fences, paused intent state, FIFO admission, worker wall clock 600 s -> 1200 s
v0.3.22026-08-20Autumn-27Task inheritance from source tasks; ordered LLM profile chain with quota failover; pause/resume/cancel workers; task delete with cleanup; task concurrency cap

Follow the ARTEX story.

New forks, releases and reports, dated and sourced.

Isometric plane with glowing light columns