Repository navigation
0.6.0 — multi-head, allocator, trajectories, governance
Everything merged since 0.5.1: multi-head ledger forks, value-directed allocation, L-traj resume, trajectory ledger, governance contracts, CladeThompson, skill_dir structural gates, RRSI building blocks, changelog fragments, and a large set of crash-safety / overflow / parser fixes.
Highlights
- Multiple live heads —
Ledger.fork/live_heads/discard_headso workers can expand different candidates in parallel without serialising ondev. - Value-directed budget allocation —
evolve(allocator=...)learns which candidates are worth the expensive self-verify rollout. - L-traj resume —
async_evolve(resume_queue=...)re-runs stragglers against a newer head instead of only counting them. - Rollout trajectory ledger — opt-in
record_trajectories=Truepersists versioned trajectories for process supervision and audit replay. - Governance invariants —
evolve(contract=Contract(invariants=(...)))enforces machine-checkable rules before measurement. - CladeThompson selection, skill_dir structural
SKILL.mdgates,Diff.rationale, and RRSI component / history / schedule fixtures. - Changelog fragments — PRs add
changelog.d/<n>-<slug>.mdinstead of editingCHANGELOG.md. - Hardening across AuditStore, CostEfficient/FlatPuct/Archive softmax, rewards number parsing, runstore/FileCache/Ledger write contracts, and AdaptiveTrustRegion caps.
Upgrade notes
- Install with
pip install "agentdescent[mcp]==0.6.0"(MCP extra needs Python >= 3.10). DSH package isdsh-agentdescent@0.6.0. - Research examples remain in the source checkout. Clone
v0.6.0for the matching tag. - Trajectory recording, contracts, allocator, and resume_queue remain opt-in; defaults match 0.5.1 behaviour.
Validation
Release commit on main: d0cbc268c0104c29520ed79b313a37754c7eca96. Required checks build + test (3.9–3.13) were green on the release PR before squash auto-merge.
Full detail: CHANGELOG.
Added (from CHANGELOG)
Ledger.fork/live_heads/discard_head— multiple live heads (#75).- Value-directed budget allocation —
evolve(allocator=...)/async_evolve(allocator=...).BudgetGovernordegrades optional spend (fusion tournaments, the self-verify rollout) against global floors: oncespent / max_tokenscrosses a threshold, every candidate stops getting the expensive part. The EvoAlloc line of work measures the cost of that fixed allocation when evaluation is the scarce resource — this replaces it with a per-candidate decision learned from the run's own merge history. - **
async_evolve(resume_queue=...)— the L-traj resume half, the straggler CladeThompsonselection policy (#276): HGM's expansion rule, Thompson- Add the RRSI component vocabulary (
examples/rrsi/components.py) and per-edit kind="skill_dir"now gates candidates structurally before any rolloutDiff.rationalecarries the FileTree reflector's reason into the ledger- Add the RRSI cosine-annealed L0 edit-budget schedule (
examples/rrsi/schedule.py) - Add an offline RRSI round-selection mechanism fixture adapted from Google's
- Rollout trajectory ledger.
evolve(record_trajectories=True)(and - Governance invariants.
evolve(contract=Contract(invariants=(...)))(and - Changelog fragments (#295): a PR now adds one file
changelog.d/<number>-<slug>.md
Fixed (from CHANGELOG)
audit.AuditStorekeeps its crash-safety contract (#274). A torn tail leftFlatPuct/CostEfficient/MCTS/Beamno longer crash or silentlysigmoid_novelty_weights/Archive(sampling='sigmoid_novelty')no longerrunstorerounds/status no longer break on a non-finite reward or a torn- HuggingFace row-cache filenames sanitize split names and bound their
TrajectoryStore.record()no longer raises when a record cannot be encodedFileCachewrite failures no longer leave orphan*.tmpsiblings, and- A failed
Ledgerwrite no longer corrupts the ledger (#265). Payloads are runstore._write_jsonencodes before creating a sibling tmp and alwaysmeta.cached_completionis best effort and never costs the caller a paid call: a cache-write failure (OSError, unencodable or non-strresponse) returns the response uncached and leaves no*.partialsibling, the entry is encoded before the disk is touched, and a corrupt or non-strentry (including a JSON list, which used to raiseTypeError) is counted once, as a miss, instead of as both a hit and a miss (#269).TrajectoryStore.get/path_forround-triptrace_ids whoseartifact_idcontains a colon by parsing withrsplit(":", 1)(#257). The key is always a hex digest; a leading split treated a namespaced id as part of the key and returnedNonefor a record that was on disk.dataloadercache entries are written atomically (temp file +os.replace),- Container sandbox allowlisted env vars are forwarded as
--env NAMEso CallBudgetdefault floor is capped atbase, so a configured ceiling belowhf_rows_modelscope(cache=False)now bypasses an existing on-disk cache andAdaptiveTrustRegionwidens when a window is dominated byOVERSIZED- Allocator A/B comparisons now use the same fully scored seed pairs for
- The
OVERSIZEDmerge report now quotes the trust region that actually BudgetGovernor's diminishing-returns stop skips a non-finite (NaN/inf)PopulationAggregatorrecordsCandidate.parentand backpropagates
… and 4 more in CHANGELOG.