v0.13.0
Added
- Where a run's time went (#147).
tdd metricsgains a per-runtimeobject:
wall_clock_s,suite_s,suite_shareandby_phase(runs and suite seconds for
every phase recorded). A live run's wall clock runs to now. The friction log gains a
## Timesection 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 andinvocation.duration_ms. - Split mode: a ledger the agent's account cannot open (#142). With
/etc/tdd-cli/runner.tomlin place, a separate runner account owns the ledger
in a mode-700 directory. The agent'stddforwards every verb exceptdocs
andinitto it throughsudo, and the runner executes every suite, gate,
hook and git command as the agent. Executor identity is recorded asoperator
when the runner's config assigns the calling account a model, andclaimed
otherwise.tdd runner import <ledger>brings an existing ledger under the
runner, markedpre_split_import, whichtdd metricsreports. Setup and a
verification checklist:tdd docs split. tdd doctorreportsmode(singleorsplit). 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_IMPLadvance 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 metricscounts
impl_attemptsfrom each advance's target-only run only, and still counts every
AWAITING_IMPLrun in cycles recorded before this change. tdd doctoron a single-user machine no longer lets "ledger outside
worktree" stand for isolation: aledger isolationnotice 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_PINand
tdd sensitivity checknow 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-tname. 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 stillnot_collected. A target adopted in place of the
declared id is run in the same advance. The ledger is now schema 12:
invocation.others_observedis0for 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_hashhashed 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-baselinescache entries written by
earlier versions no longer match and are re-probed once.