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.
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.
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.
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.
04
Prove
Each write wakes the planner again until prove_goal closes the goal. A reporter merges duplicates, a retester checks fixes.

- 01A graph change wakes the planner (debounced, about 800 ms).
- 02The planner reads graph_overview, coverage and scope.
- 03It dispatches 0 to N intents into the frontier queue.
- 04A worker claims one intent and loads its assets.
- 05The worker runs tools through the guard and the recording proxy.
- 06It writes facts, assets and findings back to both graphs.
- 07The write wakes the planner again, until prove_goal.
A full ARTEX run,from new task to merged report, in 9 steps.
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.
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.
03
Split into goals
The goals agent breaks the task into goal nodes and pulls out the scope.
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.
05
Work
Workers, 3 by default, each claim one intent and run real tools through the guard and the recording proxy.
06
Write back
Workers write facts, new assets, optional credentials and findings, each with evidence and the captured traffic.
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.
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.
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.
Engine
server/engine.goOne planner loop and N worker routines per task. Claims intents, handles timeouts, pause and drain.
Goals agent
agent/goals.goBreaks a task into goals and extracts the scope.
Planner
agent/planner.goThe only agent that creates intents. Keeps a shared todolist across wake-ups so multi-step chains stay in order.
Worker
agent/worker.goClaims one intent, runs tools, writes results back to both graphs, then stops.
Main agent
agent/mainagent.goThe chat agent inside a task. A person can talk to it and it can add intents and hints.
Reporter and retester
agent/finding_recorder.goWrites 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.goResolves 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.
Intercept rules
v0.3.15Allow and deny rules, plus built-in rules for destructive calls like HTTP DELETE and delete-like paths.
LLM judge
v0.3.11Reviews calls the rules do not settle. Since v0.3.23 a judge failure falls back to human approval instead of letting the call through.
Asset blocklist
v0.3.13Blocks .gov, .gov.cn, .edu and .edu.cn by default, with per-task allow and block lists on top.
Script review
v0.3.18The judge sees a snapshot of each script: path, size and SHA-256. An incomplete snapshot forces human review.
Basic Auth
v0.3.16Optional HTTP Basic Auth in front of the console, added by RuoJi6.
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.
| Version | Date | By | What changed |
|---|---|---|---|
| v0.3.25 | 2026-10-29 | RuoJi6 | Egress IP banner, auto titles, findings sort fixes, runtime excludes pause |
| v0.3.24 | 2026-10-26 | RuoJi6 | Go 1.26.10 (eMudhra CA distrust), Burp-Repeater-like request replay on findings, removed 'flag' wording from prompts |
| v0.3.23 | 2026-10-20 | RuoJi6 | Model judge failure defaults to human approval; optional task intelligence recording |
| v0.3.22 | 2026-10-19 | RuoJi6 | Mock demo auto-deploy to Vercel, update proxy, scheduled task fix |
| v0.3.21 | 2026-10-15 | RuoJi6 | Judge retry on failure, strict LLM request rate limit |
| v0.3.20 | 2026-10-13 | RuoJi6 | Script snapshot false positive fixes, default model review |
| v0.3.19 | 2026-10-12 | RuoJi6 | Command misjudgment fixes, script review policy config |
| v0.3.18 | 2026-10-12 | RuoJi6 | Script review snapshots, approval side Q&A, approval search |
| v0.3.17 | 2026-10-10 | RuoJi6 | Calendar scheduled tasks |
| v0.3.16 | 2026-10-09 | RuoJi6 | Optional HTTP Basic Auth; duplicate finding merge into vuln folders |
| v0.3.15Last original release | 2026-10-07 | Autumn-27 | Delete-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 bypass | 2026-09-24 | Autumn-27 | Task list vuln column; slimmer graph_overview. Has the fail-open auth bug exploited by ARTXploit (commit b55ceb1) |
| v0.3.13 | 2026-09-19 | Autumn-27 | Global asset blocklist (default .gov/.edu), per-task allow/block, tighter judge output to avoid fail-open |
| v0.3.12 | 2026-09-17 | Autumn-27 | Exploration broadcast board; soft/hard intent delete. v0.3.12 prebuilt binaries mirrored at bear20252026/ARTEX-release |
| v0.3.11 | 2026-09-15 | Autumn-27 | Approval source jump; slimmer judge input; experimental noa compaction (norma v0.4.0) |
| v0.3.10 | 2026-09-13 | Autumn-27 | DeepSeek web search backend; worker cross-trace search; add_hint triggers; base for the enwjx/artex-ymh offensive branch |
| v0.3.9 | 2026-09-11 | Autumn-27 | Multi-session main agent; /btw side questions; spawn_task source_task_ids; empty-turn fix |
| v0.3.8 | 2026-09-09 | Autumn-27 | Five configurable retry layers; session header; in-place wrap-up on timeout; planner stall guard |
| v0.3.7 | 2026-08-31 | Autumn-27 | Max 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.6 | 2026-08-27 | Autumn-27 | LLM test checks real reply; paginated list_facts; tool call stats |
| v0.3.5 | 2026-08-25 | Autumn-27 | Streaming toggle per LLM profile; OpenAI Responses API format; raw LLM wire recording |
| v0.3.4 | 2026-08-24 | Autumn-27 | Batch task categories; main agent add_intent on finished tasks |
| v0.3.3 | 2026-08-23 | Autumn-27 | Worker pause/cancel fences, paused intent state, FIFO admission, worker wall clock 600 s -> 1200 s |
| v0.3.2 | 2026-08-20 | Autumn-27 | Task 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.
