Releases: jstoup111/ai-conductor
Releases · jstoup111/ai-conductor
Release list
v1.1.0
Immutable
release. Only release title and notes can be modified.
Added
- Daemon OpenTelemetry traces now identify the feature branch and executing engine version. (implementation PR #2080).
- OpenTelemetry now exports cumulative per-feature cost and token gauges after each terminal step. (implementation PR #2104).
- Remediation findings owned by existing plan tasks route back to BUILD via the existing-task disposition, charging the gate lap allowance and never the plan-growth allowance. (implementation PR #2189).
- Adds a coverage-binding gate that verifies plan criteria against cited task completion checks. (implementation PR #2135).
- Daemon runs can now process multiple features concurrently within a single repository. (implementation PR #2075).
- The daemon prints a startup warning whenever its effective concurrency exceeds 1, describing the extra rebase churn and spend to expect and how to return to serial dispatch. (implementation PR #2240).
- The daemon and engineer workflows now require GitHub CLI 2.73.0 or later and clearly report unsupported JSON fields. (implementation PR #2243).
- Adds durable post-join build-review remediation adjudication that classifies joined findings and safely routes follow-up work. (implementation PR #2087).
- Gate verdicts are persisted and shown in daemon and interactive terminal output. (implementation PR #2375).
- Configure OTLP HTTP exporter headers from environment-variable references. (implementation PR #2369).
Changed
- Plans now declare only genuine task dependencies and tight file sets, so BUILD can fan out independent tasks instead of serializing them. (implementation PR #2073).
- The prd_audit remediation append allowance is raised from 5 tasks / 25% of the plan to 8 tasks / 50%. (implementation PR #2131).
- Plans now assign production-boundary integration ownership and must provide machine-grounded, semantically reviewed coverage for citable ADR decisions. (implementation PR #2183).
- Build skills defer aggregate verification to the dedicated test_suite gate and use its failure evidence for scoped repairs. (implementation PR #2232).
- The hosted documentation site now publishes from the
stablebranch at each release cut instead of from every merge tomain. (implementation PR #2363). - The pre-BUILD coverage-binding judge (
coverage_binding.judge.enabled) is now on by default. (implementation PR #2116). - The as-built architecture review now follows an explicit context budget (bounded diff/log/search reads, no re-reading policy text) to avoid mid-review compaction. (implementation PR #2379).
- The as-built architecture review and prd-audit now delegate evidence gathering to host-native subagents and grade from bounded digests, keeping the reviewer's context for judgement. (implementation PR #2380).
- Release publication now requires one successful live-provider E2E instead of every configured provider. (implementation PR #2438).
Fixed
- A build_review aggregate from a prior lap no longer replays its findings as kickbacks. (implementation PR #2094).
- build_review no longer stamps its aggregate with a stale lap identity when the test-suite evidence is reused. (implementation PR #2110).
- A remediation finding the planner dispositions as a human decision is no longer reported as a missing finding. (implementation PR #2112).
- Build-review cache entries now miss when the reviewer skill text or the engine build changes. (implementation PR #2115).
- A SHIP-tail verdict gate resumed as its group's last member no longer discards the verdict it just produced and retry until its budget is spent. (implementation PR #2117).
- The daemon's cleared-HALT watcher now carries a bounded polling fallback, so a halt cleared before the watcher is ready (or a dropped filesystem event) is still picked up within one poll interval, and watcher errors are logged instead of swallowed. (implementation PR #2118).
- PRD audit citations now accept every task identifier declared by the active plan. (implementation PR #2105).
- Configuration now prevents conditional or disabled gating and structural steps from bypassing required workflow enforcement. (implementation PR #2107).
- A remediation halt caused by a planner gap-id mismatch now reports the halt rationale the planner recorded, instead of only the id mismatch. (implementation PR #2129).
- Build review distinguishes counterfactual test sensitivity from infrastructure failures. (implementation PR #2109).
- A plan task citing a placeholder artifact path such as
.docs/plans/<slug>.mdis no longer treated as targeting another feature's sealed artifact. (implementation PR #2130). - A prd-audit Verdict Table row may cite every plan task its evidence spans, as a comma-separated list; a FIXABLE row must still cite exactly one owning task. (implementation PR #2134).
- Prevents approved ADRs without citable decisions from landing. (implementation PR #2133).
- ADR decisions numbered as
**1. Title.**are now citable as governing clauses, so a remediable as-built finding naming one no longer halts for a human. (implementation PR #2141). - Install and uninstall banners now say AI Conductor Harness. (implementation PR #2142).
- Operator over-scope decisions on no-owner (NC) findings now survive prd_audit lap renumbering and line-anchor drift instead of re-halting as unknown-criterion. (implementation PR #2144).
- Operator over-scope decisions on NC findings now survive laps that reword the evidence summary, not just renumbering and line-anchor drift. (implementation PR #2146).
- The prd_audit skill reuses recorded operator-decision wording for already-decided no-owner findings, so decisions keep matching across re-graded laps. (implementation PR #2148).
- Remediation gaps whose tasks merely cite a protected artifact as evidence stay dispatchable instead of halting as Missing. (implementation PR #2150).
- Custom steps with only a completion artifact no longer crash interactive conductor runs. (implementation PR #2136).
- Covers: story-criterion markers now resolve against positional criterion ids, so criterion-bound tests actually enter test-quality scope. (implementation PR #2182).
- Rejected remediation dispositions now halt with actionable details instead of being silently dropped. (implementation PR #2194).
- The daemon now safely recovers from failed project setup by quarantining residue and verifying one bounded repair attempt before parking. (implementation PR #2108).
- Criterion ids now carry the whole story heading id, so stories with non-numeric ids (
## Story 5a:) get distinct, addressable criterion keys instead of colliding with a numerically-adjacent story's. (implementation PR #2222). - The PRD-audit remediation path now derives criterion ids from the whole story heading id, so a story with a non-numeric id (
## Story 5a:) no longer has all of its criteria dropped from the expected set and reported as absent from the active stories. (implementation PR #2227). - Story criterion ids now count hard-wrapped Given/When/Then rows; previously a row whose "then" fell on a continuation line was silently dropped and later ordinals shifted, which could halt the prd_audit gate against a correct report. (implementation PR #2237).
- Remove redundant BUILD full-suite requirements and routine reviewer test reruns. (implementation PR #2236).
- Preserve routed BUILD gate verdicts before downstream gate selection. (implementation PR #2244).
- Halt-issue swe...
v1.0.0
Immutable
release. Only release title and notes can be modified.
Added
- An operator-actionable halt (needs-human, plan-gap, or protected-artifact) off the default branch now leaves a committed, best-effort-pushed halt record at
.docs/halted/<slug>.mdthat survives a recreated worktree and updates to resolved when the halt clears. (implementation PR #1845). - Codex dispatches are now priced from a committed per-model rate card (
.ai-conductor/rate-card.json, maintained byconduct rate-card refresh), so a mixed-provider feature reports its real cost instead of a Claude-only figure; dispatches whose cost cannot be established are named explicitly on the finish usage line. (implementation PR #1858). - Plan specifications now require every task to declare two to five nonblank completion checks before landing. (implementation PR #1866).
- Adds a guided workflow for safely removing obsolete code and verifying remaining references. (implementation PR #1899).
- Daemon runs now route wholly remediable as-built architecture-review findings through one bounded build remediation lap, while design findings halt for human input. (implementation PR #1908).
- Adds configurable visualizer plugins that receive Conductor event streams. (implementation PR #1958).
- OpenTelemetry traces distinguish completed, halted, and terminated conductor runs. (implementation PR #1997).
bin/install --checknow warns when ripgrep is missing, since several shell tests silently skip their coverage without it. (implementation PR #2030).- Adds configurable test-suite verification modes and drift budgets that preserve valid full-suite evidence. (implementation PR #2032).
- A major version update is no longer applied by the startup auto-check and requires typing the target version to confirm. (implementation PR #2083).
ai-conductor --versionnow reports the installed harness version. (implementation PR #2081).
Changed
- build_review no longer judges plan conformance, scope, or mechanism soundness — prd_audit now owns scope-as-intent grading with bounded remediation, and a new as-built architecture review owns design conformance, both running on every feature regardless of tier or track; build_review keeps only an opt-in test-quality rubric. (implementation PR #1824).
- Require Node.js 26 and update the conductor and recorder dependency stacks. (implementation PR #1797).
- Enforce plan-task coverage for every story acceptance criterion. (implementation PR #1847).
- Unifies provider dispatch so every invocation records complete execution outcomes and usage. (implementation PR #1871).
- Introduces the canonical ai-conductor compose workflow and ai-conductor launcher while retaining deprecated compatibility aliases. (implementation PR #2023).
Removed
- Removed ineffective TDD RED/GREEN model configuration keys; configured tdd blocks are now rejected as unknown step settings. (implementation PR #1910).
- Retire the retrospective skill, command, and delivery-time closeout obligations. (implementation PR #1946).
- Removes the unattended inline --auto one-shot and directs unattended runs to the daemon, and fixes an intake-ledger lease failure when a lease was released while another process probed the owner's liveness. (implementation PR #1974).
- Removes the retired
wiring_checkBUILD step and its configuration key. (implementation PR #1942). - The
conductlauncher now runs the TypeScript CLI and warns to useai-conductor. (implementation PR #2052).
Fixed
- A build_review rubric prompt larger than 128 KiB no longer fails to start on the Claude provider, which previously exhausted the mechanical fault allowance and halted the feature. (implementation PR #1821).
- Codex dispatches can now reach the network inside their sandbox, so steps that use
ghorgit pushno longer fail as approval denials. (implementation PR #1828). - Remediation tasks may no longer order a removal that drops coverage a completed plan task delivered — the removal must name the surviving plan task or criterion and carry its replacement. (implementation PR #1829).
- Remediation tasks that change one side of a duplicated enumeration, registry, or id list must now name the counterpart or derive both from one source, so the pair cannot silently diverge. (implementation PR #1830).
- Remediation tasks now sweep for sibling sites of the same defect class and for what a removal orphans, bounded to sites an existing plan task admits, so a repaired defect stops reappearing at the next site on the following audit cycle. (implementation PR #1837).
- A steps: override for an out-of-band step (remediate, bootstrap, assess, attribution_verify) is accepted instead of being rejected as a custom step missing 'after'. (implementation PR #1843).
- An OVER_SCOPE prd-audit finding the operator has accepted now satisfies the prd_audit gate instead of blocking it until the oscillation cap halts the run. (implementation PR #1854).
- Codex-routed steps that dispatch through the streaming path no longer fail with "Codex self-host isolation is unavailable"; the streaming runtime wrapper now preserves every provider capability, including self-host provisioning and readiness. (implementation PR #1855).
- FINISH no longer halts on an authored PR body that still carries the SHIP-entry draft note; floor classification is decided by body content rather than by the presence of engine boilerplate. (implementation PR #1856).
- Repository documentation maintenance now uses the supported Codex Terra model instead of falling back to Claude Sonnet. (implementation PR #1860).
- Lets operators decide every visible over-scope criterion in one clear, while refused criteria remain blocked with their rationale recorded. (implementation PR #1873).
- Daemon builds now report prerequisite-blocked steps and validator refusals accurately instead of marking their work as failed. (implementation PR #1870).
- TDD-authored tests now declare Covers markers, so the build_review test-quality rubric reviews them instead of passing vacuously on an empty scope. (implementation PR #1877).
- Daemon help now lists every supported dispatcher command, including pause and resume. (implementation PR #1878).
- Validates feature-scoped artifact stems before landing a spec. (implementation PR #1893).
- Manual testing now warns instead of blocking when browser automation dependencies are unavailable, while continuing curl checks and preserving real application failures. (implementation PR #1902).
- Restored configurable gate code-validity behavior and reliable Claude rate-limit hook handling. (implementation PR #1914).
- SHIP validation retries verdict reports from an earlier dispatch instead of routing their stale findings. (implementation PR #1891).
- The daemon now identifies the actual invalid as-built verdict defect instead of always reporting a plan gap. (implementation PR #1919).
- Implicitly invocable skills now stay within their lifecycle boundaries instead of activating on ordinary change, planning, review, or question prompts. (implementation PR #1924).
- Daemon discovery no longer rejects valid coherence artifacts whose table mixes six-cell criterion rows with five-cell legacy rows. (implementation PR #1926).
- As-built review remediation now resolves a governing clause written with backticks or bold around its ADR stem, and accepts the documented
<stem> + <decision number>form, instead of halting for a human. (implementation PR #1959). - PRD audits now safely parse, validate, and route no-owner over-scope findings. (implementation PR #1909).
- Remediation plans now accept case-variant ...
v0.104.0
Immutable
release. Only release title and notes can be modified.
Added
- Task-attributed commits are checked against the active task's declared files at commit time, with violations and accepted scope widenings carried into build_review evidence. (implementation PR #1534).
- Self-host dispatches now prove the live checkout is read-only with a two-sided bwrap probe, so concurrent operator edits during a contained build no longer halt the run; unproven or opted-out dispatches keep the prior fail-closed behavior. (implementation PR #1698).
- Build-review configuration accepts causalIntegrity as an input alias for rootCause. (implementation PR #1766).
- Adds
conduct-ts rewind --to <step>to return a halted feature to an earlier pipeline step, and rebase- or resume-invalidated test-suite and build-review proofs are now mechanically re-verified instead of halting the pipeline on a stale proof. (implementation PR #1741). bin/installgains a--channelflag andAI_CONDUCTOR_CHANNELenvironment variable to explicitly select the first-run update channel, with clear guidance when it silently falls back to stable. (implementation PR #1720).- build_review now treats infrastructure failures (mechanical rubric faults) as their own recoverable lane, with a bounded automatic retry and a new
conduct-ts build-review record-reduced-coverageaction for operators to record a reduced-coverage decision when retries are exhausted. (implementation PR #1734). - The daemon's IN-PROGRESS dashboard now shows live active-subagent counts and running input/output token totals for in-flight steps, sourced from a new throttled provider-stream observation and configurable via the new
provider_stream.min_interval_mssetting. (implementation PR #1742).
Changed
- Story artifacts under
.docs/stories/are now corrected in place during DECIDE instead of accumulating additive amendment blocks; all other accepted DECIDE artifacts keep the additive-amendment rule. (implementation PR #1539). - Acceptance-spec authoring is disposition-driven — criteria proven at a lower layer complete the acceptance_specs gate with grounded disposition records instead of fabricated specs, and BUILD prefers applicable local patterns. (implementation PR #1678).
- The plan skill requires every task to carry a "Done when:" block of falsifiable completion checks, closing unbounded outcome language at DECIDE so completion review has a definite stopping point. (implementation PR #1764).
- build_review rubric results are engine-stamped from findings-only provider payloads, with honest per-field rejection diagnosis and a behavioral (execute-the-parser) contract drift guard, ending the invalid-provider-result rejection loop. (implementation PR #1748).
- The
rootCausebuild-review rubric now ships disabled by default; enable it explicitly withbuild_review.rubrics.rootCause.enabled: true. (implementation PR #1816).
Fixed
- The FINISH publication retry budget no longer exhausts on verified transitions, and new halt reasons name a stuck PR-state check or an unmoved publication transition. (implementation PR #1565).
- The tautology rubric's counterfactual checkout now resolves the conductor's dependency installation, so changed suites execute instead of aborting at import. (implementation PR #1699).
- The opt-in Tautology build-review rubric now classifies counterfactual test runs by process exit code instead of parsing Vitest/pytest-shaped output, so it returns a real verdict on RSpec and other frameworks instead of always reporting an infrastructure failure. (implementation PR #1705).
conduct --update/bin/updatenow detect the real installed release from the checkout instead of misreporting an off-tag tagged-channel install as permanently up to date. (implementation PR #1578).- Fixed a stale manual-test verdict discovered at FINISH becoming unroutable, so the daemon no longer stalls on that SHIP validator instead of routing it back for retry. (implementation PR #1673).
- Provider token telemetry now reports fresh input consistently across Claude and Codex, with cached prompt volume shown separately in daemon logs and feature usage totals. (implementation PR #1689).
- Codex usage-cap exhaustion is now reported as usage exhaustion with an hour-scale wait instead of a misleading 300-second rate-limit retry loop. (implementation PR #1704).
- build_review finding identities are content-anchored, so re-worded findings can no longer escape their accepted dispositions across review laps. (implementation PR #1696).
- Self-host containment refuses itself on hosts where the wrap would deny a provider its own nested sandbox, instead of wrapping a dispatch that cannot write any file. (implementation PR #1719).
- A concurrent provider process's plugin lock markers no longer halt a self-host build. (implementation PR #1722).
- Shipped-record timing now reaches the
measuredstate instead of getting stuck atpartial/unavailable, and apartialstate's## Timeblock now names its downgrade reason. (implementation PR #1727). - A build_review pass no longer resets the cumulative kickback convergence cap by itself; the cap is credited back only when a rebase actually invalidates a judged build_review, closing a loophole that let build_review cycle indefinitely across passes. (implementation PR #1728).
- build_review findings anchored to dot-leading repository paths such as
.docs/plans/are accepted, so a scope violation in a plan file can be reported instead of looping until retries are exhausted. (implementation PR #1756). - build_review Scope no longer flags the engine's own appended remediation plan tasks as an unauthorized out-of-plan change. (implementation PR #1757).
- A Codex dispatch whose shell tool calls could not be spawned is now reported as a failed dispatch instead of a success, so a build_review rubric that could not read the diff raises an infrastructure failure rather than a hollow PASS. (implementation PR #1758).
- build_review rubrics no longer treat engine-appended remediation tasks as findings or as authority, so remediation laps converge instead of expanding their own judgement surface each round. (implementation PR #1761).
- Installed harness skills now stay explicit-only unless same-session workflow composition requires implicit invocation. (implementation PR #1762).
- Operators can accept build_review findings on every rubric; identity round-trip no longer rejects the engine's own output. (implementation PR #1770).
- FINISH no longer halts on genuine PR prose when the authoring pass leaves the engine's body-floor marker in place; a floored body is now recognized by its content, not by marker presence alone. (implementation PR #1773).
- prd-audit reads FR verdicts only from the report's Verdict Table section, so a prior-cycle history table can no longer block an all-ALIGNED audit. (implementation PR #1780).
conduct-ts plan-protected-targetsnow catches a protected-artifact reference named in a task's prose even when that task declares a**Files:**set, and.docs/decisions/is now a protected directory alongside architecture, plans, specs, and stories. (implementation PR #1750).- A conductor run no longer halts with a phantom "Expected to match before persist conductor transition" conflict after the engine skips a track- or tier-skipped gate mid-run. (implementation PR #1793).
- build_review no longer reuses a stale prior-lap FAIL verdict as the current lap's outcome, and mechanical-fault HALTs and
build-review findingsoutput now name the last recorded infrastructure fault. (implementation PR #1801). conductnow works when invoked through the~/.local/binsymlink created bybin/install, instead of failing to locate its own harness directory. (implementation PR #1814).
v0.103.0
Added
- Plan tasks can now declare a
Preserves:behavior clause, and build-review's Completeness gate recognizes when a preserved behavior's coverage survives a relocation or refactor instead of flagging it as a regression. (implementation PR #1656). - Daemon-managed provider sessions can no longer invoke conduct-ts orchestration commands; only session-sanctioned worker subcommands are permitted. (implementation PR #1599).
Changed
- The build_review tautology rubric is now opt-in (
build_review.rubrics.tautology.enabled: true) because its scoped-run preflight only recognizes Vitest/pytest output; on other frameworks it could never return a verdict and deadlocked the gate. (implementation PR #1684).
Fixed
- Remediation tasks now reach the builder on daemon features whose specs were authored externally — the plan-append no longer silently no-ops when engine-state.json is absent. (implementation PR #1671).
- The engine now commits its own remediation plan appends, and build completion refuses to pass while an engine-appended rem-* task heading is missing from the plan. (implementation PR #1675).
- Seal rotation accepts the engine's own recorded remediation-task plan appends instead of halting for a manual reseal. (implementation PR #1679).
- build_review completeness judges remediation-authored repairs against their own task text instead of regenerating scope from them each lap. (implementation PR #1681).
v0.102.0
Added
- A plan can declare that a task replicates an existing source file under a rename map, and BUILD mechanically copies and verifies that replication with a new blocking
build_reviewgate instead of relying on an LLM to reproduce it from scratch. (implementation PR #1451). - Add a
conduct-ts build-tailrollup command and pipeline closeout-event telemetry that decompose build-step timing into task execution, remediation, and closeout, surfaced in the terminal UI and OTel export. (implementation PR #1395). - Operators can now run
conduct-ts resealfrom an interactive terminal to re-fingerprint approved, amended protected DECIDE artifacts, with every reseal and refusal recorded in the audit trail. (implementation PR #1454). - conflict-check and coherence-check now detect and block contradictions between approved ADRs and stories before they reach BUILD, with the ADR corpus scoped by the new
conflict_check.adr_corpusconfig key (defaultchange_set, orrepo_wideto compare against every approved decision). (implementation PR #1453). - build_review's grader now sees and judges operator-authorized protected-artifact reseal rationale instead of grading the diff blind to it. (implementation PR #1556).
- Split
build_reviewinto four independently configurable rubrics (tautology, scope, root cause, completeness) that run concurrently, retire the wiring rubric, and let an operator accept one specific finding with a mandatory rationale viaconduct-ts build-review findingsandacceptso it no longer blocks later review laps. (implementation PR #1563).
Changed
- Unattended runs now use the daemon while foreground auto mode exits with migration guidance. (implementation PR #1509).
- The daemon dashboard now shows dispatch elapsed time, last test outcome, and acceptance-spec RED-evidence status for in-progress features, and acceptance-spec RED evidence records failing-test identity and provenance so remediations can be verified or explicitly waived. (implementation PR #1485).
- build_review rubric branches now carry weighted default efforts (rootCause medium, others high); explicit rubric or step config overrides. (implementation PR #1591).
- The tdd skill now scopes RED cycles away from removals and requires a pre-diff failure check before a task commits a new or changed test. (implementation PR #1633).
Deprecated
- Deprecates the per-task Wired-into contract layer in favor of the build_review wiring rubric while retaining compatibility for existing plan annotations and wiring_check state. (implementation PR #1517).
Removed
- build_review no longer judges wiring reachability. The gate scores four rubric items (tautology, scope, root cause, completeness); the retired
wiringverdict and config keys are ignored rather than rejected, so in-flight verdicts and existing consumer configs keep working. (implementation PR #1577).
Fixed
- Spec PRs opened into a repository that requires a release disposition now always declare one, so its required release-metadata check no longer fails on every landed spec. (implementation PR #1448).
Wired-into:inert waivers acceptTask N(a task in the same plan) and bare#Nissue refs, and an unrecognized ref is now rejected at authoring time instead of failing the build as a missing file. (implementation PR #1469).- Self-host builds no longer halt when a concurrent Codex session opens or closes a thread, which wrote transient lock files into the fingerprinted provider-state directory. (implementation PR #1470).
- A rebase that only pulls in unrelated base-branch changes no longer discards the build_review verdict, cutting the harness's largest LLM cost; the feature's own code or tests still re-open it. (implementation PR #1473).
- The daemon repairs a feature's retained PR after a transient HALT instead of leaving it stuck as an unrecoverable "needs-remediation" placeholder. (implementation PR #1468).
- Finish no longer halts with "release metadata is malformed or non-canonical" when its publication spans more than one dispatch. (implementation PR #1499).
- The prd_audit gate now fails closed when the audit report is missing a verdict row for any functional requirement in the feature's approved PRD, instead of passing on a partial report. (implementation PR #1457).
- Protected artifact seal rotation no longer refuses when a base-ahead path was never touched by the feature, avoiding false "seal rebaseline refused" halts. (implementation PR #1498).
conduct-ts scoped-runnow runs intest_suite.working_directoryand rebases project-root-relative selectors onto it, so scoped test runs work in monorepo layouts. (implementation PR #1520).- A rebase no longer halts for human review when a feature commit is dropped because the base already landed an equivalent change. (implementation PR #1544).
- build_review now terminates in an operator-visible halt after a bounded number of cumulative kickbacks instead of churning indefinitely, and no longer grades removal maintenance as a tautology. (implementation PR #1526).
- build_review no longer flags diff-required fixture relocations as Tautology failures when a production hunk in the same diff forces the path move. (implementation PR #1546).
- build_review no longer flags diff-required fixture relocations as Tautology failures when a production hunk in the same diff forces the path move. (implementation PR #1549).
- Rebase-invalidated test failures are now durably matched to the base advance that caused them via the event spine, so build_review reliably receives repair context instead of losing it to an overwritten transient signal. (implementation PR #1543).
- Self-host daemon runs now sweep and reclaim leaked provider scratch homes left behind by abruptly interrupted attempts, instead of leaving them to accumulate. (implementation PR #1495).
- Build reviews now give actionable retry feedback when a PASS verdict contradicts its rubric flags. (implementation PR #1560).
- Fix build reviews that repeatedly halt after a clean pass because rubric booleans are inverted. (implementation PR #1562).
- PRD audit now resolves date-prefixed PRD filenames for the active feature. (implementation PR #1566).
- Spec and implementation PRs no longer fail the release-metadata check when their issue-linking trailer follows a trailing Migration section. (implementation PR #1569).
- Fresh installs and updates now follow a stable branch that advances only after a release is fully published. (implementation PR #1561).
remediatenow routes a build_review gap tobuildwhen an existing approved-plan task already admits the fix, instead of incorrectly halting for a needless re-plan. (implementation PR #1571).- An operator-authorized protected-artifact reseal now survives later seal rebaselining, instead of halting the feature every time its base branch moves. (implementation PR #1576).
- build_review's tautology preflight counts a reverted-tree test collection failure as RED instead of infrastructure, and rubric sessions' JSON verdicts parse through prose or markdown wrapping. (implementation PR #1593).
- build_review rubric sessions receive the changed-file list and hunk line ranges instead of the full embedded diff, reading the worktree directly — cutting per-branch prompt size ~95% and stabilizing grader output on large diffs. (implementation PR #1595).
- Provider sessions are always fresh — the adapters replace any supplied session id and strip resume flags unconditionally, so no call path can resume a prior conversation. (implementation PR #1596).
- build_review tautology prompts are bounded by construction (path manifest + closed run verdict instead of embedded file contents and raw test output), fixing prompt-too-long failures on large features. (implementation PR #1600).
- build_review rubric dispatches enforce the judged-result schema with a bounded in-d...
v0.101.1
Fixed
- A legacy-JSON seeding failure no longer disables the harness update check when the schema-owned conductor config is readable. (implementation PR #1464).
v0.101.0
Added
conduct-ts validate-wired-into <plan>resolves a plan's Wired-into: anchors at DECIDE time through the same machinery BUILD-time completion verification uses, and exits 1 on any anchor that cannot resolve. (implementation PR #1190).- conflict-check detects oscillating requirements — pairs that are individually satisfiable but mutually exclusive, which send work round a non-terminating kickback loop. coherence-check gains a
failverdict and a consistency pass for cross-layer contradictions that coverage alone cannot express. (implementation PR #1394). - The release-metadata check now labels each PR with the semver impact it declares (semver:major/minor/patch), so merge order is readable from the PR list. (implementation PR #1405).
- Worktrees now get a preventive pre-commit hook that blocks commits touching another feature's sealed DECIDE artifacts (
.docs/architecture,.docs/decisions,.docs/plans,.docs/specs,.docs/stories) during BUILD/SHIP, and remediation gaps that target a sealed artifact are now redirected to the owning DECIDE step. (implementation PR #1396). - The daemon, spec authoring, and spec landing now refuse to dispatch or land work whose ADRs are not declared APPROVED or SUPERSEDED, closing the gap where a merged spec with an unapproved architecture decision could still reach build. (implementation PR #1384).
- Spec and implementation PRs now inherit the originating issue's
priority:criticality labels. (implementation PR #1440).
Changed
- The validation-phase fan-out now defaults to 4, so the SHIP-tail group (manual test, PRD audit, as-built architecture review) dispatches in a single wave instead of two. (implementation PR #1413).
Fixed
- The land-time coherence gate now checks that stories tie out to the PRD in both directions — a story citing a requirement the PRD never declares, or citing none at all, is reported as a gap. Plan
Wired-into:anchors are now validated as a blocking gate at every tier instead of by an optional command, and the plan skill judges the residue the matcher cannot decide: an anchor into a file the same task creates, or one whose match is an import, comment, or re-export rather than a call. (implementation PR #1401). - A pull request whose
## Migrationsection is its last section no longer fails its own release gate at finish; the release metadata block below it is parsed correctly instead of being swallowed into the migration content. (implementation PR #1404). - A pull request whose
## Migrationsection sits above its release metadata block, or is followed by a trailer, no longer fails the finish-time release gate as non-canonical, and the merged body no longer duplicates the Migration section. (implementation PR #1406). conduct-ts shipped-recordreports success on stdout, so a successful ship no longer appears in the daemon log tagged[error]. (implementation PR #1407).- build_review now treats prior wiring_check gate instructions recorded in the event ledger as evidence when grading scope, so plan hunks that implement a gate-mandated fix are no longer wrongly flagged as out-of-plan work. (implementation PR #1452).
- Update checks now use the schema-owned conductor configuration and automatically migrate supported legacy preferences. (implementation PR #1412).
- The remediate step may now amend a plan in response to a blocking gate; the build step still may not. (implementation PR #1459).
- wiring_check no longer treats a Markdown or .docs/ mention of a symbol as a production reference, so a task declared inert is no longer flagged stale against its own plan document. (implementation PR #1460).
Security
- Intake filing now redacts credentials and operator-identifying paths from the issue title and body before publishing, and reports what it replaced. (implementation PR #1420).
- The daemon's DECIDE-entry grant is now stored outside the feature worktree so a build agent can no longer authorize its own DECIDE entry, and the
planstep can never be granted at all. (implementation PR #1403).
v0.100.0
Added
- Plan authoring and land now block a task that would hand BUILD a mutation to another feature's sealed DECIDE artifact, routing that amendment back to its owning DECIDE step instead. (implementation PR #1303).
- The self-host version freeze can track a branch's current VERSION via "latest" or "branch:" instead of only a pinned semver string. (implementation PR #1058).
- The daemon dashboard now shows a NEVER-STARTED section for worktrees with no pipeline state, distinguishes retained-worktree exclusion reasons (open/closed/unknown PR state, missing PR reference), and prints a concrete remedy for every excluded row. (implementation PR #1338).
- The daemon now refuses to re-dispatch a build after a wiring-check kickback that would repeat an already-observed no-op build cycle, halting immediately instead of burning a turn, and annotates build completion log lines with the observed tree-hash movement. (implementation PR #1350).
Changed
- The rebase skill now verifies replay intent against source and upstream commits, halts on the first semantic ambiguity, and reconciles every rebased commit against that captured intent before reporting success. (implementation PR #1292).
- Claude autonomous and interactive defaults now use Opus instead of Fable while retaining Fable for escalation and availability fallback. (implementation PR #1327).
Fixed
- The wiring gate now accepts inert waiver refs wrapped in Markdown inline code, instead of failing with "inert waiver ref not found" for a file that exists. (implementation PR #1276).
- The bot-owned release PR now opens on repositories that squash- or rebase-merge; its candidate range no longer required merge commits. (implementation PR #1278).
- A self-host build no longer halts when the ship-start push fails but its draft PR is already open — the release gate resolves the retained PR from the feature branch, and still halts fail-closed when no open PR exists. (implementation PR #1290).
- The remediation planner no longer falsely halts for a human architecture decision when a gap is conforming implementation, test, or documentation drift that preserves already-approved architecture — it now routes that work straight to build, and the daemon halts with a clear reason instead of silently dispatching a taskless build route. (implementation PR #1283).
- Build repair now re-verifies every non-skipped BUILD member after a kickback instead of trusting a stale on-disk verdict, so a passing member the gate check reads as unsatisfied no longer blocks the run in a terminal-less park. (implementation PR #1291).
- A SHIP step that runs before finish now reads a presentable implementation PR instead of a reused needs-remediation halt placeholder, so a feature that halted earlier no longer stalls its pre-finish ship gates. (implementation PR #1304).
- FINISH now converges deterministically through an engine-owned publication coordinator instead of spending minutes retrying non-deterministic provider judgment. (implementation PR #1295).
- The SHIP draft PR now opens with the real PR body template; a placeholder-body finish refusal re-dispatches finish for a body rewrite instead of re-running the build; /remediate gains a publication disposition that never amends the plan; and the rebase is no longer skipped on textual mergeability when the base has moved in code or was resolved from a degraded local fallback. (implementation PR #1316).
- The daemon no longer silently discards an out-of-process edit to conduct-state.json when it writes state next; conflicting field writes are now detected and surfaced instead of one side winning silently. (implementation PR #1305).
- Restored the engine build after a semantic merge conflict left two undefined
writeStatecalls on the finish publication-defect path, which halted every newly dispatched feature at setup. (implementation PR #1320). - FINISH no longer halts a feature that legitimately skipped a SHIP step; a skipped step now counts as resolved evidence rather than missing evidence. (implementation PR #1322).
- FINISH now records the publication outcome instead of exhausting its retry budget — the coordinator was handing finish-record a fail-closed no-op instead of the real gh/git runners. (implementation PR #1323).
- FINISH now publishes the rebased feature branch with a lease-protected push instead of halting on a rejected plain push, and halts immediately — with an explanation — on a publication reason no retry could ever satisfy, rather than spending the whole retry budget first. (implementation PR #1326).
- The daemon no longer halts a build when a branch has simply fallen behind a protected artifact it never touched, and halt reasons for protected-artifact violations now name the specific cause (uncommitted edit, feature-authored change, or undeterminable provenance) with a recovery step. (implementation PR #1321).
bin/migratenow correctly and safely applies every pending migration when a consumer project jumps multiple releases at once, instead of only the latest. (implementation PR #1325).- The build step no longer reports itself complete or routes an exhausted build through commit-movement while the worktree has uncommitted paths — the halt now names the dirty paths so they can be committed or discarded first. (implementation PR #1312).
- The wiring reachability gate no longer flags test-only exported helpers as unwired production surface. (implementation PR #1334).
- Merged specs whose plan uses an inline-code, linked, or annotated
**Stories:**reference now resolve and dispatch instead of being silently dropped;conduct-ts daemon statuslists blocked specs with reason and remedy; and a## Migrationsection that ends a PR body no longer parses as malformed release metadata. (implementation PR #1337). - The /stories skill now requires machine-parseable story IDs, preserving per-story validation, plan coverage, and coherence checks. (implementation PR #1341).
- FINISH now re-enters immediately after a verified publication transition instead of spending step retry budget or escalation, bounded to 12 transitions per FINISH entry with a dedicated needs-human halt if publication still hasn't converged. (implementation PR #1345).
- The live daemon E2E build step now dispatches a real, credentialed agent and the engine halts deterministically with a clear diagnostic when a step's slash command is unresolved by the provider's skill catalog, instead of the step silently reporting an artifactless success. (implementation PR #1319).
v0.99.20
Two months of work between v0.99.17 (2026-05-02) and the move to bot-owned release
pull requests. Entries are condensed by theme; per-change detail is in the linked
issues and in git log v0.99.17..v0.99.20.
Added
- Multi-provider execution: a built-in
codexprovider alongside Claude, per-step provider routing (llm_provideras a scalar or an ordered array, with per-step overrides), and provider-aware model, effort and retry-escalation defaults (#902, #927, #1089). - tmux-supervised daemons with a full operator surface:
conduct-ts daemon start|stop|restart|connect|debug|status|logs, pause/resume, park/unpark, a startup state dashboard, an install-freshness guard, and auto-restart when the running engine goes stale (#215, #307, #486). - Rate-limit episode coordination: session- and usage-limit signals are classified as rate limiting beyond HTTP 429, provider reset times are parsed into absolute deadlines, and workers share one abortable, jittered wait instead of each backing off independently. New feature dispatch pauses while an episode is active and halted features are re-kicked when it clears.
- Retry-as-escalation: a step retry now escalates effort and then model tier rather than repeating an identical attempt, deep-step retry budgets drop from 5 to 3, and unavailable models fall back down a ladder instead of halting (#186, #188).
wiring_check— a gating step betweenbuild_reviewandmanual_testthat verifies every production surface the feature declares is actually reachable from a production entry point.build_review— a fresh-session judged gate at the build seam whose completeness rubric is the authoritative build-completion signal, with deterministic BUILD/REMEDIATE routing on FAIL (#757, #817, #984).- Per-feature cost, token and wall-clock accounting: shipped records carry
## Costand## Timeblocks and anengine_versionstamp,conduct-ts kpirenderscost=/time=/engine=per feature, and an opt-in OpenTelemetry exporter publishes conductor run traces (#537, #1090, #1196). - GitHub-issues intake for the engineer, with bidirectional write-back, issue-to-PR linkage and auto-close on merge, required priority/size/dependency labels at every capture surface, and a host-wide
conduct-ts brain start|stop|statusintake loop with desktop notifications (#490, #695). - Owner gating: a daemon builds only the merged specs it owns, resolving a machine-scoped operator identity and failing closed when no identity resolves, with write-back onto the gated spec's PR and originating issue (#184).
- Engineer worktree isolation and full DECIDE authoring — each idea is authored, landed and handed off inside its own worktree, running the complete explore → complexity → prd → architecture → stories → conflict-check → plan set (#142).
- Self-host guardrails for the harness building itself: a live-checkout boundary guard, a write-fence sandbox, a daemon-owned build-auth token separate from operator OAuth, a version-freeze approval gate, and a release gate that accepts a committed waiver (#174, #261, #354, #380).
- SHIP automation: the implementation PR is opened as a draft at the start of SHIP, halt PRs are rehabilitated at finish, irrecoverable halts leave a labeled
needs-remediationdraft PR, a mergeable sweep auto-resolves conflicts, andci_watchdrives bounded automatic fixes for red ships (#271, #274, #439, #499). - Parallel SHIP validation:
manual_test,prd_auditandarchitecture_review_as_builtfan out as a concurrent group in auto-mode runs, bounded by a newvalidation_concurrencyconfig key (#469). - Autonomous gap remediation — a blocking
prd_audit, as-built review or finish gate is routed through/remediateand repaired in place instead of halting for a human (#115). - New skills:
verify-claims(a cross-cutting correctness and assumption gate),intake,daemon-triage,rebaseandcoherence-check, plus anoperator_onlySKILL.md frontmatter field for skills invoked from outside a run. - Mermaid rendering at the architecture approval gates, and
conduct render-diagrams --checkas an authoring-time syntax gate that fails on a broken diagram (#810). - The
docs/tree is published as a browsable GitHub Pages site with a landing page and site-wide navigation (#1224). - CI runs the harness integrity suite, the conductor build and vitest suite,
tsc --noEmit, ESLint and ShellCheck on every pull request; documentation-only PRs skip the heavy jobs (#789, #802, #1040). - New
conduct-tssurface:kpi,finish-record,overlap-scan,build-auth-status,halt-issues sweep,evidence,memory setup, an--effort <level>global override mirroring--model, and--interactivefor conversational steps (#1027). bin/update— a standalone self-update and channel CLI, invoked automatically as a one-shot subprocess atconduct-tsstartup.- Deterministic project-config scaffolding for new and existing repositories, auto-discovered skill linking into both
~/.claude/skills/and~/.agents/skills/, and abin/install --allow-worktree-rootoverride for the worktree-root guard (#1169).
Changed
- The CLI is verb-first: the inline pipeline is
conduct-ts inline "<feature>"and the daemon isconduct-ts daemon …, replacing the bare-argument and--daemonforms. - Every step dispatch starts a fresh provider session, including within-step retries; Codex declares no session-resume capability, so each Codex dispatch is a cold start carrying its context through committed artifacts and the retry prompt (#325, #1110).
- Model selection is right-sized across the funnel and generated into HARNESS.md from
model-table-metadata.tsrather than hand-edited, with front-of-funnel DECIDE steps and recovery steps defaulting to Fable (#190). manual_testis a gating step whose enforcement is locked, with an S-tier SKIP sentinel that satisfies downstream prerequisites; judged gate verdicts are re-validated against current code state rather than accepted on record (#367, #817).- Post-rebase gate re-verification is delta-aware:
build_review,wiring_check,manual_test,prd_auditandarchitecture_review_as_builtverdicts are preserved rather than re-run when the rebase did not affect them (#655). - Daemon scheduling honors GitHub issue dependencies and priority labels, including a new
criticalband abovehigh; the root checkout fast-forwards on each idle poll and feature worktrees are cut fromorigin/<default>. - Daemon output is timestamped, colorized and transition-only, attributes each completed dispatch to the provider and model that ran it, and keeps routine skip notices behind
daemon_verbose: true. .memory/is a symlink to a shared canonical store rather than a tracked in-project directory; ADRs are namedadr-YYYY-MM-DD-<kebab-slug>.mdinstead of sequentially numbered; run-specific SHIP artifacts moved from tracked.docs/to gitignored.pipeline/.- Configuration resolution deep-merges project
.ai-conductor/config.ymlover~/.ai-conductor/config.ymlat every entry point, so user-level values survive keys a project omits (#1031, #1199). - README reference material moved into
docs/, leaving a landing page that points at the documentation tree.
Fixed
- Daemon reliability across the run lifecycle: halts carry a machine-readable
needs-human/mechanicalclass so the re-kick sweep cannot wipe one needing a human, a step-heartbeat watchdog detects stalls, a no-verdict backstop records where the run stopped, park markers anchor to the main repository roo...
v0.99.17
Fixed
- conduct-ts: fixed
Fatal: __dirname is not definedcrash on startup.src/conductor/src/index.tsreferenced the CommonJS-only__dirnameglobal insidereadHarnessVersion(), but the bundle is ESM (tsupformat: ['esm'],shims: false), so the binary aborted before the CLI could parse args. Derived__dirnamefromimport.meta.urlusing the same pattern already insrc/conductor/src/engine/plugin-manifest.ts. - conduct-ts: SHIP-phase steps no longer silently mark a feature complete when pipeline exits mid-implementation. The conductor now stamps each invocation with
state.session_started_atand themanual_test,retro, andfinishcompletion predicates require fresh, feature-scoped evidence:manual_testrequires.docs/manual-test-results.mdwith no| FAILrows AND mtime >=session_started_at(previously had no completion gate at all — any clean REPL exit marked itdone)retrorequires a.docs/retros/*-<slug>.mdfile matching the currentfeature_descslug AND fresh mtime; falls back to "any retro fresh in this session" when slug is unavailable (previously matched any file under.docs/retros/, including stale prior-feature retros)finishrequires a fresh.pipeline/finish-choicemarker (mtime >=session_started_at); forchoice="pr", additionally requiresstate.pr_urlto be set; the conductor sweeps stale.pipeline/finish-choicefrom prior sessions onConductor.run()entry (previously the marker could survive across sessions andstate.pr_urlalone could pass the gate)
- conduct-ts:
buildcompletion predicate now fails when.pipeline/halt-user-input-requiredis present, even with all-completetask-status.json. A halt marker that survives to gate-check time means a true halt that bypassed the conductor's stall handler — the predicate now treats it as a build failure so the cascade through SHIP-phase steps doesn't fire. - conduct-ts: when auto-resume detects an "already complete" feature, the conductor now re-verifies the SHIP-phase predicates and offers a recovery prompt (roll back
feature_statusand resume at the first failing step, or keep state as-is). Self-heals worktrees that hit the prior false-completion bug. - skills/pipeline/SKILL.md: documents the "User-requested exit during a run" contract — when the user asks to "exit to harness", "stop and continue later", etc., the skill MUST write
.pipeline/halt-user-input-requiredbefore exiting and MUST NOT mark unfinished tasks ascompleted/skipped. Without the marker the conductor readstask-status.json, sees nothing in flight, and concludes the build step is done — silently cascading through SHIP to mark the feature complete while the user's actual blocker is still open. - skills/manual-test/SKILL.md: instructs the skill to save results to
.docs/manual-test-results.md(in addition to displaying in chat) so the conductor's completion gate can verify them. The previous "do NOT write to a file" wording contradicted what the bash conductor was already injecting at dispatch time. - CHANGELOG.md: fixed unclosed backtick in the preamble that the release workflow had to step around.
Added
- conduct-ts: new
--diagnoseCLI flag — non-mutating diagnostic that loads state for the named (or current) feature, re-verifies the SHIP-phase predicates, and prints any inconsistencies. Exits 0 when state is consistent, 1 when state is marked complete but evidence is missing. - conduct-ts: new
feature_completeevent payload fields (featureDesc,sessionStartedAt) and a multi-line bg-green completion banner inTerminalRendererso a finished run is impossible to read as "stopped processing without error" — the previous single-line green render could be missed in a long pipeline run. - conduct-ts: new
state.session_started_at?: number(epoch ms) — set on everyConductor.run()entry, used by SHIP-phase freshness checks. Purely additive; old state files deserialize fine. - conduct-ts: new
complete-verifier.tsmodule withverifyCompleteState(worktreePath)andformatGapReport(...)helpers, shared between auto-resume's recovery path and the--diagnoseflag. UIRendererinterface (handle(event): Promise<void>+stop()) insrc/conductor/src/ui/types.ts— new plugin contract for UI renderersTerminalRendererclass insrc/conductor/src/ui/terminal-renderer.tsimplementingUIRenderer(replaces thecreateRendererfactory function; backward-compat factory retained increate-renderer.ts)dispatchRenderers(renderers, event)insrc/conductor/src/ui/dispatch.ts— fan-out viaPromise.allSettled, renderer degradation (one throw doesn't kill others), re-emitsrenderer_errorevent to survivorsrenderer_errorevent type insrc/conductor/src/types/events.ts— carriesrendererNameanderrorstringRecordingRenderertest double intest/ui/recording-renderer.ts— records events, supportsdelayMsandthrowErrorinjectionregisterBuiltins()now accepts optionalTerminalRendererOptionsand registersTerminalRendererasui_renderer:terminal_rendereralongside the existingTerminalSubscriber- New test files:
test/ui/terminal-renderer.test.ts(TerminalRenderer class),test/ui/dispatch.test.ts(dispatch + degradation + slow-renderer + dup-renderer scenarios) RecorderProviderreference LLM provider plugin atplugins/recorder-provider/— logs everyinvoke()andinvokeInteractive()call as a JSONL line to a configurable path, returns a canned response, creates parent directories on first write, and throwsRecorderProviderErroron write failure- Unit tests for RecorderProvider (11 tests) covering JSONL format, canned response, parent-dir creation, error handling, concurrent writes, and invokeInteractive
- Integration tests for RecorderProvider flow (7 tests) covering happy path, misspelled kind rejection, missing plugin dir, version-incompatible manifest, and empty prompt
- RecorderProvider installs through the plugin loader with zero edits to
src/conductor/src/index.ts when?: stringfield onStepConfig— conditional step skip evaluated before dispatchparallel?: ParallelBranch[]field onStepConfig— concurrent step groups viaPromise.allParallelBranchtype:{ name, skill?, model?, effort?, advisory? }— discriminated from skill steps (mutual exclusion)evaluateWhen(expression, state)insrc/engine/when-expression.ts— five grammar forms:tier == L,tier in [M, L],phase == BUILD,${key} == value,A && BvalidateWhenSyntax(expression)— config-load-time syntax check, returns error string or null- Four new
ConductorEventvariants:when_skip,parallel_started,parallel_completed,parallel_failure - Conductor evaluates
when:before dispatching each step; emitswhen_skipwhen false - Conductor fans out
parallel:branches viaPromise.all; writes synthetic state keys<group>__<branch>toconduct-state.json - Gating branch failure (
advisory: false, the default) → group fails → downstream blocked - Advisory branch failure (
advisory: true) → logged viaparallel_failureevent, group continues to success when:on a parallel group → all synthetic keys set to"skipped"when expression is false- Terminal renderer handles
when_skip,parallel_started,parallel_completed,parallel_failureevents increate-renderer.ts - Config validator (
engine/config.ts) validateswhen:syntax andparallel:structure at config-load time - 59 new tests across
when-expression.test.ts,when-parallel.test.ts,when-parallel-renderer.test.ts - Feature 3.2: json-stdout-subscriber plugin — emits ConductorEvents as newline-delimited JSON to stdout; selectable via
ui_renderer: json-stdoutin config. Each line includes all original event fields plus atsISO timestamp. handle() before start() is a no-op (no crash). Plugin discovered automatically by the plugin loader — no changes tosrc/conductor/src/index.tsrequired. - Feature 4.1: EventPersister — every ConductorEvent persisted with timestamp to
.pipeline/events.jsonl(newline-delimited JSON, replayable). Subscribes to event bus as a listener; zero changes to emission sites inconductor.tsorstep-runners.ts. - Feature 4.1:
conduct --reportsubcommand — reads.pipeline/events.jsonland renders step durations (sorted descending), retry hotspots (with failed-step annotation), and token spend tables. Read-only; does not start a Claude session. - Feature 4.1: Optional
tokenUsagefield onInvokeResult— backwards-compatible;ClaudeProviderparses from Claude CLIstream-jsonoutput;RecorderProvidersynthesizes deterministic counts ({ input: 10, output: 5 }) for stable test fixtures. Report gracefully omits token rows when field is absent. - Plugin manifest schema (
plugin.yml) withkind,name,entrypoint,harness_version,capabilities?fields PluginKindenum:llm_provider | ui_renderer | step | hook | visualizer- Five typed error classes:
PluginManifestError,PluginVersionError,PluginLoadError,PluginNotFoundError,PluginRegistryError validateManifest()with required-field, kind-enum, name-format (/^[a-z0-9-]+$/), and semver compatibility checksloadManifestFromFile()wrapping YAML parse and I/O errors with file path contextPluginRegistryclass:register<K>(),get<T>(),list(),markInitialized()with initialization guarddiscoverPlugins(): scans global (~/.ai-conductor/plugins/) and project-local (.ai-conductor/plugins/) directories; project-local shadows global with debug logregisterBuiltins():ClaudeProvider→llm_provider:claude,TerminalSubscriber→ui_renderer:terminalsrc/index.tsrefactored: no longer hardcodesnew ClaudeProvider()ornew TerminalSubscriber()— both retrieved from registry- Integration tests: default-fallback (blank config → claude provider), EchoProvider E2E (external plugin discovery a...