@@ -7,6 +7,99 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 0.6.0] - 2026-05-25
11+
12+ ### Added
13+
14+ - ** Cross-machine run ledger.** New ` .aexp/ledger/<job_id>.json ` files
15+ are sanitized projections of terminal-state runs, committed to git.
16+ Every machine sees the same view after ` git pull ` — the validator
17+ no longer needs to read filesystem-local signac workspace state to
18+ resolve finding citations. Auto-populated by a hook in
19+ ` aexp.runs.mark_status ` that fires on every terminal-status
20+ transition (complete/failed/abandoned/stopped). The projection is an
21+ explicit allowlist (statepoint, run_link, status, ended_at,
22+ wallclock_s, tracker pointers, code commit, registered_machine,
23+ promoted_at). Per-machine debris (absolute paths in
24+ ` tracker_log/events.jsonl ` , wandb offline-run dirs, user artifacts)
25+ stays in the gitignored ` .runs/workspace/<id>/ ` . New ` aexp.ledger `
26+ module with ` promote_to_ledger ` , ` backfill_ledger ` , and lookup
27+ helpers.
28+ - ** ` aexp ledger promote <id> ` / ` aexp ledger backfill ` CLI verbs.**
29+ Manual one-shot promotion and a bulk migration tool. Each machine
30+ with terminal-state runs runs ` aexp ledger backfill ` once after
31+ upgrading; the resulting ledger files commit and push.
32+ - ** ` aexp validate --strict-runs={error|warn|off} ` flag.** Manual
33+ severity knob for finding-citation existence checks. Default
34+ ` error ` preserves 0.5 behavior. ` warn ` downgrades existence
35+ failures to warnings (exit 0); ` off ` skips existence checks
36+ entirely. Structural-shape checks always emit at error severity
37+ regardless. Useful while the ledger is being backfilled across
38+ machines.
39+ - ** ` finding.absent_run_citation ` warning code** for citations that
40+ resolve in a per-machine index file but not in the local store or
41+ ledger — distinguishes "lives on another machine" from "broken."
42+ Same treatment for batches: ` finding.absent_batch_runs ` .
43+ - ** ` finding.no_run_store ` warning code** emitted once per validate
44+ run when no source-of-truth is available (no ledger, no local
45+ store, no index). Replaces a previously-silent tolerance branch
46+ that made it easy to overlook a missing local store.
47+ - ** ` .aexp/installed.json::machine_label ` field.** Short identifier
48+ for each install, tagged on ledger entries via ` registered_machine ` .
49+ Default: short hostname. Override at install time with
50+ ` aexp install --machine-label <name> ` , or by editing
51+ ` installed.json ` directly. Sticky across re-installs. New
52+ ` read_machine_label ` helper in ` aexp.utils.paths ` .
53+ - ** ` aexp install ` manages a ` .gitignore ` block.** Block-merged with
54+ ` # agentic-experiments:begin ` /` :end ` markers. Body sets ` .aexp/* ` +
55+ ` !.aexp/runs-index/ ` + ` !.aexp/ledger/ ` so per-machine state stays
56+ ignored while cross-machine shared subdirs are committable. Emits
57+ a ` gitignore_migration_warning ` action when a legacy ` .aexp/ `
58+ pattern is detected outside the managed block (the legacy form
59+ parent-excludes ` .aexp/ ` , blocking the ` ! ` exceptions).
60+ - ** ` aexp runs-export-index ` verb (transitional).** Per-machine JSON
61+ dump of terminal runs at ` .aexp/runs-index/<machine_label>.json ` ,
62+ unioned by the validator into a three-state vocabulary. Deprecated
63+ immediately in favor of ` aexp ledger backfill ` ; emits a
64+ deprecation warning when invoked. Kept one release window for
65+ back-compat reads.
66+
67+ ### Changed
68+
69+ - ** ` aexp.runs.mark_status ` is the unified terminal-status hook
70+ point.** ` run_lifecycle ` 's ` complete ` /` failed ` status writes route
71+ through ` mark_status ` (with ` set_ended_at=False ` to avoid an extra
72+ doc-load inside the Windows file-lock race window during
73+ ` stop_queued ` shutdown). The function gains a `set_ended_at: bool
74+ = True` keyword; default preserves the pre-0.6 behavior for
75+ existing callers. New ` TERMINAL_STATUSES ` module constant.
76+ - ** ` aexp.linking.link_to_experiment ` re-promotes on terminal jobs.**
77+ Re-stamping a job's run-link via ` aexp link ` now also updates the
78+ ledger entry's ` run_link ` field, so the ledger projection doesn't
79+ lag the on-disk state.
80+
81+ ### Fixed
82+
83+ - Validator no longer silently passes finding citations when neither
84+ a local run store nor any cross-machine source exists — surfaces a
85+ ` finding.no_run_store ` warning so the silence is visible.
86+
87+ ### Migration
88+
89+ Existing consumers upgrading from 0.5:
90+
91+ 1 . ` pip install -e <agentic-experiments> ` in each env.
92+ 2 . ` aexp install --force ` once per consumer (writes the new
93+ gitignore block, materializes ` machine_label ` ). If a
94+ ` gitignore_migration_warning ` is emitted, delete the legacy
95+ ` .aexp/ ` line from ` .gitignore ` .
96+ 3 . ` aexp ledger backfill ` on each machine that has terminal-state
97+ runs.
98+ 4 . Commit ` .gitignore ` and ` .aexp/ledger/ ` . Push, then pull on every
99+ other consumer.
100+
101+ See ` docs/queue.md ` § cross-machine for the full workflow.
102+
10103## [ 0.5.0] - 2026-05-21
11104
12105### Changed
0 commit comments