Commit 34f75f0
feat(engine): Engine::reconcile_commit and probe_manual_drift (#70)
* feat(state): extend ReconciliationEntry with adopted/skipped vectors
Adds two `Vec<String>` fields to `pearlite_state::ReconciliationEntry`,
both `#[serde(default)]` so pre-ADR `[[reconciliations]]` rows
deserialize cleanly with empty vectors. Tightens `package_count`'s
docstring to name it as the audit denominator (ADR-0014 §9).
Backfills three round-trip tests in `reconciliation::tests`:
- legacy entry without decision vectors deserializes with empty `[]`,
- populated decision vectors round-trip through TOML,
- AdoptAll with empty `skipped` round-trips.
Schema change is additive; the `ReconciliationAction` unit-variant
enum (AdoptAll / Interactive / Skipped) keeps its existing TOML
representation per ADR-0014 §7.
Refs: ADR-0014, PRD §7.3
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(engine): Engine::reconcile_commit and probe_manual_drift
Adds the write-side of reconcile (ADR-0014, M4 W1):
- `Engine::reconcile_commit(state_path, &decisions, threshold)` —
probes via the existing adapter, classifies Manual drift through
`pearlite_diff::{classify_pacman, classify_cargo}` against an empty
declared `PackageSet` (the fresh-import path from PRD §11), enforces
the `Some(N)` threshold defensively, unions adopted names into
`state.adopted.{pacman,cargo}`, and appends one `[[reconciliations]]`
row with a fresh `Uuid::now_v7()`. Atomic write via `StateStore`;
`state.last_modified` set, `state.last_apply` deliberately untouched.
- `Engine::probe_manual_drift(state_path)` — read-only helper that
returns the merged sorted-deduplicated Manual list. The CLI uses it
to drive the threshold pre-check and per-package prompt loop without
reaching into the engine's private probe accessor.
- `ReconcileDecisions` enum (`AdoptAll` / `Selective { adopt }`) and
`ReconcileCommitOutcome` mirror the ADR §7 split: enum carries the
*policy*, vectors carry the *decisions*.
- `ReconcileCommitError::{Probe, State, ThresholdExceeded}` for the
three failure modes; threshold variant carries `count` and
`threshold` so the CLI can surface ADR-0014 §2 wording verbatim.
Module doc now describes both reconcile entry points (read-only
import + commit). Ten new tests in `reconcile::tests`: AdoptAll happy
path, Selective partition, threshold exceeded refuses without
writing, threshold boundary allowed, `state.managed` packages stay
classified as Forgotten (not adopted), existing `state.adopted`
preserved on union, no-Manual-drift still records empty entry,
probe / state-read failure propagation, fresh `plan_id` per call.
Refs: ADR-0014, PRD §11
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 0c79680 commit 34f75f0
3 files changed
Lines changed: 610 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
175 | 204 | | |
176 | 205 | | |
177 | 206 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
25 | | - | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
0 commit comments