Skip to content

v0.11.0

Choose a tag to compare

@geuben-dispatch geuben-dispatch released this 16 Sep 11:22
· 26 commits to main since this release
Immutable release. Only release title and notes can be modified.
f45fd86

Added

  • tdd fleet reports baseline-collector and advance-holder liveness (follow-up to #115,
    fixes #122): fleet --json now includes stale and pid on every collecting row,
    matching the fields already on tdd status / tdd progress result objects. A new
    top-level advancing list exposes in-flight tdd advance claims with the same liveness
    fields. Human text gains — collector (pid N) is dead / — holder (pid N) is dead
    suffixes; no active runs is 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-failures gating.

  • 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-failures implementations.

  • baseline_late_probe / baseline_late_probe_unobserved integrity events: emitted
    when the close sweep late-probes an un-baselined project at start_sha (observed) or
    cannot observe it (unobserved).

  • resume result refused_from_baseline: lists per-project tests that --accept-failures
    refused because they pass at start_sha.

  • New baseline_amended event 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
    carries docs/harness-integration.md, both example skills, the hooks README, the example
    plan, and the README under tddcli/_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 from main that targets a different verb_set_version than the installed
    binary emits. tdd docs with no topic returns a machine-readable index; tdd --help and
    tdd init now point at it.

  • artifact_regenerate_failed integrity event. When a regenerate hook exits non-zero,
    an artifact_regenerate_failed event is emitted on the cycle (or run, for run 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_failed column (ledger schema v9). A non-zero hook exit
    sets this flag on the artifact_check row. Existing ledgers are migrated on open via
    MIGRATIONS[8].

Fixed

  • --accept-failures is now gated on run.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_sha in the close sweep instead of
    accepting HEAD failures verbatim. An observed probe inserts a late_probe baseline row and
    subtracts it like a normal baseline; an unobservable probe blocks with resolve_blocker
    and no longer recommends --accept-failures.
  • The no_baseline_for_project reply no longer recommends --accept-failures for
    unobservable projects.
  • A dead baseline collector no longer bricks the worktree. When a tdd run start
    process is killed during baseline collection, the stale baseline_claim row was left
    behind. tdd status and tdd progress computed stale: true correctly but emitted
    await_baseline anyway — a non-terminal verb that instructed autonomous executors to
    poll forever. Both commands now emit confirm_cycle_applicable with result.stale == true
    and result.pid when the collector pid is dead, and the detail names the recovery
    action: re-run tdd run start --plan <path>. The collecting_baseline result body always
    carries stale and pid so callers can inspect liveness without a separate tdd fleet
    call. (Fixes #115.)
  • check_artifacts: a failed regenerate hook is now a hard close-sweep failure.
    Previously, a regenerate hook that exited non-zero left the artifact path untouched
    (tree hash unchanged), so the staleness probe reported "fresh" and tdd advance replied
    complete. The exit code is now captured; a non-zero exit surfaces fix_regression with
    result.artifact_failures listing the affected artifact(s) and their stderr.
  • run start refuses when a regenerate hook fails before the first cycle. The run row
    is ended with outcome = "refused" so tdd status reports no active run.