sheets-diff 2.4.0

Structured diff engine for Microsoft Excel .xlsx workbooks
Documentation
# `sheets-diff` RFCs

Design records for significant decisions in this project. Lifecycle, folder
semantics, numbering, and status conventions are defined by
[RFC 000](./done/000-rfc-lifecycle-policy.md).

This project uses the **5-folder variant**:

| Folder | State | Meaning |
|---|---|---|
| [`proposed/`]./proposed/ | Proposed | Open for review. Do not start implementation. |
| [`accepted/`]./accepted/ | Accepted | Design settled; implementation may start. |
| [`done/`]./done/ | Implemented | Shipped. Kept permanently as a historical record. |
| [`archive/`]./archive/ | Withdrawn / Superseded | Not pursued, or replaced by a later RFC. Kept permanently. |

The folder is the source of truth for an RFC's state; the `Status` field inside
each file mirrors it and is updated in the same commit that moves the file.
This index is updated in that commit too.

## Numbering: two series

This project has **two RFC series**, both numbered from 001, because the v1.2
stabilization line and the v2 redesign were planned independently. RFC 000
forbids renumbering an RFC that has already been referenced, and both series
have been — so they are separated by directory instead:

- A **bare number** (`RFC-014`) means the **v2 series**, in `done/` or
  `accepted/`. This is what `src/` comments and `CHANGELOG.md` refer to.
- The **v1.2 series** lives in [`done/1.2/`]./done/1.2/ and is referenced as
  `RFC 1.2/003`. Commit messages predating 2.0.0 that say "RFC 003" mean this
  series.

Numbers are assigned at creation, are never reused, and never change when a
file moves. The v2 series continues from 036; 033 is
[reconstructed](./done/033-public-model-lexicon.md) — see the restoration
notes below.

Implementation companion documents live under
[`handoffs/NNN-slug/`](./handoffs/). They have no lifecycle state of their own —
it is inherited from the matching RFC — and they must not redefine it. The
active roadmap is [`ROADMAP.md`](../ROADMAP.md).

## Proposed

_None._

## Accepted

Design settled; implementation may start.

