Repository navigation
[0.9.0] — 2026-11-06
Added
-
RSIPlatform+PlatformConfig/PlatformReport: one bounded cycle that hands
compute allocation, the durable loop, trusted promotion, capability admission and
continual experience to each other.completeis false when a configured layer
does not produce a decision; a layer skipped by an upstream decision (for example
the foundry after a rejected promotion) is named inskippedanddetail.
Post-loop decisions are cached perrun_id, so re-running a terminal run returns
them instead of re-admitting or re-learning; a terminal run without a cache is
refused. A cycle that validates experience on its own rows marks
self_validated=True.Changed
LoopGenerationnow carries the observation's evidence, so the platform (and a
caller's own report) can see the compute action/option/features that produced a
generation without re-reading the event payload. -
CapabilityArchive: a quality-diversity archive, artifact graph and semantic
dedup kept in sync. A near-duplicate never occupies a QD cell or the graph; an
elite replacement removes the evicted graph node and fingerprint;addrolls
the QD cell back to the previous elite if the graph rejects the artifact;
prepopulated graphs seed the dedup fingerprints. Retrieval goes through the
graph and selection through the QD archive.Changed
ArtifactGraph.remove()removes an artifact and decrements document frequency
once per distinct token. Descendants keep their parent ids and treat the
removed node as external. -
CapabilityScout: packages failedTaskCandidates asToolSynthesisRequest
examples, runs the existingToolSynthesizer, and hands the selected candidate
to the caller'sCapabilityRequestbuilder beforeCapabilityFoundry.admit.
The report makesno-candidateandno-requestexplicit; only an admitted tool
reachespromoted. -
BudgetedSearch: runsSearchFabricat increasing UCT budgets and stops when
the value gain per expansion falls below a bar, using the existing
MarginalGainStopor a patience rule. The report keeps every round, the gain
it bought and why the search stopped, so compute spend is auditable rather than
hidden in one fixed budget. -
PromotionLedger: only an acceptedpromote()decision becomes a release. It
builds anArtifactManifestcarrying the evidence/decision hashes and reasons,
HMAC-signs it, verifies the signature, and writes a lineage node with the parent
artifacts, run id, manifest hash and key id. Refused promotions are not signed. -
CounterfactualExperience: turnsReplayLab.shapleystep credit into per-step
ExperienceRecordrewards and ingests it intoExperienceEngine. Credits below
min_creditare dropped and an empty reward map is refused, so a trace with no
attributable gain cannot silently become zero-information replay. -
PreferenceReplay: ranks storedExperienceRecords by a fitted
PreferenceModeland ingests the preferred slice intoExperienceEngine
without duplicating records. The preference model becomes the replay-selection
policy, so human pairwise feedback affects what the meta-policy learns from. -
A current
main-branch capability map covering the evolution loop, verification
and statistics, trusted promotion, durable operations, task/capability
discovery, archives and continual experience, with a staged path for evolving
Skills and Workflows. -
CapabilityLoop: composesTaskPipeline,CapabilityScoutand
CapabilityArchiveso production traces become a validated, admitted and
archived capability in one call. The report records the pipeline verdict, scout
outcome and archive result;admittedis true only when the archive added the
artifact (#677). -
BudgetedStep: composesSearchFabricandBudgetedSearchinto a durable
loop step that scales search budgets with the controller'sbudget_scale,
stops on marginal gain, and returns aLoopObservationwith round-by-round
evidence, risk and an artifact id (#678). -
curriculum_meta_rungains opt-in verified seeding:min_exam(via
verified_rules) excludes unexamined, flagged or audit-biased rules when set,
andoracle+audit_storeaudit a sampled slice of the
validation pairs and persist the verdict withaudited_n,oracle_gainand
gain_biasin the report. The generated-problem map is pruned to the live
frontier pool, and default run_ids get a random suffix so same-second
adoptions no longer collide (#679). -
release_evidenceandrelease_candidatecompose trust evidence, promotion
and thePromotionLedgerinto one fail-closed release seam. An accepted
promotion is signed and written to lineage; a reject or defer returns a report
without touching the ledger. An accepted promotion requires an artifact hash (artifact_hash=or
content_hash=); missing signing material or a missing/mismatched artifact
hash is refused rather than silently signed (#680). -
PlatformCampaign: runs severalRSIPlatformcycles under the existing
RSIControllerstop policy (target, cost, patience, cycle count), cloning the
platform with a fresh seed and run id per cycle while sharing the run store,
compute, foundry and experience. An exception or incomplete cycle is reported
as an error and stops the campaign, andPlatformCampaignReport.best_cycle
names the highest-reward cycle (#681). -
TenantPlatformwrapsRSIPlatform.run_cycleso each cycle routed through it
is a reserved, authorized and audited tenant action. A cycle reserves quota at
the stated tokens/cost (which enforcesrun:writeand the workspace limits)
and commits actual usage on success. An overrun or a recorded generation error
is charged the reserved amount before the refusal, so repeated overruns still
consume quota; only a platform call that produced no generation is released
without charge.TenantCycleReportexposes the platform report, reservation,
usage and a JSON-safe summary (#682). -
AdaptiveExperience: one cross-cycle composition that ingests counterfactual
credit throughCounterfactualExperience, selects validation anchors from a
fittedPreferenceReplay(or feature recall, recent history, or self-validation
on the first cycle), and delegates the guarded update toExperienceEngine.
Ingestion deduplicates byrun_id, and missing validation or bridge features
fail closed (#683). -
agentdescent.governed_harnesscomposes the capability gate, proof runner,
human approval store, canary/rollback plan and promotion rules into one governed
path for harness and code self-modifications. A denied gate, failed proof,
pending or rejected approval never reaches promotion, and approval keys are
content-bound so an old approval cannot be replayed for a different change. The
returned report is JSON-safe for manifests and decision logs (#684). -
CampaignOps+CampaignOpsReport: publish a sequence of finished
LoopReports into the control room in one call, recording each into the
console, lineage, telemetry and QD and returning the campaign metrics, alerts
and snapshot. Unknown statuses, duplicate run ids, malformed costs and invalid
thresholds fail closed before anything is recorded; fractional per-generation
costs are summed per loop and rounded up to integer calls (#685). -
meta_campaign_runturns continuous meta-learning into a bounded campaign:
RSIControllerstop conditions wrap repeatedcontinuous_meta_runsessions
that share one durableConsolidationStore, each in its own fresh ledger repo,
so every session seeds from the adopted rule the last one archived. A failed
session is reported and stops the campaign instead of being promoted
(#686). -
agentdescent releaseand the MCPreleasetool: one evidence-gated release
seam that builds trusted evidence from paired held-out scores, runs the
fail-closed promotion decision, and only on an accepted promotion signs an
ArtifactManifestand writes its lineage node. Signing material comes from an
environment variable or file (never argv); reject/defer leaves the lineage
untouched; the JSON result carriesschema_version: 1. Use--lineageto
persist and extend the receipt graph and--outto write the full report. -
Product surfaces for the four P1 capabilities, each with a CLI verb and an MCP
tool:platformruns a durable five-layer campaign from a JSON spec with a
runnable--demo;capabilityturns failure traces into an admitted, archived
capability;opspublishes terminal runs to the console/lineage/telemetry/
metrics with alerts; andexperiencereports, ingests, recalls, updates and
preference-replays an ExperienceStore. All returns carryschema_version: 1,
invalid input fails closed with a JSON{"ok": false, "error": ...}under
--json, and each command has a docs page and an offline demo or sample. -
agentdescent governed-harnessand the MCPgoverned_harnesstool: one
spec-driven surface for the existing safety-gate -> proof -> approval ->
canary/rollback -> promotion chain.init --demois runnable offline;plan
validates refs and scores without running the gates;runreturns the full
GovernedHarnessReport. A failed proof or pending/rejected approval never
reaches promotion; a conformal/sequential reject is never waived; MCP refs and
writes use the operator's surface allowlists. JSON results carry
schema_version: 1. Directgovern_harness_changecallers also get the
matching fix: optional conformalinsufficient/ sequentialcontinue
evidence is ignored when the rules do not require those tests, while a
conformal/sequential reject still fails the promotion. -
agentdescent meta-campaignand the MCPmeta_campaigntool: repeated
continuous_meta_runsessions over oneConsolidationStore, each in a fresh
ledger repo, withRSIControllertarget/cost/patience/session stops.init --demois runnable offline fromagentdescent.meta_demo;planresolves refs
and configs without calling builders or creating the archive;runreturns the
per-session verdicts, best session and archive count. A rejected rule is a
normal measured session; an errored session stops the campaign with
complete=false. MCP refs and writes use the operator's surface allowlists.
JSON results carryschema_version: 1. -
agentdescent algorithms runandagentdescent inittake--rounds N/
--workers N(each >= 1), written into the spec'sevolveblock, so a cheap
trial of a named algorithm (--rounds 1 --workers 1) needs no hand-edited JSON.
Without the flags the plainalgorithms runoutput names that quick-trial path
when the default plan is large, and the host skill and/algorithmscommands
mention it (#707). -
evolve/async_evolvescore the seed artifact once on the held-out set
before round 0 and record it asinitial_rewardonEvolutionResult,
result.json, and run-storestatus. Foregroundevolve/demoprint
held-out reward: <initial> -> <final>;showandstatus --json/ MCP
carry the field. Seed scoring never aborts the run (nullon failure).
plan's estimate addsseed_score_calls(#708). -
tools.module_audit, a read-only reachability audit for the package: it
classifies every module ascli/mcp,exported-onlyorisolated(following
intra-package imports andagentdescent.module:attributestring refs), reports
module/LOC totals, the top-level__all__length and the CLI/MCP surface
counts, and emits JSON for scripting. It changes nothing by default;
--fail-on-isolatedis an opt-in local check. This makes "what is actually on
the product path" measurable before any quarantine or merge work. -
agentdescent experience cycleand the MCPexperience_cycletool: one
guarded adaptive-experience cycle that ingests newExperienceRecords, chooses
validation/anchors through the preference/recall/history cascade, and delegates
the update and forgetting guard toExperienceEngine. It makes the previously
isolatedAdaptiveExperiencereachable from the product surface; the result
carries the plan, ingested ids and update decision, withschema_version: 1.
The CLI exits 1 when the update is not accepted; MCPstorewrites use
AGENTDESCENT_SURFACE_WRITE_DIRS. -
docs/experimental.md, a status map for the modules that the CLI/MCP product
path does not exercise: research prototypes (society_runtime,openended,
scaling,calibrated_deferral/deferral) and the
algorithms/_TEMPLATE.pycontributor template. It also records the recently
productizedadaptive_experience(experience cycle, #711),budgeted_loop
(platform step.budgeted, #712) andtenant_platform/workspaces
(tenant run, #715). It explains that the
module audit'sisolatedcategory means "not statically referenced", not
"dead", and names the reversible cleanup order. -
agentdescent tenantand the MCPtenanttool: one platform cycle under a
WorkspaceRegistryprincipal/workspace/roles/quota. The spec nests the normal
platform spec plus tenancy fields and the tokens/cost to reserve;plan
validates refs and checksrun:writewithout creating the SQLite DB, andrun
reserves quota, executes the cycle and commits usage throughTenantPlatform.
A denied role or exhausted quota fails closed. This gives the previously
isolatedworkspaces/tenant_platformpair a product consumer. JSON results
carryschema_version: 1; MCP refs and writes use the operator allowlists. -
docs/main-path.md: the design contract for the three supported product paths
(evolve one artifact, governed release, continuous platform), the advanced
capability/tenancy/ops/meta/harness layers, and a canonical-vs-alias table for
the near-duplicate control, promotion, ops, experience and campaign modules. It
also states the consumer-first rule for new modules. Docs only; no runtime
behavior changes. -
agentdescent demo --algorithm NAMEruns the offline demo with a named
algorithm, so one can be watched end to end before wiring a model and data.
Only algorithms verified against the offline agent are accepted
(archive_selection); others are refused with thealgorithms runcommand
that runs them for real (#719). -
MCP
algorithm_spectool: the MCP form ofagentdescent algorithms run NAME PATH [cases]. It runs the same checks, writes the starter spec beside the
target (never inside a directory target), plans it, and returns the estimate
plus the absolutespecdict to pass tostart, so an MCP-only host no longer
hand-assembles a spec to try a named algorithm.algorithms runand the tool
share one code path (#723). -
PersistentWorkspaceRegistryand the tenant spec's optionalregistrypath:
the tested in-memoryWorkspaceRegistrycan now be saved as one atomically
replaced JSON snapshot, so quota usage, reservations and audit accumulate across
agentdescent tenantruns instead of being discarded with the process.
WorkspaceRegistrygainsto_dict/from_dictand small existence/getters
(workspace_exists,principal_exists,get_workspace,get_principal); the
tenant surface uses the persistent registry whenregistryis set and keeps the
in-memory behavior when it is not. The file is authoritative: when it already
has a workspace or principal,plan/runcompare the persisted quota and roles
with the spec and refuse a mismatch instead of silently using either value. The
file is a single-writer JSON slice, not a multi-process database. -
agentdescent release verifyand the MCPrelease_verifytool: recompute the
HMAC over a signed receipt's embedded manifest, check that its decision is an
acceptedpromotewith both hashes present, and optionally require the lineage
node to carry the same manifest hash. A well-formed but edited or wrongly keyed
receipt reportsvalid: falseand exits 1, so CI can consume the exit code
without trusting the JSON file. -
agentdescent governed-harness approvals|approve|reject: list pending,
approved or rejected human-approval requests, and record a decision with an
optional note. A missing store is an empty queue; an unknown key or an
already-decided request is an input error, so a rejection cannot be silently
flipped into an approval. The decide verbs stay CLI-only, so a host model cannot
approve the change it proposed for itself, and the nextrunof the same
governed-harness spec reads the decision. -
agentdescent ops publish --history FILEappends one JSONL record per publish
(tenant, workspace, each run's metrics and alerts) with an fsync, and
agentdescent ops historyaggregates those records across runs. Totals are
deduplicated by run id, so publishing the same database twice does not double
the counts; alerts are deduplicated by message. Malformed lines are skipped and
counted, tenant/workspace filters and a missing history are handled without
rewriting the file, and the last record is reported with an ISO-8601 timestamp. -
agentdescent platform statusand the MCPplatform_statustool: inspect a
campaign's SQLite run database after the process that wrote it has exited. With
no--run-id, list the most recent runs (newest first) with status, best
reward, generation count, accepted count and stop reason; with--run-id,
return that run's full loop report. The command only reads the database and
needs no compute, foundry or experience callbacks; a missing database or
unknown run is an input error. -
agentdescent tenant report --registry FILE: a read-only view of a persistent
workspace registry with per-workspace quota and accumulated usage, principals
and their roles, and the most recent audit events when--principalnames an
actor withaudit:read. A missing registry is an input error and is never
created; a viewer or operator getsaudit: nullwith a note. The command is
CLI-only so the local audit trail is not exposed to a host model. The report also makes staleactivereservations visible, which a hard kill can otherwise leave behind. -
agentdescent traces digest|showand the MCPtraces_digesttool: turn raw
agent trajectory JSONL/JSON into a layered, sourced evidence digest (per-run and
per-task counts, normalised failure signatures, and a token-bounded prompt
block), then drill back into the exact source events by signature id. Failure
messages are normalised so repeated causes group, secret-shaped values are
redacted, malformed input is an input error, and no model or network call is
made. -
agentdescent predictions predict|observe|report: an append-only prediction log
that pairs a proposal's expected delta, confidence and expected flipped tasks
with the later observation. Observations score hit/miss, delta error, task
overlap and Brier, and the report aggregates hit rate, calibration buckets and
falsified predictions. Predictions written before measurement stay pending until
observed; no model or network call is made.
Changed
-
The
docs/plugins.mdtitle and install line and the README host section now
name Grok Bot (as a scaffold that needs a tunnel, not a one-click install),
matchingplugin-quickstart.md(#606). -
An
--algorithm/algorithm:kind mismatch (ininit,plan,evolve,
campaigns and tournaments) now says which named algorithms do apply to that
kind (agentdescent algorithms list --kind <kind>), suggests targeting a skill
directory's singleSKILL.mdas--kind textwhen the algorithm runs on text,
and points to the default loop when nothing applies. -
A
platformspec may now setstep: {"budgeted": {...}}to use the existing
BudgetedStep(PRM/verifier search with marginal-gain stopping) as the durable
loop's step. The block takes aSearchFabricbuilder/instance, a state
callable,BudgetedStepConfigand optionalrisk/evidence_ofcallables;
planvalidates refs and config without calling the builders. This gives the
previously isolatedbudgeted_loopa product consumer without changing the
platform's compute or promotion behavior. -
Moved the research prototypes
society_runtime,openended,scaling,
calibrated_deferralanddeferralunderagentdescent/experimental/, so the
top-level package no longer presents them as part of the main engine. Their old
import paths remain compatibility shims (from agentdescent.experimental.x import *), so existing code and tests keep working. No CLI/MCP verb or
top-level export changed. -
agentdescent install/uninstallaccept common host aliases, case-insensitive
(claude,grok,grokbot,deepseek-harness,open-code, …), and a bare
install/uninstalllists every host with its state and the command to run
instead of argparse's "the following arguments are required" (exit 2;--json
returns the same data) (#721). -
docs/main-path.mdnow names the product verbs added around the three supported
paths: independent release-receipt verification,platform statusover the
durable run store,ops history, governed-harness approval decisions, and the
persistent tenant registry report. Docs only; no runtime behavior changes. -
Deep documentation refresh: one documentation map with the three supported paths
and the product surfaces, current main-path tables (tenant registry/report,
release verification, platform status, ops history, harness approvals), a module
map for the CLI/MCP surfaces, stale "on main" markers removed, the experimental
status updated for the persistent registry, and the navigation grouped into a
product-surfaces section. Docs only; no runtime behavior changes.
Fixed
-
OpsFabric.recordnow closes theops.recordspan aserrorfor a
failed run andcancelledfor a cancelled one, instead ofokfor every
terminal run, so telemetry error counts match the console (#630). -
The key-preflight tests no longer fail on a machine that exports
ARK_API_KEY
or another provider key: their fixture clears every name the preflight reads
(#632). -
openai_compatibleandanthropic_compatiblenow raiseProviderConfigError
on a deterministic refusal (HTTP 401/403/404, or a body naming
UnsupportedModel/model_not_found/invalid_api_key) and the engines stop
the run on the first one, instead of retrying it and spending a full round of
identical failing calls. The error names what to fix (themodelor base URL,
or whichapi_key_envto check); 429, 5xx and timeouts still retry as before.
diagnoseno longer recommendslog.txtfor a run that has none (#635). -
agentdescent mcp --transport streamable-httpnow checks that its host:port
can be bound before announcing the URL: a busy port prints one line naming the
port and suggesting another--port, and exits 4 instead of failing inside
uvicorn's logs with the same exit code 3 as a missing MCP SDK. The Grok Bot
HOST.mdscaffold anddocs/plugins.mdmention it (#636). -
The
initstarter-reflector warning test no longer fails on a machine that
exportsARK_API_KEYor another provider key: it clears every nameinit
reads before pinning the "OPENAI_API_KEY is not set" warning (#646). -
agentdescent plan --jsonon a missing, unreadable or malformed spec file now
prints the same{"ok": false, "error": ...}object on stdout as a spec that
fails to compile, instead of a bareerror:line on stderr; without--json
the stderr line is unchanged (#648). -
agentdescent evolve,campaignandtournamentwith--jsonnow answer a
missing, unreadable, malformed or non-compiling spec with the same
{"ok": false, "error": ...}object on stdout thatplan --jsonprints,
instead of a bare stderr line; without--jsonthey printspec error: ...
on stderr as before (evolveon an unreadable file now uses that same
prefix) (#650). -
A foreground
agentdescent evolvewhose provider refuses the model or key
(ProviderConfigError, or any other exception from the run) no longer dies with
a Python traceback: it prints the status line, oneerror: ...line with the
hint, the run dir andnext: agentdescent diagnose <run_id>, and exits 1. With
--jsonit prints one{"ok": false, "run_id", "state", "error", "dir"}
object.status/diagnoseare unchanged;AGENTDESCENT_DEBUG=1keeps the
traceback (#652). -
openai_compatibleandanthropic_compatiblenow raiseQuotaExhausted
(aProviderConfigError) on a quota- or billing-exhausted 429 — Ark
AccountQuotaExceeded, OpenAIinsufficient_quota, and bodies naming
quota/billing— sowith_retriesand the engines fail on the first
call instead of backing off for minutes as a rate limit. Real throttling
(rate_limit_exceeded, bare 429 +Retry-After) still retries.
diagnosesuggests waiting for the provider reset or pointing
api_key_env/modelat another plan, notdoctor(#653). -
Foreground
campaignandtournamentprint AgentDescent warnings as one
warning: …line (nofile:lineor source), matchingevolve. The early-stop
warning is no longer echoed on the terminal when the status/summary line already
shows the error; libraryevolve()callers keep standardwarningsbehaviour
(#654). -
Under
--json, run-store errors (status/show/apply/cancel/
resume/diagnoseon an unknown run) and archive errors (portfolio/
audit/safety) print{"ok": false, "error": ...}on stdout instead of a
bareerror:line on stderr; exit codes and plain output are unchanged (#658). -
Under
--json,initValueError / agent-mismatch refusals andrsi
archive or parameter errors print{"ok": false, "error": ...}on stdout
instead of a bareerror:line on stderr; exit codes and plain output are
unchanged (#660). -
agentdescent init --jsonnow prints one{"ok": true, "spec", "kind", "providers_config", "warnings", "notes", "next"}object on success instead
of the human prose lines; plain output is unchanged (#662). -
--jsonnow also covers argparse usage errors (missing required argument,
invalid choice, unknown option): instead of usage text on stderr, the CLI
prints one{"ok": false, "error", "usage"}object on stdout and still
exits 2; plain output is unchanged (#664). -
An abbreviated
--json(--js,--jso,--j), which argparse already
accepts, now also turns usage errors into the one{"ok": false, "error", "usage"}object on stdout instead of plain usage text on stderr (#666). -
agentdescent serveon a busy, privileged or out-of-range--portnow prints
onecannot listen on HOST:PORT -- <reason>line and exits 4, like
agentdescent mcp --transport streamable-http, instead of announcing the URL
and then crashing with a traceback; under--jsonit is one
{"ok": false, "error"}object on stdout. The banner now names the port
actually bound, so--port 0reports the real one (#668). -
agentdescent exam --jsonon a missing archive now prints one
{"ok": false, "error"}object on stdout (exit 2) like every other read-only
verb, instead of a bareerror:line on stderr; plain output is unchanged and
the archive is still not created (#670). -
agentdescent exam --domain module:buildernow turns a builder that raises
(e.g.TypeErrorfrom--domain json:dumps) or returns a dict missing
required keys into oneerror:line (exit 2), or one{"ok": false, "error"}
object under--json, instead of a raw traceback (#672). -
agentdescent algorithms run NAME PATH [cases.jsonl]now matches the plugin
slashalgorithms … runverb: it writes a starter spec with that algorithm
(default./agentdescent.<name>.spec.json) and prints aplanestimate, then
points atagentdescent evolve <spec>— without starting a run (#674). -
agentdescent doctornow checks the skill Grok Bot actually loads: a saved user
skill namedagentdescentunder$AGENTDESCENT_GROK_BOT_SKILLS(default
<home>/agent-data/workflows) is reported asuser skill ok|stale|missing, a
stale one is a problem with a rewrite hint, and--jsongains
hosts.grok-bot.user_skill/user_skill_path. Thehost grok-botline no
longer sayscli not on PATH(#675). -
agentdescent algorithms runnow printswrote <spec>before the error when
the plan step fails after writing the spec, rejects an invalid group-level
--kindwith the list of kinds before writing anything, and accepts
--agent REFlikeinit(a mismatched ref is refused before writing) (#688). -
agentdescent algorithms runnow tips the optionalcases.jsonlthird
argument (or checks the path you passed) when plan fails becausedata.path
does not exist, instead of only naming the missing file (#692). -
When the plan step of
agentdescent algorithms runfails,nextnow says to
fix the spec and runagentdescent plan <spec>again. Before,--jsonsaid
agentdescent evolve <spec>on a spec that plan had just refused. Both
failure shapes now carryspec_pathas well, and plain mode prints the same
next:line after the error (#694). -
Algorithm names now ignore case and
-vs_:agentdescent algorithms show GEPA,algorithms run archive-selection …,campaignand an EvolveSpec
algorithmresolve to the one registered algorithm they match instead of
failing as unknown.algorithms runwrites the registered name into the spec
and its default file name; an ambiguous name is still reported as unknown
(#696). -
A case or
-/_variant of a third-party algorithm plugin's name that failed
to load (algorithms show ACME-Methodfor a brokenacme_method) now reports
the plugin's load error instead of "unknown algorithm" (#698). -
tests/test_async_meta_population.pynow really runs its outer meta-proposer
(a missing module-levelimport remade it raiseNameErrorevery round, so
no island was ever promoted) and checks that the async run promotes the same
island as the sequential one, each from its own copy of the archive (#700). -
agentdescent algorithms run NAME PATHno longer answers a kind mismatch with
theinit --algorithmtext: the error namesalgorithm 'NAME'(the name is
positional), routes the one-file fix throughalgorithms run NAME FILE --kind text, and, when--kindwas not given, says a file is alwaystextor that a
directory's kind was guessed and--kindoverrides it (#702). -
init PATHandalgorithms run NAME PATHnow refuse a PATH that does not
exist before guessing kind: exit 2 withtarget '…' does not exist (cwd …)and
no spec written, instead of falling throughguess_kindtoskill_dirand a
kind-mismatch or "is not a directory" error. With--kind text, a path-looking
missing target still writes the spec but warns that the path string will be used
as the prompt;plansurfaces the same warning. Directory kinds'plansays
does not existwhen the target is absent (#706). -
init,algorithms runand the MCPalgorithm_spectool no longer replace an
existing, different spec at the output path without a word: the old copy is
saved as a<out>.bak-Nbackup and a note names it. An identical re-run writes no backup
(#725). -
init,algorithms runand the MCPalgorithm_spectool now back up a
replaced spec to numbered<out>.bak-Nslots (likeapply), so a second
re-run no longer overwrites the first backup; the OpenCode provider-only config
written next to the spec is backed up and named in a note the same way when it
held different content (#727). -
The MCP
algorithm_spectool now passes itsparamsobject straight through
instead of re-encoding it as--param KEY=VALUEstrings, so a key containing
=is no longer split into a different key and value, and an empty or
repeated key is reported as aparamskey rather than a CLI flag (#729). -
algorithms run ace/dgmno longer drop or comma-shred the user's existing text prompt: ace seeds the playbook from the target and only appends lessons under# Playbook (ACE), dgm keeps the prose intact and lists admitted capabilities under## Capabilities, and an unchanged run reportsapplynoop (#731). -
When the seed prompt already scores the target on held-out and the run does
not improve on it,diagnosenow reportsseed-already-solved(add cases the
seed gets wrong, use a stricter score, or raisetarget_reward) instead of
solved/ "review and apply the artifact", and foregroundevolveprints the
same note afterheld-out reward: 1.000 -> 1.000(and addsnoteto--json).
docs/algorithms.mdreplaces an empty code block with a tip to include cases
the seed fails (#732). -
algorithmsace / dgm: re-opening an applied text artifact parses the trailing# Playbook (ACE)/## Capabilitiesblock back into strategy state so a second run appends under a single header instead of duplicating it (#741). -
algorithmsace / dgm: re-opening an applied target no longer drops user text written after the# Playbook (ACE)/## Capabilitiesblock; it is re-attached after the block, an unchanged run stays a byte-identicalapplynoop, and multi-line ACE lessons round-trip (#743). -
init/algorithms run: an unknown--agent(for example the install host
nameclaude-code) is refused before the spec is written, listing only the
agent refs and suggestingclaude_code, instead of writing a specplan
rejects with a list of policy classes (#745). -
agentdescent algorithms runno longer hides init's notes and warnings when
the follow-upplanfails: text mode prints thenote:/warning:lines
(including where an overwritten spec was backed up as<out>.bak-N), and the
--json/ MCPalgorithm_specerror object now carriesnotesand
warningslists like the success object (#749). -
init/algorithms run: an--agentthat is aninstallhost name or alias
now gets a host-aware hint —deepseek-harness/claudecode/open-code
suggestdsh/claude_code/opencode, andgrok-bot/groksay Grok
Bot is an install host with no worker CLI and point atagentdescent doctor/
openai_compatible(#752). -
The only-
ARK_API_KEYexample indocs/plugin-quickstart.mdnow names
deepseek-v4-flash, the model the Ark Coding endpoint serves, instead of
doubao-seed-code, which that endpoint refuses with 404UnsupportedModel
(#754). -
kind: textnow refuses an existing directory as its target:init,
algorithms run,plan,evolveand MCPstartstop with "is a directory"
and point at a file inside it or--kind skill_dir, instead of evolving the
path string as the prompt;apply/apply --dry-runonto a directory give
the same error instead of claiming a write and then tracing back on
IsADirectoryError(#755). -
diagnoseno longer calls a runpartial-improvementwhen its held-out reward
never rose above the seed's (for example0.000 -> 0.000with only
dgm-selectparent-pick commits); such a run falls through to
agent-failures/no-improvement, andpartial-improvementnow names
initial -> final(#756). -
Directory
applybackups (bothEvolutionResult.write_toand
apply --from) now land under$AGENTDESCENT_HOME/backups/instead of a
sibling<path>.bak-N, so host skill scanners (OpenCode, Claude Code) no longer
load the backup and shadow the evolved skill (#758). -
DGM reflection prompts now include available task answers so spec-driven capability proposals can learn from failed outputs.
-
initandalgorithms runnow write an explicit reflector foragent_dir.
The reflector and OpenCode provider configuration use the same selected API key
environment variable (#760). -
EvoSkill frontier merge reports now use category
evoskill-select, so evolve/show/diagnose outcomes no longer collapse successful runs intounknown.