Releases: ztxtech/aion
Release list
v0.7.3
v0.7.3 — Subagents now load skills on demand
Subagents (requirements-analyst, information-collector, coder, ts-critic, c-critic) now have direct access to the skill tool. Instead of the main agent pre-loading all skill content and stuffing it into dispatch prompts, subagents call skill(name="...") themselves on demand. This keeps the main agent's context clean and lets each subagent load exactly what it needs.
Changes
- feat(agents): Grant
skilltool to all 5 subagents - feat(hooks): Update
system-transformguidance to instruct main agent to not pre-load skills - feat(prompts): Add
skillto Available AION Tools table in all agent prompts - docs(readme): Remove v0.7.2 news entry (patch release, not a news item)
v0.7.2
v0.7.2 — Skills install + G1 hard-throw on phase=done
Highlights
aion-ts initships the 17 AION skills. Previously the installer copied the plugin bundle, theme, andaion.jsonc, but not the.opencode/skills/directory. The system prompt still told the LLM thatbrain-storm,time-series,critic-loop,plan, etc. were available, so the LLM would callSkill "brain-storm", get "no such skill" back, and silently fall back to doing the brainstorm work inside its own narrative. The installer now copies the full skills dir, the release tarball bundles it, anddev-install.shpushes it to~/.local/lib/aion/skills/.- G1 hard-throws on
phase=done. When c-critic returnsapprove-stop, phase becomesdone(terminal, emptyLEGAL_EDGES). The previous G1 check was a soft warn, so the main agent could keep dispatching workers after closeout and the loop spun on orphan work. G1 now blocks anytask()dispatch fromdonewith a clear error message, forcing the agent to write the final summary and end the turn.
What changed (since v0.7.1)
fix(install): copy 17 AION skills into target .opencode/skills/(2e3dd54)fix(scheduling): G1 hard-throws on any dispatch in phase=done(a0d29f0)chore(release): bump to v0.7.2(30ff2c4)
Install
# Fresh install
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/master/scripts/install.sh | bash
aion-ts init <your-project-dir> --force# Upgrade an existing v0.7.x project — re-run init with --force to pick up the new skills
aion-ts init <your-project-dir> --forcev0.7.1
v0.7.1 — Team mode removed, TUI todo sync hardened
Highlights
- Team mode removed. The parallel multi-agent runtime (1 lead + up to 8 members, mailbox + tasks + tmux visualization) is gone. The plugin now ships one execution model: the serial-loop state machine —
requirements-analyst → information-collector → coder, each worker sandwiched betweents-criticpre- and post-reviews. Removes ~2.5k lines and 14 tools (tool count: 34 → 20). - TUI todo list auto-syncs. The previous sync was a two-step chain (
aion_todo_update→ next-turn reminder →todowrite) that the LLM could trivially skip. Now system-transform parsestodo-map.mdevery turn, compares with the lasttodowritetimestamp, and — whenever the on-disk map is ahead of the right panel — injects a mandatory sync reminder that includes the exacttodowriteJSON payload. The LLM copy-pastes it.
What changed
refactor(plugins): remove team mode — serial-only execution(392dd4c)fix(hooks): surface TUI todo drift with payload-bearing sync reminder(8e2eb05)chore(release): bump to v0.7.1(8ffdf00)
Install
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/master/scripts/install.sh | bash
aion-ts init <your-project-dir> --forceOr from the local tarball:
bash scripts/install.sh --local release/aion-plugin-0.7.1.tar.gzv0.6.0
v0.6.0 — Serial-Loop Scheduling + Critic Dispatch Fix
Minor release. Two architectural changes plus a critical bug fix.
What changed
1. Serial-loop scheduling model (replaces parallel fan-out).
The dispatch model is now an explicit state machine instead of the old
"aggressive parallel fan-out" pattern. The main chain is single-line:
requirements-analyst -> information-collector -> coder, with
ts-critic reviewing BEFORE and AFTER every worker, and c-critic
as the final gate.
- New module
src/scheduling/state-machine.tsholds the legal dispatch
edges, per-worker pre/post-review progress, a reportback parser, and a
Mermaid state diagram for system-prompt injection. - Three enforcement hooks in
tool.execute.before:- G1 — dispatch edge check. Flags any dispatch not on a legal
edge from the current phase. Worker first-dispatch also requires a
prior ts-critic pre-review. - G2 — main-agent work-guard. Soft-warns (trace + toast, no
throw) when the main agent edits project source or runs
code-modifying bash. Emergency self-fix exception preserved. - G3 — reportback parser. Extracts
next_calland
unresolved_issuesfrom worker free-text output. Stored in
governance state and re-injected on every subsequent round so the
main agent cannot drop them.
- G1 — dispatch edge check. Flags any dispatch not on a legal
- R5 escalation: if a pending
next_callis ignored for >= 2 rounds,
G1 upgrades from soft-warn to hard throw to force compliance. - Parallelism is now scoped to INSIDE a single worker (e.g. coder
runs 3 method families concurrently). Cross-worker fan-out is
explicitly disallowed.
2. aion_critic_dispatch was a no-op — fixed.
The aion_critic_dispatch tool was advertised as "the ONLY sanctioned
way to call a critic" but its execute() only wrote a trace event and
returned a JSON instruction payload. It never actually dispatched the
critic subagent. The main agent would call it, see a success return,
write "dispatched DISP-xxx, in flight" to progress.md, and then idle —
thinking the critic was running when nothing was happening.
Observed in trace during demo run 2026-06-15:
17:53:13 critic.review (aion_critic_dispatch called)
17:53:26-33 main agent writes progress + decisions
17:53:39 session.idle (NO reportback.received, NO critic.verdict)
Fix:
- Tool description now explicitly says "DOES NOT dispatch the critic".
- Return payload includes
status=PAYLOAD_READY_NOT_DISPATCHEDand a
next_action_requiredfield telling the main agent to call
task(subagent_type=<critic>, ...)in the SAME turn. - All phase hints (
session-idle.ts,system-transform.ts,
aion/default.md) updated with the explicit two-step flow:aion_critic_dispatch(...)to prepare payload.task(subagent_type=<critic>, ...)to ACTUALLY RUN it.
3. i18n cleanup — removed all Chinese from source and tests.
Per AGENTS.md requirement: all prompts and source code must be in
English. LLMs can read Chinese user input fine — hardcoded Chinese
keywords in the source are unnecessary and violate the constraint.
Removed Chinese keywords from intent.ts, chat-message.ts, and the
matching test files. 49 keyword strings / test cases replaced with
English equivalents that cover the same semantic space.
4. Tooling.
scripts/dev-install.sh: removed hardcoded user-specific path from
the printed instructions; addedAION_PROJECT_DIRenv var support
for a ready-to-paste workflow command..gitignore: addedAGENTS.md(local personal-preference doc).
Upgrade
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --forceFull diff
src/scheduling/state-machine.ts— new state machine modulesrc/hooks/tool-guard.ts— G1/G2/G3 hookssrc/hooks/system-transform.ts— Mermaid injection, R4/R5 signalssrc/hooks/session-idle.ts— phase hints rewritten for serial modelsrc/tools/critic.ts— fix aion_critic_dispatch no-opsrc/prompts/agent-prompts/aion/default.md— serial rulessrc/prompts/governance.ts— Serial-Loop Scheduling section, next_call mandatorysrc/prompts/rules.ts— top-priority command 5/6 rewrittensrc/create-managers.ts— pendingNextCall + escalation statesrc/hooks/intent.ts,src/hooks/chat-message.ts— Chinese removalscripts/dev-install.sh— generalized path.gitignore— AGENTS.mdpackage.json— version 0.5.3 -> 0.6.0- Tests: +39 new (scheduling + G1/G2/G3 hook integration)
v0.5.3
v0.5.3 — Quieter TUI, faster dev iteration
Patch release. Two small quality-of-life fixes.
What changed
1. Memory files no longer trigger a "dedup" warning.
The tool.execute.before dedup guard fires when the same tool is called with the same arguments within a 3-second window. It is a soft hint — the call is allowed through, the trace event is recorded, and the LLM is supposed to notice and move on.
In practice two things made it louder than it should have been:
.opencode/memory/*.mdare persistent state stores that the runtime is designed to re-read.negative.mdgets re-checked byinformation-collectoron every evidence-collection round,progress.mdandtodo-map.mdget re-read by every sub-agent. None of those re-reads is a no-op loop.- The soft hint was logged at
warn()level. OpenCode TUI surfacesconsole.warnas a purple warning toast, which made the line look like a hard error to humans and to the LLM.
Fix:
- Skip dedup entirely for reads of
.opencode/memory/*.md. Re-reads of state files are not a no-op signal. - Drop the soft-hint log level from
warn()toinfo(). The message is a hint, not an error. The trace event (dedup.rejected) is unchanged, so postmortem tooling still has the signal.
2. scripts/dev-install.sh for local dev iteration.
scripts/install.sh downloads the released tarball and installs it under ~/.local/. That is right for end users but inconvenient for plugin development: editing src/ and re-running aion-ts init <dir> --force does not pick up the local build, because aion-init.js resolves its bundle from ~/.local/lib/aion/aion.js (see bin/aion-init.js:194), not from the source repo.
The new script is the dev counterpart:
# in the source repo, after editing src/
bash scripts/dev-install.sh
# then redeploy the bundle into the test project
aion-ts init /path/to/project --forceWhat it does:
- Runs
bun run build:singlefile(skippable with--skip-build) - Pushes the bundle, the theme, and
aion-init.jsto~/.local/lib/aion/ aion-ts init <dir> --forcethen copies the freshly built bundle into<dir>/.opencode/plugins/
Override the target dir with --lib-dir <path>.
Upgrade
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --forceFull diff
src/hooks/tool-guard.ts:165— memory-file dedup exemption + log-level downgradetest/unit/hooks.test.mjs:286— newskips dedup for memory file readscasescripts/dev-install.sh— new dev push scriptpackage.json— version bump to 0.5.3README.md/README.zh-CN.md— News entry
v0.5.2
v0.5.2 — Contract-Driven Leakage Gate
What changed
The leakage gate used to hard-code a path-based denylist (/(test|val|holdout|hidden|private)/ for tabular files) that over-blocked legitimate reads. In particular, data/train.csv and data/test.csv were blocked even when the task was "predict test.csv sales" — exactly the file the agent needs to read.
The source of truth is now the Task Contract that requirements-analyst writes. The hook and the explicit aion_leakage_check tool enforce it.
Four layers, one source of truth
Layer 1 — hard-coded (always on):
- Credentials / secret paths:
.env,.pem,.key,/secrets/ - AWS / private-key / password-assignment content patterns
- Internal AION agent prompts (
.opencode/agents/*.md) — anti-extraction
Layer 2 — contract-driven (new in v0.5.2):
Read from aion.jsonc → leakage.dataBoundaries, populated by requirements-analyst:
forbiddenReads: glob list; matching path is blockedallowedReads: when NON-EMPTY, allowlist mode (anything not matching is blocked)internetAccess: whenfalse, network calls are blockedruntimeHosts: optional HTTPS host allowlistlabelColumns: columns that MUST NOT appear in feature files
Layer 3 — hook-level (separate): project-root boundary, bash command patterns (rm -rf, git push, etc.).
Layer 4 — ts-critic submission review (new in v0.5.2): three mandatory checks before allow-stop:
- Submission column-name match against contract section 4
- Training-pipeline import-graph audit (every
pd.read_csv/open/load_datasetchecked againstforbidden_reads) - Holdout-set access audit (classify every file the pipeline opens;
hidden/ground_truth/leaderboard= violation)
Prompt changes
- requirements-analyst: Task Contract schema now has 8 sections (added Data Boundaries with allowedReads / forbiddenReads / internetAccess / runtimeHosts / labelColumns / source).
- ts-critic: new Submission Leakage Review HARD GATE section with the 3 mandatory checks.
Migration
Existing user aion.jsonc files keep loading — blockHiddenSetAccess / blockPrivateData flags are now no-ops kept for compatibility. To re-enable hidden-set blocking, set:
{
"leakage": {
"dataBoundaries": {
"forbiddenReads": ["data/holdout/**", "**/private_labels.*"]
}
}
}Tests
- 584/584 tests pass, typecheck clean.
- 37 leakage tests (contract-driven + credentials + project-root).
- 5 coverage tests updated to the new model.
Files
aion-plugin-0.5.2.tar.gz— 280 KB- Source:
masterbranch at commit773e91b
Upgrade
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/master/scripts/install.sh | bash -s -- --force --version 0.5.2v0.5.1
v0.5.1 — Hard Role Boundaries + Reception Contracts
Highlights
This release codifies role discipline across the multi-agent system. The main agent (aion) is now explicitly an orchestrator, not a worker. Leaf workers (coder / information-collector / requirements-analyst) now have Reception Contracts so dispatched tasks land in a predictable shape.
What's New
aion (main agent) — Hard Role Boundaries (HARD GATE)
The main agent prompt gains a new section that explicitly forbids:
- Direct file editing (no
edit/write/sed/awkfor code modification) - Direct debugging (no reading stack traces or code paths to "narrow down" a bug)
- Direct experiment building (no Python/TS/shell scripts)
- Direct evidence collection (no
aion_hf_*, no web search/fetch) - Direct requirement extraction (no contract writing)
A "temptation checklist" runs before every tool call: is this dispatch, integration, governance, or work? If work, dispatch via task. A 5-part dispatch prompt minimal contract (goal, symptom, constraints, reception contract, skill binding) is now mandatory.
A single narrowly-scoped emergency self-fix exception exists (main agent broken → cannot dispatch; fix < 10 lines; must immediately dispatch follow-up verification). Any agent taking this exception twice in one run is a structural signal to file a follow-up to add the missing capability.
coder — Reception Contract (Diagnose → Patch → Verify → Report)
Coder's intake is now codified as a 4-phase protocol:
- Diagnose — read symptom verbatim, locate source of truth on disk, cap at 5 files, write 3-bullet diagnosis
- Patch — minimum fix, no refactoring; bail (re-dispatch as build) if >3 files / >50 lines / new public API
- Verify — full test suite + build + typecheck
- Report — diff summary, root cause, verification, risk notes, follow-up, memory append
information-collector & requirements-analyst — Reception Contracts
IC declares its axes-decomposition (≥5 axes, primary+secondary sources, confidence tiers) and reformulation trail. RA declares its mandatory 7-step ordering (Hardware Probe → data probe → goal extraction → constraints → acceptance → risk → Compute Budget Reality Check verdict).
Tests
- 19 new role-boundary tests in
test/unit/role-boundaries.test.mjscovering: forbidden actions in main agent, allowed actions in main agent, leaf-worker reception contracts, no-Chinese invariant, subagent structure. - 574/574 tests pass, typecheck clean.
Upgrade
# In your project:
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --force --version 0.5.1Files
aion-plugin-0.5.1.tar.gz— 276 KB- Source:
devbranch at commit449f50b
v0.5.0
AION v0.5.0 — Hugging Face Datasets Integration + Ablation/SHAP Hard Gates + Session-Start Fix
New tools (4, zero-dependency, public HF Hub REST API)
- `aion_hf_search` — text search with optional modality / task_categories filter; 24h cache under `.opencode/hf-cache/`
- `aion_hf_info` — full dataset card + siblings + configNames + splits
- `aion_hf_ingest` — writes `data/aion-dataset-manifest.json` + a per-dataset Python loader.py
- `aion_hf_suggest` — tiered search (goal + keywords) with ranking score
CLI
- `aion-ts datasets search|info|ingest|suggest` subcommand mirrors the tools
- Flags: `--limit`, `--modality`, `--keywords`, `--goal`, `--top-k`, `--split`, `--workspace`, `--no-cache`
Prompt hardening (rules.ts)
- Ablation is the SOLE arbiter of "best method" HARD GATE — any "X is best" claim MUST be backed by a config-level ablation matrix (c-critic rejects anecdotal/single-seed/leaderboard-only claims). Software-engineering analogue of the controlled-variable method.
- Beyond p-value: complementary analysis battery HARD GATE — after significance + bootstrap CI, MUST also run SHAP (or equivalent feature attribution), residual structure diagnosis, drift analysis, and sensitivity analysis. Skipping any is a ts-critic blocker.
Prompt additions
- information-collector: Review/Survey suffix, Benchmark/Leaderboard suffix, Repository-pattern suffix, Failure-mode prefix, Workshop pivot, HuggingFace full protocol, mandatory pre-quit reformulation checklist.
- requirements-analyst: Hardware Probe step + Compute Budget Reality Check section in Task Contract. Probes CPU/RAM/GPU/disk/OS limits/Python stack/HF Hub reachability BEFORE the contract is emitted so unrunnable methods are flagged at intake, not 30 minutes into training.
Bug fix: session-start question was silently skipped
- Symptom (trace evidence): `language = en (source: config-default)` and `interactive mode = autonomous (source: config-default)` fired on the very first event, meaning the user was NEVER asked about language or interactive mode.
- Root cause: `src/hooks/system-transform.ts` resolved the language + interactive-mode state to config-default on round 1 IMMEDIATELY, then injected an "AUTO-RESOLVED" message telling the LLM "don't ask the user, mode is already resolved." The LLM obeyed and never called the `question` tool.
- Fix: round 1 with unset state now injects a MANDATORY `ASK THE USER NOW` directive and does NOT resolve. Round > 1 still unset = LLM skipped the question, then we fall back to config-default. This makes the session-start question actually fire on a well-behaved LLM while keeping config as a true fallback, not the primary path.
Other bug fixes (uncovered by 37 new unit tests)
- `inferModality`: now strips `modality:` / `task_categories:` namespace prefix from HF tags so `modality:time-series` is recognized.
- `encodeDatasetId`: `encodeURIComponent` on owner/name was percent-encoding the slash; HF API treats `/` as a path separator. Now per-segment encoding.
- `hfFetch`: 4xx errors were being retried like 5xx because the catch-all block had no HTTP-vs-network distinction. Added `HFHttpError` class; only network-layer failures (abort, ECONNRESET, TypeError) are retried.
- `ctx.directory` + `args.workspace_root` fallbacks for direct `execute()` calls (zod defaults not applied at the tool layer).
Docs
- README.md / README.zh-CN.md: News entry, Tools-34 badge, new "Tools" section with ablation/SHAP hard-gate callouts, `aion-ts datasets` CLI reference.
- docs/index.html: Quick Start refreshed to one-command install (no more `git clone`); added component cards for 34 Tools, Hugging Face Integration, Ablation & Statistical Rigor.
Tests
- 37 new unit tests in `test/unit/hf-datasets.test.mjs`
- 555/555 tests pass
- typecheck clean
Install
```bash
Latest (resolves to v0.5.0 once GitHub API cache refreshes):
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --force
Pinned (recommended if your IP is rate-limited):
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --force --version 0.5.0
Local tarball (fully offline):
bash scripts/install.sh --local release/aion-plugin-0.5.0.tar.gz
```
Upgrade from v0.4.0
No breaking changes. The new `hfDatasets` config block defaults to enabled; add it explicitly to `.opencode/aion.jsonc` only if you want to tune cache TTL or disable the tools.
AION Plugin v0.4.0
AION Plugin v0.4.0
Mandatory Statistical Analysis
All statistical analysis is now mandatory, not optional:
- Multi-seed (≥3 seeds) with variance reporting — no single-seed conclusions accepted
- Significance tests (paired t-test or Wilcoxon signed-rank) with p-value and effect size
- Confidence intervals (bootstrap, ≥1000 resamples) for the main metric
- SHAP / feature attribution, residual diagnosis, failure cases, AND statistical tests — all required, not substitutable
Multi-Hypothesis Statistical Comparison
When ≥2 method routes survive to evaluation, they MUST be compared as a battery:
- Same eval split, same seeds
- Pairwise significance tests with multiple-comparison correction (Holm-Bonferroni or Benjamini-Hochberg)
- Aggregated result table with mean ± CI per method
Pareto-Optimal Delivery
When methods are non-dominated (e.g., accuracy vs. latency vs. cost), ALL non-dominated methods must be delivered — not just one "recommended". Includes a Pareto front plot and per-method trade-off cards.
Language Selection
Session start now asks a second question about language:
| Option | Behavior |
|---|---|
| English | English everywhere (default) |
| Chinese reasoning + English delivery | Chinese interaction/reasoning, English code/reports |
| Chinese delivery | Chinese throughout |
| Bilingual | Both Chinese and English delivery |
TUI notifications (I AM AION toasts) always stay in English regardless of language mode.
Coder Two-Phase Development
| Phase | Style | Requirements |
|---|---|---|
| Phase 1: Rapid Prototyping | Quick-and-dirty, speed-first | No unit tests, no SHAP, scratch/ OK |
| Phase 2: Engineering Hardening | Production quality | Clean rewrite, comments, unit tests, docs, ztxexp boundaries, SHAP, statistical analysis |
The main agent or ts-critic triggers the phase transition. The coder does not decide alone.
ts-critic allow-stop checklist (expanded)
5 new mandatory items:
7. Multi-seed (≥3) variance reported
8. Significance test with p-value and effect size
9. Bootstrap CI reported
10. Pairwise significance battery (if ≥2 routes survived)
11. Pareto delivery (if methods are non-dominated)
Install / Upgrade
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -s -- --forceThen in your project:
aion-ts init . --forceAION Plugin v0.3.0
AION Plugin v0.3.0
Trace Bug Fixes (from session trace audit)
- Removed duplicate traces: memory_sync, critic_dispatch, and critic_verdict were traced twice — once correctly inside the tool, once incorrectly in the after-hook (showing
artifact=unknown). The noisy duplicates are gone. - Fixed over-aggressive leakage guard:
rm -rfis no longer blocked globally. Only catastrophic paths (/,~,$HOME) trigger the block. Normal commands likerm -rf .venvnow work without false positives. - Real timestamps on all memory modes:
replace-sectionandreplacemodes now inject accurate timestamps vianowIso(), preventing the LLM from fabricating stale annotations.
Interactive Mode Redesigned (4 granularity levels)
Session start now presents 4 options:
| Option | Behavior |
|---|---|
| Fully autonomous | Zero user prompts. Loop runs end-to-end. |
| Checkpoint per round | Pauses after each c-critic verdict to ask continue/stop. |
| Always interactive | Pauses at every dispatch, critic verdict, plan switch, and phase transition. |
| Custom (ask me when) | User picks exact triggers via a follow-up question: c-critic-verdict, dispatch, plan-switch, phase-transition, critic-reject. |
New config fields: interactiveMode.granularity, interactiveMode.customTriggers.
Visual Personality Enhancement
Inspired by Claude Code's animated crab — AION now has more presence in the TUI:
- 3 new event types: dispatch toasts (when subagents are sent out), critic toasts (when critics return verdicts), and easter-egg toasts (random delight)
- Rarity-driven colors: common=blue, rare=green with sparkle, legendary=amber with sparkle and longer duration
- 19 new quips across all slots (entrance 7→10, heartbeat 6→11, +14 in new slots)
- More frequent heartbeats: min interval 90s→60s, max 240s→180s, session cap 8→12
- Legendary easter eggs (5% drop rate) include: "This toast has a 5% drop rate. You just got lucky. The loop will remember this (it won't — it can't)."
Team Mode Aggressive Defaults
| Parameter | Old | New |
|---|---|---|
| maxParallelMembers | 4 | 6 |
| maxMessagesPerRun | 10,000 | 20,000 |
| maxWallClockMinutes | 120 (2h) | 240 (4h) |
| maxMemberTurns | 500 | 800 |
| messagePayloadMaxBytes | 32KB | 64KB |
| recipientUnreadMaxBytes | 256KB | 512KB |
| mailboxPollIntervalMs | 3,000ms | 2,000ms |
Install / Upgrade
curl -fsSL https://raw.githubusercontent.com/ztxtech/aion/dev/scripts/install.sh | bash -- --forceThen in your project:
aion-ts init . --forceSee README for full details.