| ID | Title | Note | Handoffs |
|----|-------|------|----------|
| 022 | [Styles and Formatting Diff Policy]./accepted/022-styles-and-formatting-diff-policy.md | `FormatCompareMode` rejects every non-`Ignore` mode; no style diff layer exists. Blocked upstream — calamine keeps `mod formats` private through 0.36. ||
| 025 | [Deterministic Parallel Execution]./accepted/025-deterministic-parallel-execution.md | Implementation removed 2026-08-15 (it never compiled, and parallelised the wrong phase); design retained and amended with a re-introduction gate. | [yes]./handoffs/025-deterministic-parallel-execution/ — done |
| 035 | [Resource Safety and Supply-Chain Governance]./accepted/035-resource-safety-and-supply-chain-governance.md | Accepted 2026-08-16. Bounded-by-default policy, supply-chain gating, threat model. Roadmap M2 — delivered in 2.3.0. | [yes]./handoffs/035-resource-safety-and-supply-chain-governance/ — done |
| 036 | [Coverage Obligation and the Fixture Matrix]./accepted/036-coverage-obligation-and-the-fixture-matrix.md | Accepted 2026-08-16. Defines *covered* as an assertion property, fixes eleven scenarios, and obliges behaviour changes to arrive with an assertion. Roadmap M3. | [yes]./handoffs/030-extended-fixture-generators-and-corpus-management/**live** |

## Implemented

### Cross-cutting

| ID | Title | Shipped in |
|----|-------|------------|
| 000 | [RFC lifecycle policy]./done/000-rfc-lifecycle-policy.md | 1.2.0 |

### v2 series

| ID | Title |
|----|-------|
| 001 | [v2 Release Scope and Compatibility Line]./done/001-v2-release-scope-and-compatibility-line.md |
| 002 | [Public API and Module Layout]./done/002-public-api-and-module-layout.md |
| 003 | [Workbook Result Data Model]./done/003-workbook-result-data-model.md |
| 004 | [Input Sources and Workbook Opening]./done/004-input-sources-and-workbook-opening.md |
| 005 | [Error, Diagnostics, and Warning Model]./done/005-error-diagnostics-and-warning-model.md |
| 006 | [Diff Options and Configuration Builder]./done/006-diff-options-and-configuration-builder.md |
| 007 | [Typed Cell Values and Normalization]./done/007-typed-cell-values-and-normalization.md |
| 008 | [Address, Coordinate, and Range Model]./done/008-address-coordinate-range-model.md |
| 009 | [Sheet Matching, Renames, and Moves]./done/009-sheet-matching-renames-and-moves.md |
| 010 | [Cell Comparison Engine and Change Policy]./done/010-cell-comparison-engine-and-change-policy.md |
| 011 | [Row/Column Alignment Optional Quality Mode]./done/011-row-column-alignment-optional-quality-mode.md |
| 012 | [Progress, Cancellation, and Resource Bounds]./done/012-progress-cancellation-and-resource-bounds.md |
| 013 | [Output Formatters, CLI, and Exit Codes]./done/013-output-formatters-cli-and-exit-codes.md |
| 014 | [Serde Feature and Stable Report Schema]./done/014-serde-feature-and-stable-report-schema.md |
| 015 | [Test Fixtures, Regression, and Property Testing]./done/015-test-fixtures-regression-and-property-testing.md |
| 016 | [Security, Privacy, and No-Side-Effects Policy]./done/016-security-privacy-and-no-side-effects-policy.md |
| 017 | [v1 to v2 Migration Guide and Adapter]./done/017-v1-to-v2-migration-guide-and-adapter.md |
| 018 | [Formula Comparison Semantics]./done/018-formula-comparison-semantics.md |
| 019 | [Numeric, Date, and Tolerance Comparison Policies]./done/019-numeric-date-and-tolerance-comparison-policies.md |
| 020 | [Display Formatting and Number-Format Capture]./done/020-display-formatting-and-number-format-capture.md |
| 021 | [Workbook Metadata and Defined-Name Diffs]./done/021-workbook-metadata-and-defined-name-diffs.md |
| 023 | [Non-Cell Workbook Objects and Unsupported Feature Reporting]./done/023-non-cell-workbook-objects-and-unsupported-features.md |
| 024 | [Large Workbook Memory Strategy]./done/024-large-workbook-memory-strategy.md |
| 026 | [Feature Flags and Dependency Governance]./done/026-feature-flags-and-dependency-governance.md |
| 027 | [Benchmark and Performance Governance]./done/027-benchmark-and-performance-governance.md |
| 028 | [Fuzzing and Hostile-Input Hardening]./done/028-fuzzing-and-hostile-input-hardening.md |
| 029 | [GUI Integration View Adapters]./done/029-gui-integration-view-adapters.md |
| 030 | [Extended Fixture Generators and Corpus Management]./done/030-extended-fixture-generators-and-corpus-management.md |
| 031 | [API Stability, SemVer, and Deprecation Policy After v2]./done/031-api-stability-semver-and-deprecation-policy.md |
| 032 | [Unsupported, Corrupt, and Encrypted Workbook Handling]./done/032-unsupported-corrupt-and-encrypted-workbook-handling.md |
| 033 | [Public Model Lexicon]./done/033-public-model-lexicon.md*reconstructed 2026-08-16 from 20 `src/` citations; original lost before this repository existed. Not the original text — see the file's §0 for method and the one section (§7) it could not recover.* |
| 034 | [Build Assurance and Fixture Integrity]./done/034-build-assurance-and-fixture-integrity.md*implemented M1, 2026-08-15; no release* |

### v1.2 series

| ID | Title | Shipped in |
|----|-------|------------|
| 1.2/001 | [v1.2 Stabilization Scope and Compatibility Policy]./done/1.2/001-v1.2-stabilization-scope.md | 1.2.0 |
| 1.2/002 | [Fallible Diff Construction and Error Model]./done/1.2/002-fallible-diff-construction-error-model.md | 1.2.0 |
| 1.2/003 | [Full Excel A1 Addressing and Stable Cell Ordering]./done/1.2/003-full-excel-a1-addressing-and-ordering.md | 1.2.0 |
| 1.2/004 | [Reader-Based and Path-Safe Input Constructors]./done/1.2/004-reader-based-and-path-safe-input-constructors.md | 1.2.0 |
| 1.2/005 | [Library Diagnostics Without Stdout Writes]./done/1.2/005-library-diagnostics-without-stdout-writes.md | 1.2.0 |
| 1.2/006 | [Regression Fixture and CI Hardening]./done/1.2/006-regression-fixture-and-ci-hardening.md | 1.2.0 |

## Archive

_None._

---

## Restoration notes (2026-08-15)

This directory was rebuilt on 2026-08-15. Commit `a06fb0e` ("v2 first release")
had deleted the entire `rfcs/` tree, including RFC 000 and the six implemented
v1.2 RFCs.

**Provenance.** The v1.2 series and RFC 000 were recovered from git history at
`a06fb0e^`. The v2 series was imported from the planning package that had never
been committed to this repository; its files were renamed from `RFC-NNN-slug.md`
to the `NNN-slug.md` form RFC 000 requires, and release-tag references were
normalised to drop the `v` prefix.

**Status verification is complete (2026-08-16).** The thirty v2-series RFCs
that carried a blanket "not individually re-verified" caveat (M3 track B,
record-integrity Handoff 02) were each checked against the code, not just
re-read. Two had already been moved to `accepted/` before this pass (022,
025). Of the remaining thirty, **seventeen confirmed cleanly** (001–006,
008–012, 018, 026, 028–031) and **thirteen proved partially implemented** —
more than the three known going in, as the handoff's own risk note expected.
Each of the thirteen names its specific gap in its own `Status` field rather
than a vague "mostly"; none warranted a move out of `done/`, since in every
case the main design decision shipped and only part of it did not (RFC 000's
"Granularity of transitions"). The thirteen: 007 (three of nine `CellValue`
variants unreachable through any `.xlsx` input), 013 (exit code 3 specified,
never emitted), 014 (`Serialize` ships, `Deserialize` does not), 015 (CLI exit
codes untested), 016 (no static `println!`/`dbg!` check, no path-privacy
test), 017 (migration guide has no JSON section, no adapter example, untested
code blocks), 019 (`Duration` values unreachable), 020 (`CellNumberFormat`
always `None`), 021 (`WorkbookMetadataMode` never built, despite code
comments claiming otherwise; defined-name/visibility diffing untested), 023
(`WorkbookObjectChange` always empty), 024 (cancellation granularity
overclaimed — polled per-sheet, not per-chunk), 027 (no v1.2-vs-v2 benchmark
docs), 032 (encrypted-workbook path untested). These are M4 candidates, not
fixed here — this pass changed no code, per the handoff's non-change scope.

**RFC-033 was reconstructed 2026-08-16** (M3 track B, record-integrity
Handoff 01). It had been missing: `src/` cites it as normative at 20 sites
(this note previously said 11 — undercounted; corrected by direct `grep`)
across seven files, named as the canonical lexicon for the public model in
`model.rs`, `options.rs`, `error.rs`, `diff.rs`, `normalize.rs`, `meta.rs`,
and `lib.rs`. No copy existed in this repository, in git history, or in the
planning package. [`033-public-model-lexicon.md`](./done/033-public-model-lexicon.md)
recovers it from those 20 citations against the code as it stands at
2.3.0 — it is explicitly not the original text, and says so in its own
Status field and §0. One section, §7, has no citation evidence anywhere
and is recorded as unrecoverable rather than guessed at. Reconstruction
also surfaced (or re-surfaced, cross-referenced to where each was first
found) four divergences between what the citations imply and what the
code does — see the RFC's §13.