v0.11.0
Added
-
tdd fleetreports baseline-collector and advance-holder liveness (follow-up to #115,
fixes #122):fleet --jsonnow includesstaleandpidon everycollectingrow,
matching the fields already ontdd status/tdd progressresult objects. A new
top-leveladvancinglist exposes in-flighttdd advanceclaims with the same liveness
fields. Human text gains— collector (pid N) is dead/— holder (pid N) is dead
suffixes;no active runsis suppressed when an advance claim is held. -
run.start_sha(schema v10,MIGRATIONS[9]): the HEAD commit at run start is now
recorded on the run row and used as the reference point for late probes and
--accept-failuresgating. -
gitutil.temporary_worktree: context manager that checks out a given sha into a
detached temporary worktree and removes it on exit; used by the late-probe and
--accept-failuresimplementations. -
baseline_late_probe/baseline_late_probe_unobservedintegrity events: emitted
when the close sweep late-probes an un-baselined project atstart_sha(observed) or
cannot observe it (unobserved). -
resumeresultrefused_from_baseline: lists per-project tests that--accept-failures
refused because they pass atstart_sha. -
New
baseline_amendedevent detail shape:{project: {start_sha, accepted: {id: verdict}, refused: {id: verdict}}}with per-test verdicts. -
Friction-log lines for amended baselines: accepted/refused tests appear under Human
interventions; the run header gains a "Late baselines" line separate from "Baseline failures
at start". -
tdd docs [topic]prints the documentation shipped with this version. The wheel now
carriesdocs/harness-integration.md, both example skills, the hooks README, the example
plan, and the README undertddcli/_docs/. An agent meeting the tool in an unfamiliar
project can read the protocol without network access — and without the version hazard of
fetching a skill frommainthat targets a differentverb_set_versionthan the installed
binary emits.tdd docswith no topic returns a machine-readable index;tdd --helpand
tdd initnow point at it. -
artifact_regenerate_failedintegrity event. When aregeneratehook exits non-zero,
anartifact_regenerate_failedevent is emitted on the cycle (or run, forrun start)
with the artifact name, exit code, and last 2000 chars of stderr. It is listed in the
friction log under its cycle via the existing per-cycle event renderer. -
artifact_check.regenerate_failedcolumn (ledger schema v9). A non-zero hook exit
sets this flag on theartifact_checkrow. Existing ledgers are migrated on open via
MIGRATIONS[8].
Fixed
--accept-failuresis now gated onrun.start_sha: only tests that also fail at the
start sha are accepted into the baseline; tests that pass there are refused and listed in
result.refused_from_baseline. This prevents laundering run-introduced regressions.- Un-baselined projects are late-probed at
start_shain the close sweep instead of
accepting HEAD failures verbatim. An observed probe inserts alate_probebaseline row and
subtracts it like a normal baseline; an unobservable probe blocks withresolve_blocker
and no longer recommends--accept-failures. - The
no_baseline_for_projectreply no longer recommends--accept-failuresfor
unobservable projects. - A dead baseline collector no longer bricks the worktree. When a
tdd run start
process is killed during baseline collection, the stalebaseline_claimrow was left
behind.tdd statusandtdd progresscomputedstale: truecorrectly but emitted
await_baselineanyway — a non-terminal verb that instructed autonomous executors to
poll forever. Both commands now emitconfirm_cycle_applicablewithresult.stale == true
andresult.pidwhen the collector pid is dead, and thedetailnames the recovery
action: re-runtdd run start --plan <path>. Thecollecting_baselineresult body always
carriesstaleandpidso callers can inspect liveness without a separatetdd fleet
call. (Fixes #115.) check_artifacts: a failed regenerate hook is now a hard close-sweep failure.
Previously, aregeneratehook that exited non-zero left the artifact path untouched
(tree hash unchanged), so the staleness probe reported "fresh" andtdd advancereplied
complete. The exit code is now captured; a non-zero exit surfacesfix_regressionwith
result.artifact_failureslisting the affected artifact(s) and their stderr.run startrefuses when a regenerate hook fails before the first cycle. The run row
is ended withoutcome = "refused"sotdd statusreports no active run.