Added
Portable skill catalog — Aria now actually loads external SKILL.md workflows
ARIA_SKILLS_PATH(or a siblingaria-skills/skillscheckout) is discovered at
startup; each skill registers asplugin:skilland its instructions are injected
only when a task matches- Every skill tree is verified against
.claude-plugin/skills.lock.json(SHA-256)
before anything runs. A skill with no lock entry can never activate automatically —
only by explicit$nameinvocation — and one whose contents no longer match its
lock is refused outright /skills doctor— catalog integrity and declared permissions/skills trace— why each skill was selected or blocked, with match score/skillsnow lists external catalog skills alongside built-in commands- A skill can declare which specialist agents it orchestrates (
agentsin
skill-policy.json); the active skill's agent list is surfaced in the prompt
New commands
/export-pdf <report.md>— renders a structured report to a designed PDF
(--theme=institutional|bloomberg,--sections=,--exclude=)/artifacts— manage generated files:open,reveal,path,copy-path,
stats,prune- Structured Excel export and bilingual Markdown→PDF deliverables
Changed
/portfolio analyze now uses your real positions, not an imagined equal-weight basket
- Previously every risk number — portfolio volatility, diversification ratio, and the
HEALTHY/NEEDS_ATTENTION/HIGH_RISK verdict — was computed as if every holding were
the same size, regardless of whatportfolio_ledgeractually held. On a
90%-concentrated book the difference is 45.4% annualized vol versus 27.4%: the gap
between "high risk" and "medium risk" on the tool's own thresholds, and it always
erred toward understating a concentrated position - With no arguments it now reads your ledger (cost-basis weighted) instead of falling
through to the static watchlist; the output states which basis it used, so an
equal-weight run can't be mistaken for real exposure
Football prediction switched to the Elo + Dixon-Coles engine
FootballAgentwas calling a separate, simpler model: independent Poisson over a
fixed hand-maintained attack/defense table with a flat 1.25× home-advantage
constant. It now uses the Elo + Dixon-Coles predictor (negative-binomial tail for
lopsided fixtures, dynamic Elo/DC mixing, recency form, head-to-head,
self-calibration) that already shipped in the quant engine but was never wired up- Expect different numbers: on Germany vs Curaçao the two models' home-win
probabilities differ by 13.1 percentage points - New
neutral_venueargument (defaults toFalse, preserving league semantics)
Agent team orchestration is no longer hardcoded to finance vocabulary
⚠️ Behavior change: the 9 real-estate agents (cashflow_verify,
contract_rules,energy_anomaly,fulfillment_risk, …) no longer emit
BUY/HOLD/SELL/STRONG_SELL. They now useGOOD/WATCH/CONCERN/SEVERE.
Each of those agents had been reusing the stock-trading words to mean nine
unrelated things ("cash flow is genuine", "contract terms are clean", "low
fulfillment risk"), which would have produced a meaningless numeric consensus the
moment they were run as a team. If you parse agent output programmatically,
update your mapping. Financial agents are unchanged — verified byte-for-byte
against the previous logic with a 20,000-case comparison
Fixed
pip install aria-codeon Python 3.14 failed with an error naming neither
aria-code nor its cause.requires-pythonwas>=3.10with no upper bound,
so pip would start the install, resolve the core dependencypandas_ta→
numba, and then fail on a numba source build (Cannot install on Python version 3.14.6; only versions >=3.10,<3.14 are supported). The bound is now
>=3.10,<3.14, so pip refuses up front with a clear "requires a different
Python" message. Python 3.10–3.13 are unaffected — verified 3.13 installs and
aria-code --versionruns. Will be raised once numba ships 3.14 wheels- Dark-theme input text rendered gray instead of white
- Core file tools (
read_file, etc.) stayed unavailable when a restrictive skill
policy was active weasyprintmangled emoji and CJK glyphs in exported PDFs- npm
postinstalltreated a non-zero exit code asuvinstall failure even when the
binary had installed correctly — now checks the filesystem - npm
postinstall's critical notices (PATH reminder, terminal reopen) were being
swallowed instead of reaching the terminal
Internal
send_message's ~580-line inline agent loop deleted; CLI, SDK and self-host backend
now all run the sameruntime.run_turnpath (validated with real turns —
plain chat, forced-inline parity, native tool-calling with multi-round recovery —
before removal)