Ctrl K
ComunidadGuías…

docs/v0.24-validation.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# v0.24 validation

## v0.24.0 release preparation

The release source baseline is `0597565259d50ba28b1935bab23f5e668366c506`.
The release changes update the package version to `0.24.0`, contributor credits,
and release documentation. They do not change production behavior.

On 2026-09-16, the operator explicitly accepted the documented limitations for
v0.24.0, including incorrect streaming counters (#818), optimized-test fixture
gaps (#819), and unmeasured HEIF memory and worker-budget risks (#761/#817).
This accepts those risks for this release; it does not establish a memory
ceiling, fix the counters, or turn unavailable checks into passes. The operator
separately approved tagging and publication after reviewing the release diff
and local validation results.

The recorded full-test run on the clean source baseline passed 21 phases and
counted 7,348 tests, including authenticated live tests. One live HEIF test was
skipped with operator approval because its fixture was unavailable. The run
started and ended at the same commit. This evidence predates the version change;
it is not a new full-test run on the release commit.

Fresh checks on the v0.24.0 release worktree:

| Check | Result |
| --- | --- |
| `cargo check` | Passed |
| `just gate` | Passed: 3,618 all-feature and 3,390 no-default-feature tests; ignored tests were not run |
| `cargo run -- --version` | Reported `kei 0.24.0` |
| `KEI_FULL_TEST_EXPECT_VERSION=0.24.0 just test packaging` | Passed: optimized build, host archive extraction, exact version, help, and example-config smoke |
| Release binary help | Confirmed sync repair options, one-shot restrictions, and session-reset scope |
| Release-note extraction | Passed the workflow's extraction and link checks; Cargo manifest and lockfile matched |
| Fuzz lockfile | Updated the path dependency to 0.24.0; locked offline Cargo metadata resolution passed |

The gate includes schema migration and date round-trip tests, file-backed
reconciliation retry/steady-state tests, and binary checks for repair help,
the maintenance example, and report schema `"3"`. The merged-range coherence
pass checked schema keys, unknown-content reservations, date readers/writers,
report consumers, and CLI/distribution references. It found no new blocker in
those inspected invariants; the accepted limitations above remain.

No fresh authenticated live run, complete optimized test suite, or representative
large-HEIF memory campaign was performed for the version-only changes. Published
archives, GHCR images, and Homebrew still need verification after tagging.

## Historical documentation audit

The sections below retain the documentation audit's original scope and results.
Statements about pending work describe that audit, not the later release
preparation above.

This is documentation evidence for [#744](https://github.com/rhoopr/kei/issues/744),
not release clearance. The large-file memory checkpoint is unavailable, wiki
publication is pending, and remaining release defects need explicit disposition.

## Provenance

- Source baseline: `28fac209fa619554cb3f7cd8c0364fabddbf3ab3`, after #810, #811,
  and #812 merged. The documentation diff changes CLI help, not sync behavior.
- Package/binary version: `0.23.2-dev`; Rust edition 2024, MSRV 1.91.
- Builds checked: default `xmp` debug and release; gate tests and lints also
  cover all features and no default features.
- SQLite schema: 25. Report schema: string `"3"`. The issue's assumed schema-23
  baseline is superseded; v24/v25 reservations must be included in upgrade text.
- Wiki base: `7c313a065fa84870b7cad19a1bf3226b13d88162`. Local edits are not yet
  published. Record the resulting wiki commit when publication is approved.
- Latest release and Homebrew formula checked on 2026-09-16: `v0.23.1`.
  Docker tag contents and final v0.24 artifacts were not claimed as verified.

Checks apply to this documentation diff over the source baseline, not to the
older heads quoted in the issue. Record the merged repository commit and wiki
commit in #744 before closing it. Revalidate if the candidate changes.

## Acceptance coverage

Numbers below identify checklist items in their order in the September 14 issue
body. They map evidence; they do not mark unpublished work complete.

| Items | Claims and documentation | Production owners / evidence |
| --- | --- | --- |
| 1-6 | Schema 25, migration limits, backup/restore, fractional timestamps, distinct compatibility identifiers: [Upgrade](v0.24-upgrade.md) and wiki State Tracking | `src/state/schema.rs`, `src/state/db.rs`, `src/report.rs`; schema migration and date round-trip tests |
| 7-14 | Eligibility versus path changes, retained copies, safe leaves/parents, same-path handling, sidecars, content-specific reservations, blocking failures and retry: [Maintenance](backup-maintenance.md#change-the-backup-layout) | `src/sync_cycle.rs`, `src/download/mod.rs`, `src/download/file.rs`, `src/state/db.rs`; file-backed reconciliation transition tests |
| 15-21 | Automatic capture versus opt-in outputs, 500-asset batches, one-shot repairs, rejected combinations, capture dates: [Maintenance](backup-maintenance.md), [Metadata](metadata.md), README links and CLI help | `src/config.rs`, `src/cli.rs`, `src/sync_loop.rs`, `src/download/metadata_rewrite.rs`; binary help and executable guide example tests |
| 22-30 | HEIF item-map writer, safe refusals, guarded publication, sidecar ownership, feature support, membership/rendition facts, GPS provenance, no output sweep/container repair: [Metadata](metadata.md) | `src/download/heif.rs`, `src/download/metadata.rs`, `src/download/metadata_rewrite.rs`, `src/icloud/photos/`; fixture, ownership, fingerprint, and source-provenance tests. Large-file memory evidence remains unavailable |
| 31-35 | Headless exits, wait/resume, supervisor distinctions, session reset and password sources: wiki Authentication/Login/Service/Watch/Docker/Synology/Reset/Password/Credentials | `src/lib.rs`, `src/auth/`, `src/commands/reset.rs`, `src/commands/password.rs`, `src/service/`; offline binary auth/password tests and service renderer tests |
| 36-41 | Targeted retries, policy exclusions, checkpoint gates, distinct hashes, owned cleanup, report v3/capture fields and counter limits: [Maintenance](backup-maintenance.md#interpret-recovery-evidence), wiki State Tracking/Retry/Reports/Download Pipeline | `src/download/retry.rs`, `src/sync_cycle.rs`, `src/download/finalize.rs`, `src/cycle_reporter.rs`, `src/report.rs`; retry, checkpoint, report, and cleanup tests |
| 42-45 | Memory checkpoint, validation categories, defect scope: [limitations](v0.24-upgrade.md#known-limitations) and dispositions below | Representative large fixtures unavailable; no OOM threshold or safe memory ceiling established. Deferred fixes remain in their owning issues |
| 46-51 | Whole release-range narrative, frozen roadmap, examples/distribution, diagnostics, navigation: CHANGELOG, roadmap, example config, wiki Home/sidebar and affected options | Compared `v0.23.1..28fac20`, source/help/config, Docker files, service renderers, release metadata and Homebrew formula. Historical migration/release pages remain historical |
| 52-56 | Publication, final SHAs, sample, claim mapping and release dispositions | This record and the publishing PR. Wiki/issue publication, final artifact checks and release approval remain pending |

The reconciliation evidence includes
`path_reconciliation_preserves_mtime_and_metadata_across_retry`,
`path_reconciliation_equivalent_roots_preserve_files_across_retry`,
`path_reconciliation_live_resolution_change_preserves_rendition_ownership`, and
`path_reconciliation_reservations_survive_lookup_and_state_failure`. These use
production paths and durable state; documentation checks alone do not replace
them. No new sync/state behavior is introduced by this documentation change.

## Commands and checks

Local results on the documentation branch, checked 2026-09-16:

| Check | Result |
| --- | --- |
| `cargo check` | Passed |
| `cargo build --locked --release` | Passed |
| `just gate` | Passed: static checks, all-feature and no-default-feature offline suites; live tests remained ignored |
| `just test scenario config-docs` | Passed: 3 focused checks |
| `cargo test --test behavioral repair_help_explains_one_shot_scope_and_datetime_requirement` | Passed |
| `cargo test --test behavioral maintenance_refresh_example_accepts_complete_sweep` | Passed |
| `cargo test --test behavioral sync_report_json_offline_binary_boundary_writes_current_schema` | Passed |
| `cargo fmt --all --check` | Passed |
| `cargo clippy --all-targets --all-features -- -D warnings` | Passed |
| `docker compose config --quiet` and `bash -n docker/entrypoint.sh` | Passed; parser/syntax checks, not a container runtime test |

Binary probes use isolated temporary configuration and a fake account, not the
operator's credentials. Help was checked for sync, service run, password,
session reset, verify, reconcile, config show, install, and login. Config examples
were parsed with `config show`. Changed TOML fences and local documentation link
targets were also checked, including 39 changed/new wiki pages. The full-refresh
guide example also reaches the real runtime selection guards through the existing debug-only offline report
seam; no authentication or provider download is claimed by that probe.

Debug and release help matched the revised source. Release probes also confirmed
the service repair refusals and capture-repair requirements.

Expected repair refusals were checked separately: standalone capture repair and
conflicting refresh/recent, truncated/refresh, and truncated/dry-run flags exit 2.
Service refresh, service truncated repair, and capture repair without the
datetime writer exit 1 before authentication. The help regression test covers
both the sync and shared service help. The guide must omit `albums` and
`smart_folders` keys entirely: explicit `all`/`none` still reject full refresh.

Docker's shipped CMD is `service run --config /config/config.toml`. Generated
systemd, launchd, and Windows arguments use `service run --config <path>`.
Systemd uses `Restart=on-failure`; launchd uses a NetworkState KeepAlive condition;
Windows configures SCM failure actions. Compose uses `restart: unless-stopped`,
which also restarts after terminal-auth exit 4. These policies do not establish
backup completeness. Linux renderer tests run in the gate; macOS/Windows runtime
installation is not claimed on this Linux host.

The Homebrew formula installs `kei` into `bin` from versioned release archives.
Final tags, checksums, Docker platforms, and package versions belong to the release
owner. Source/default-feature builds do not validate every published package.

`KEI_REQUEST_DUMP_DIR` remains a debug-assertion-only diagnostic. Its Photos
bodies are unredacted and require private local storage and manual redaction
before sharing. Release builds without debug assertions do not provide it.
It is not a redacted doctor bundle.

## Serializer-backed sample

The following is a projection of the actual JSON emitted through the existing
`KEI_UNSTABLE_FAKE_SYNC_REPORT_FOR_TESTS=1` debug-only binary seam. Only unrelated
fields were omitted. This is a deterministic offline fixture, not corrected
transfer totals or evidence that #818 is fixed. The same schema path is checked
by `sync_report_json_offline_binary_boundary_writes_current_schema`.

```json
{
  "version": "3",
  "stats": {
    "metadata_capture_refreshed": 0,
    "metadata_capture_failures": 0,
    "metadata_capture_remaining": 0
  }
}
```

`metadata_capture_revision` is absent in this sample, because it is unavailable.
When present it is an integer, not the report version. Capture counters remain
integers, including zero. The unit serialization test checks an integer revision;
this binary fixture checks its omission. The sample does not stand in for an
authenticated sync or a large-file test.

## Unavailable, excluded, and unresolved checks

- Representative constrained-memory HEIC/HEIF/AVIF campaign: unavailable. The
  repository fixtures are only about 234-257 KiB for HEIC and 305 bytes for AVIF.
  The operator confirmed no large fixtures are available and excluded fixture
  acquisition work from this task. Small-fixture correctness tests do not prove
  a memory ceiling. No memory limit, measured peak, or ordinary-concurrency OOM
  disposition is claimed. #761/#817 remain release-checkpoint work.
- Authenticated iCloud/live tests: not run. Required account/album/media fixtures
  and #763's fixture migration remain separate. Ignored live tests are not passes.
- Complete optimized suite: not run; #819 remains open. The release binary build
  and help checks do not establish an optimized-suite pass or clear its fixtures.
- macOS, Windows, FreeBSD, real NAS/service installation, and published Docker/
  archive smoke tests: not run here. Parser and source checks are identified
  separately above; final artifact checks remain with the release owner.
- #770, #773, #799, #803, #817, #818, #761, #763, and #819 remained open at the
  live issue recheck. Their operator impacts are recorded in the upgrade guide.
  No production fix, priority change, or implicit release waiver is part of #744.
- Wiki and issue publication: pending approval. Publish wiki links to these guides
  after the repository documentation is available on main. Record both published
  SHAs in #744; do not close it based on repository changes alone.
- Release disposition: not granted. The operator's decision to defer fixture work
  is a scope decision, not acceptance of an unmeasured memory risk. Obtain explicit
  release decisions for remaining defects and checks before release.