Skip to content

v0.13.0

Choose a tag to compare

@geuben-dispatch geuben-dispatch released this 23 Sep 10:16
· 6 commits to main since this release
Immutable release. Only release title and notes can be modified.
20eb12a

Added

  • Where a run's time went (#147). tdd metrics gains a per-run time object:
    wall_clock_s, suite_s, suite_share and by_phase (runs and suite seconds for
    every phase recorded). A live run's wall clock runs to now. The friction log gains a
    ## Time section with the same split, a per-phase table and a per-cycle table
    (wall clock, suite time and suite runs). Nothing new is recorded: these are the
    ledger's existing timestamps and invocation.duration_ms.
  • Split mode: a ledger the agent's account cannot open (#142). With
    /etc/tdd-cli/runner.toml in place, a separate runner account owns the ledger
    in a mode-700 directory. The agent's tdd forwards every verb except docs
    and init to it through sudo, and the runner executes every suite, gate,
    hook and git command as the agent. Executor identity is recorded as operator
    when the runner's config assigns the calling account a model, and claimed
    otherwise. tdd runner import <ledger> brings an existing ledger under the
    runner, marked pre_split_import, which tdd metrics reports. Setup and a
    verification checklist: tdd docs split.
  • tdd doctor reports mode (single or split). In split mode it probes,
    live and as the agent, that the uid drop works, that the agent cannot read the
    ledger, and that it cannot write the install.

Changed

  • GREEN runs the target first (#149). An AWAITING_IMPL advance whose target
    still fails now says so after running only the target. A passing target is followed
    by the whole-suite run that decides GREEN, as before. tdd metrics counts
    impl_attempts from each advance's target-only run only, and still counts every
    AWAITING_IMPL run in cycles recorded before this change.
  • tdd doctor on a single-user machine no longer lets "ledger outside
    worktree" stand for isolation: a ledger isolation notice says the ledger is
    owned by the same uid that runs the agent. The README and SECURITY.md say the
    same. Single-user installs behave exactly as before.
  • RED runs only the target test (#148). AWAITING_TEST, AWAITING_PIN and
    tdd sensitivity check now run the target alone: pytest runs the owning suite's
    collect command with the node id, and vitest filters to the file and an anchored,
    escaped -t name. A failure elsewhere no longer blocks RED. It is caught at
    GREEN, which runs the whole suite for every adapter. A collection error in
    the target's own file is still not_collected. A target adopted in place of the
    declared id is run in the same advance. The ledger is now schema 12:
    invocation.others_observed is 0 for a target-only run.

Fixed

  • GREEN ran only the target on cargo, gradle, xctest and exec (#153), so a
    regression elsewhere reached the close sweep unseen, and the sweep could skip the
    cycle's own project without the whole suite ever running. These adapters now
    narrow only when asked for a target-only run.

  • The close sweep re-ran a tree that had just passed (#146): gitutil.tree_hash hashed git
    state (index entries plus the unstaged diff), so the same content hashed differently before
    and after the GREEN commit, and the §6.1 skip of a cycle's own suites never fired. It now
    hashes working-tree content through a throwaway index, independent of what is staged or
    committed. A skipped close sweep still runs the cycle project's lint/typecheck gates; before
    this fix, the skip would have dropped them too. --reuse-baselines cache entries written by
    earlier versions no longer match and are re-probed once.