kcode-k1-audio-classification-coordinator 0.2.5

Lifecycle coordinator for K1 audio classification
Documentation
# Audio classification coordinator

## Public API

`FragmentId`, `FragmentStatus`, `OverallState`, and `SpeakerLabelV1` are re-exported from projection; `TxId` is re-exported from transaction ordering.
`pub struct AudioClassificationCoordinator;`
- `open(root: &Path, ordering: Arc<K1TxnOrdering>, peering: Arc<K1Peering>, objects: Arc<K1Objects>, analyzer: Analyzer) -> Result<Self, String>`
- `status(&self, fragment_id: FragmentId) -> Result<Option<FragmentStatus>, String>`; `validate_labels(&self, fragment_id: FragmentId, labels: &[SpeakerLabelV1]) -> Result<TxId, String>`
- `ensure_healthy(&self) -> Result<(), String>`; `fault_ambiguous_commitment(&self)`
- `shutdown(&self)`; Drop also performs bounded shutdown.
Feature `testkit` re-exports `EngineFuture` and `FragmentEngine` and adds:
- `with_engine(root: &Path, ordering: Arc<K1TxnOrdering>, peering: Arc<K1Peering>, objects: Arc<K1Objects>, engine: Arc<dyn FragmentEngine>) -> Result<Self, String>`
- `inject_errors(&self, fragment_id: FragmentId, errors: Vec<String>) -> Result<(), String>`
- `startup_replay_count(root: &Path) -> Result<u64, String>`
`SpeakerLabelV1.person_id` remains the typed `Option<PersonId>` and labels are delegated without identity decisions.

## Lifecycle, health, concurrency, and performance

Opening restores Projection and its exact durable cursor before constructing the projection-aware resume engine. Registration replay applies canonical callbacks to Projection and counts them without driver, provider, attempt, or transaction effects. After replay, every ID in the unbounded projection `work_list` is admitted; no interrupted fragment is rewritten to Failed, and the concrete engine rereads `work_list` and `resume_plan` when its lane runs.
Live Start admits work; Started, Pending, and AlreadyActive are successful. Abort and LabelsCommitted cancel the addressed generation, while None cancels terminal projected generations.
Projection, callback-effect, driver, and reorganization failures permanently fault health and shut down work without retry. Reorganization clears projection and requires reopen; status and label validation reject unhealthy use. Shutdown is idempotent and does not wait for provider return.
The health lock protects only one diagnostic and spans no dependency or provider work; the driver owns bounded independent lanes and FIFO overflow, so independent coordinators share no lane.
The coordinator accepts an existing Analyzer and constructs no provider. It owns no projection fold/cache format, resume runner, driver lane, transaction codec, retry, network, daemon, UI, deployment, or adoption behavior.