Files
rustfs/docs/architecture/migration-progress.md
T

3424 lines
198 KiB
Markdown

# Architecture Migration Progress
Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` blocked.
## Current Context
- Issue: [`rustfs/backlog#660`](https://github.com/rustfs/backlog/issues/660)
- Branch: `overtrue/arch-embedded-builder-shell`
- Baseline: completed `R-042/R-043`.
- Stacked on: embedded handle boundary slice.
- PR type for this branch: `pure-move`
- Runtime behavior changes: none.
- Rust code changes: keep the public embedded builder as a thin shell over
crate-only startup arguments and move embedded port probing behind
startup-server helpers.
- CI/script changes: make the unsafe allowance checker avoid a local
`pipefail` false positive after `rg -q` matches nearby `SAFETY:` comments.
- Docs changes: record the embedded builder shell slices.
## Phase 0 Tasks
- [x] `G-001` Refresh `main` and record baseline.
- Acceptance: baseline commit, title, and branch are recorded.
- Verification: `git fetch upstream main --prune`; `git rev-parse upstream/main`.
- [x] `G-002` Create migration tracking checklist.
- Acceptance: this file records task state, context, verification, and handoff.
- [x] `G-003` Classify PR types.
- Acceptance: [`crate-boundaries.md`](crate-boundaries.md) lists exactly one
allowed PR type per PR.
- [x] `G-004` Define re-export and wrapper policy.
- Acceptance: temporary compatibility code must use `RUSTFS_COMPAT_TODO`.
- [x] `G-005` Add dependency direction guard.
- Acceptance: `./scripts/check_layer_dependencies.sh` passes on current
`upstream/main` while still rejecting new unaccepted layer dependencies.
- [x] `G-006` Create migration loss-prevention checks.
- Completed slices: add a mechanical admin route matrix guard from
[`admin-route-action-snapshot.md`](admin-route-action-snapshot.md) and
`rustfs/src/admin/route_registration_test.rs`; add migration rules for
public storage-api re-export coverage, ECStore compatibility-test coverage,
and a production-source guard against reintroducing the removed
`StorageAPI` aggregate facade identifier; add a source guard that rejects
direct `rustfs_ecstore` imports outside compatibility boundary modules; add
a guard that rejects production compatibility boundaries hiding unused
ECStore re-exports.
- Acceptance: architecture migration rules fail if the public storage-api
contract re-export surface drifts or if ECStore compile-time compatibility
tests for the remaining storage-admin and namespace-lock contracts are
removed.
- [x] `G-007` Create startup timeline table.
- Acceptance: [`startup-timeline.md`](startup-timeline.md) records current
binary startup order, side effects, fatal boundaries, and readiness stages.
- [x] `G-008` Capture admin route-action snapshot.
- Acceptance: [`admin-route-action-snapshot.md`](admin-route-action-snapshot.md)
records current route families, handler ownership, authorization actions,
public exceptions, table-catalog routes, and `/minio/admin` compatibility
alias behavior.
- [x] `G-009` Enforce pre-push three-expert review.
- Acceptance: [`crate-boundaries.md`](crate-boundaries.md) requires
quality/architecture, migration-preservation, and testing/verification review
before push.
- [x] `G-010` Inventory `ecstore::config::{Config, KV, KVS}` consumers.
- Acceptance:
[`ecstore-config-consumer-inventory.md`](ecstore-config-consumer-inventory.md)
records the current model definitions, global accessors, persistence helpers,
consumer groups, migration risks, and do-not-change contract.
- [x] `G-011` Inventory scheduler baseline.
- Acceptance:
[`scheduler-baseline.md`](scheduler-baseline.md) records current owners for
request admission, reusable scheduler/backpressure facades, workers, scanner
budget, heal admission, and the Tokio runtime builder.
- Must preserve: no Rust source changes, no scheduler/controller contract
changes, and no runtime behavior changes.
- [x] `G-012` Inventory placement and repair invariants.
- Acceptance:
[`placement-repair-invariants.md`](placement-repair-invariants.md) records
object-to-set hashing, pool/set/disk assignment boundaries, set-aware
readiness and lock quorum, scanner budget, and heal admission preservation
gates.
- Must preserve: no placement, repair, scanner, heal, readiness, lock, or
storage metadata behavior changes.
- [x] `G-013` Inventory profiling and NUMA capabilities.
- Acceptance:
[`profiling-numa-capability-inventory.md`](profiling-numa-capability-inventory.md)
records current CPU/memory profiling, cgroup memory sampling, allocator
backend, eBPF, and NUMA capability support plus no-op fallback invariants.
- Must preserve: no startup, profiling, allocator, runtime, or platform-gate
behavior changes.
## Issue #660 Capability Contract Tasks
- [x] `PR-08/API-013` Add observability snapshot contract.
- Completed slice: add `CapabilityState`, `CapabilityStatus`,
`CapabilitySnapshotError`, `ObservabilitySnapshot`,
`UserspaceProfilingCapability`, `MemorySamplingState`,
`PlatformSupport`, and `ObservabilitySnapshotProvider` to
`rustfs-storage-api`.
- Acceptance: runtime telemetry, userspace profiling, memory sampling, and
platform support states are representable without runtime, ECStore, admin,
profiling, exporter, sidecar, eBPF, or OTEL implementation dependencies.
- Must preserve: no profiling, startup, admin route, exporter, sidecar, eBPF,
OTEL, or runtime behavior changes.
- Verification: storage-api contract tests for unknown, unsupported,
disabled, and supported capability states; focused storage-api check;
migration guard; formatting; diff hygiene; and three-expert review.
- [x] `PR-09/API-014` Add topology capability contract.
- Completed slice: add `TopologySnapshot`, `TopologyCapabilities`,
`TopologyPool`, `TopologySet`, `TopologyDisk`, `TopologyLabels`,
`DiskCapabilities`, and `TopologySnapshotProvider` to
`rustfs-storage-api`.
- Acceptance: pool, set, and disk identity fields plus optional zone, rack,
node, media, NUMA, and additional labels are representable without
`rustfs-ecstore`.
- Must preserve: no ECStore endpoint/set implementation, placement,
membership, NUMA pinning, or runtime behavior changes.
- Verification: storage-api contract tests for missing and additional labels
plus supported, unsupported, unknown, and disabled capability states;
focused storage-api check; migration guard; formatting; diff hygiene; and
three-expert review.
- [x] `PR-05/TEST-SCH-001` Add scheduler preservation tests.
- Completed slice: pin worker over-release clamping, reusable scheduler
default thresholds and priority boundaries, backpressure pipe metadata
reads, and get-object queue snapshot saturation/zero-total semantics.
- Acceptance: current reusable scheduling and admission-facing behavior is
covered before later read-only snapshot extraction.
- Must preserve: scheduler algorithm, queue capacity, threshold defaults,
Tokio runtime settings, request admission, scanner admission, heal
admission, replication admission, and background task admission behavior.
- Verification: focused concurrency tests, focused concurrency check,
migration guard, formatting, diff hygiene, and three-expert review.
- [x] `PR-07/R-015` Add runtime workload class contract.
- Completed slice: add `WorkloadClass`, `AdmissionState`,
`WorkloadAdmissionSnapshot`, `WorkloadAdmissionRegistrySnapshot`, and
`WorkloadAdmissionSnapshotProvider` to `rustfs-concurrency`.
- Acceptance: foreground read, foreground write, metadata, scanner, repair,
and replication workload classes are representable through read-only
admission registry snapshots without ECStore dependency.
- Must preserve: no SchedulerManager decision logic, Tokio worker defaults,
scanner/heal admission behavior, replication admission behavior, cluster
scheduling, placement, membership, or business call-site migration.
- Verification: workload contract unit tests, focused concurrency check,
migration guard, formatting, diff hygiene, and three-expert review.
- [x] `API-055/SCH-001` Expose set-local scheduler admission snapshot.
- Completed slice: implement `WorkloadAdmissionSnapshotProvider` for the
RustFS storage `ConcurrencyManager` and expose foreground-read disk-read
permit usage through a local read-only workload registry snapshot.
- Acceptance: local foreground read admission reports active permit usage,
configured limit, and open/saturated/disabled state without ECStore,
admin-route, cluster, or scheduler mutation dependencies.
- Must preserve: disk-read semaphore acquisition, priority assignment,
buffer sizing, storage media detection, request guards, and queue behavior.
- Verification: storage concurrency tests, focused RustFS library check,
migration guard, formatting, diff hygiene, and three-expert review.
- [x] `API-056/R-016` Wire runtime capability snapshot providers.
- Completed slice: implement `ObservabilitySnapshotProvider` for RustFS
runtime capability state and `TopologySnapshotProvider` for
`EndpointServerPools` topology snapshots.
- Acceptance: observability and endpoint topology snapshots are available
through the storage-api contracts without admin routes, sidecars, ECStore
placement mutation, profiling startup changes, or endpoint behavior changes.
- Must preserve: profiling opt-in behavior, memory and cgroup sampling
behavior, endpoint pool/set/disk assignment, placement, readiness, locks,
and local path privacy.
- Verification: focused runtime capability tests, focused RustFS library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-057/R-017` Expose heal repair admission snapshot.
- Completed slice: implement a RustFS workload admission snapshot provider
that maps existing heal active-task and queue-length counters to the
`Repair` workload class.
- Acceptance: repair admission state is observable through the
`rustfs-concurrency` workload snapshot contract without changing heal
queueing, scheduling, retry, priority merge/drop, or repair behavior.
- Must preserve: heal request admission, queue capacity, scheduler wakeups,
task retry handling, active-task accounting, and repair execution.
- Verification: focused workload admission tests, focused RustFS library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-058/R-018` Expose replication admission snapshot.
- Completed slice: extend the RustFS workload admission provider to map
existing replication worker and site queue counters to the `Replication`
workload class.
- Acceptance: replication admission pressure is observable through the
`rustfs-concurrency` workload snapshot contract without changing
replication queueing, channel capacity, worker resize, MRF, target dispatch,
or resync behavior.
- Must preserve: replication admission, queue channel capacity, worker resize
policy, MRF handling, target dispatch, resync behavior, and queue stats
accounting.
- Verification: focused workload admission tests, focused RustFS library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-059/R-019` Expose RustFS runtime owner admission snapshots.
- Completed slice: extend the RustFS workload admission provider to map
foreground-read disk permit state, scanner active work units, and bucket
metadata runtime initialization into the workload registry.
- Acceptance: RustFS-level workload admission snapshots expose existing
foreground-read, scanner, and metadata owner state without changing
admission, queueing, scanner scheduling, metadata loading, metadata locks,
or object write behavior.
- Must preserve: disk-read semaphore acquisition, scanner cycle scheduling,
bucket metadata initialization and loading, object write paths, request
guards, and queue behavior.
- Verification: focused workload admission tests, focused RustFS library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-060` Remove heal and namespace-lock operation compatibility facades.
- Completed slice: remove the old ECStore `store_api::HealOperations` and
`store_api::NamespaceLocking` compatibility subtraits after ECStore storage
types already implemented the shared `rustfs_storage_api` contracts
directly.
- Acceptance: internal ECStore bounds and compile-time coverage use the
shared storage-api heal and namespace-lock contracts directly, while the
remaining object/list/multipart compatibility bindings stay unchanged for
their active internal consumers.
- Must preserve: heal operation behavior, namespace-lock acquisition,
replication resync locking, rebalance metadata locking, object I/O,
multipart, list, and storage hot paths.
- Verification: focused ECStore contract tests, focused ECStore library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-061` Remove public ECStore object operation compatibility facades.
- Completed slice: remove the old public ECStore `store_api` object, list,
and multipart operation compatibility subtraits, and keep internal generic
bounds on crate-private storage-api contract constraints instead of public
downstream compatibility traits.
- Acceptance: `store_api` no longer exports public operation compatibility
traits, ECStore direct storage-api compile-time coverage includes object,
object-operation, list, multipart, namespace-lock, heal, and admin
contracts, and remaining public `store_api` exports are DTO/reader
compatibility paths only.
- Must preserve: object I/O, list/walk behavior, multipart behavior, config
persistence, tier config migration, rebalance metadata locking, lifecycle
journal handling, replication MRF/resync persistence, and downstream DTO
import compatibility.
- Verification: focused ECStore contract tests, focused ECStore library
check, migration and layer guards, formatting, diff hygiene, risk scan, and
three-expert review.
- [x] `API-062` Establish explicit ECStore object API boundary.
- Completed slice: add `rustfs_ecstore::object_api` as the explicit public
path for ECStore-owned object DTO and reader contracts, then migrate
RustFS, scanner, heal, IAM, Swift, S3 Select, notify, and ECStore
integration-test compatibility aliases away from the legacy public
`store_api` path.
- Acceptance: external compatibility boundary modules no longer reference
`rustfs_ecstore::store_api` for ECStore-owned object DTO and reader
aliases, while `store_api` remains available only as the old internal
implementation module pending final compatibility removal.
- Must preserve: object metadata shape, option defaults, reader/writer
behavior, Swift/scanner/heal/IAM/S3 Select/notify boundary semantics, and
all storage hot paths.
- Verification: focused ECStore/RustFS/downstream compile checks, migration
guard, formatting, diff hygiene, risk scan, and three-expert review.
- [x] `API-063` Make legacy ECStore store API module private.
- Completed slice: remove `rustfs_ecstore::store_api` from the public crate
module surface after external compatibility boundaries moved to
`rustfs_ecstore::object_api`.
- Acceptance: ECStore object DTO and reader compatibility remains available
through `object_api`, integration contract tests consume the new public
path, and migration rules reject restoring `pub mod store_api`.
- Must preserve: internal ECStore object DTO definitions, reader/writer
behavior, storage-api trait bindings, and downstream object/list/multipart
compile-time contracts.
- Verification: focused ECStore contract tests, migration guard, formatting,
diff hygiene, risk scan, and three-expert review.
- [x] `API-064` Retire the ECStore store API module name.
- Completed slice: move ECStore object DTO, reader, and option definitions
from the private `store_api` module into the public `object_api` module,
then migrate ECStore internal imports to `crate::object_api`.
- Acceptance: no ECStore `store_api` module file or directory remains, public
consumers keep using `rustfs_ecstore::object_api`, and migration rules
reject restoring the retired module path.
- Must preserve: object metadata shape, reader/writer behavior, storage-api
contract bindings, object/list/multipart behavior, and downstream public
object API compatibility.
- Verification: focused ECStore compile checks, migration guard, formatting,
diff hygiene, risk scan, and three-expert review.
- [x] `API-065` Use storage-api list contracts inside ECStore.
- Completed slice: migrate ECStore internal list response, walk options, and
walk result bindings to local aliases over the generic `rustfs-storage-api`
contracts, including replication worker trait bounds, while retaining
public `rustfs_ecstore::object_api` aliases for downstream compatibility.
- Acceptance: ECStore implementation modules no longer import list/walk
compatibility aliases from `crate::object_api`, and migration rules reject
reintroducing those internal imports.
- Must preserve: list response shape, walk result item shape, object metadata
shape, storage-api trait bindings, and downstream public object API
compatibility.
- Verification: focused ECStore compile checks, migration guard, formatting,
diff hygiene, risk scan, and three-expert review.
- [x] `API-066` Prune ECStore object API storage aliases.
- Completed slice: remove unused public storage-api passthrough aliases from
ECStore `object_api` for list responses, walk options, walk result items,
and delete-object DTOs, then bind the ECStore contract test directly to the
generic `rustfs-storage-api` contracts.
- Acceptance: ECStore `object_api` no longer exposes storage-api passthrough
aliases, the storage contract test still proves ECStore implements the
storage-api traits with the same associated concrete types, and migration
rules reject restoring the object_api passthrough aliases.
- Must preserve: ECStore-owned object metadata, object options, reader/writer
types, storage-api trait associated type bindings, list/delete/walk response
shapes, and runtime behavior.
- Verification: focused ECStore compile checks, storage contract test,
downstream compile checks, migration and layer guards, formatting, diff
hygiene, risk scan, full pre-commit, and three-expert review.
- [x] `API-067` Guard remaining external ECStore object API aliases.
- Completed slice: add a migration guard that snapshots the exact external
`storage_compat.rs` aliases still allowed to reference
`rustfs_ecstore::object_api::{GetObjectReader,ObjectInfo,ObjectOptions,PutObjReader}`
and rejects new object-api names in compatibility boundaries.
- Acceptance: all remaining external `object_api` references are deliberate
compatibility aliases in `storage_compat.rs` modules, future additions fail
the migration guard, and the API-066 passthrough alias cleanup stays
protected.
- Must preserve: no runtime code changes, all existing compatibility aliases,
object metadata shape, options, and reader/writer ownership.
- Verification: bash syntax check, migration and layer guards, formatting,
diff hygiene, full pre-commit, and three-expert review.
- [x] `API-068` Prune notify ECStore object-info compatibility alias.
- Completed slice: remove notify's private `EcstoreObjectInfo` alias and
ECStore-object conversion implementation, then map ECStore event objects to
`NotifyObjectInfo` inside the RustFS event and operation notification
bridges.
- Acceptance: `crates/notify` no longer references
`rustfs_ecstore::object_api::ObjectInfo`, the remaining object-api alias
allowlist shrinks accordingly, and notify event payload fields keep the
same serialized values.
- Must preserve: live event dispatch behavior, event names, bucket/object
fields, version IDs, metadata, restore-completed timestamps, storage class,
transitioned tier, host/port parsing, and replication request filtering.
- Verification: focused RustFS event conversion test, focused notify/RustFS
compile checks, migration and layer guards, formatting, diff hygiene, full
pre-commit, and three-expert review.
- [x] `API-069` Prune IAM direct ECStore object metadata/options aliases.
- Completed slice: replace IAM config and store `ObjectInfo`/`ObjectOptions`
compatibility aliases with `IamStore` `ObjectOperations` associated types.
- Acceptance: IAM no longer names
`rustfs_ecstore::object_api::{ObjectInfo,ObjectOptions}` directly, the
remaining object-api alias allowlist shrinks by four entries, and IAM config
read/write metadata and lazy-rewrite precondition behavior are unchanged.
- Must preserve: IAM config encryption/decryption, lazy rewrite ETag matching,
list walk item/error typing, metadata return shape, storage preconditions,
system-path failure classification, and notification peer behavior.
- Verification: focused IAM compile/tests, migration and layer guards,
formatting, diff hygiene, full pre-commit, and three-expert review.
- [x] `API-070` Prune consumer direct ECStore object aliases.
- Completed slice: replace scanner, s3select, and Swift
`GetObjectReader`/`ObjectInfo`/`ObjectOptions`/`PutObjReader`
compatibility aliases with concrete store `rustfs_storage_api` associated
types.
- Acceptance: scanner, s3select, and Swift no longer name
`rustfs_ecstore::object_api::{GetObjectReader,ObjectInfo,ObjectOptions,PutObjReader}`
directly, and the remaining object-api alias allowlist shrinks by eleven
entries.
- Must preserve: scanner lifecycle/replication IO bounds and config helpers,
s3select read buffer/object error handling, Swift bucket metadata helpers,
and object reader/writer concrete types exposed through each local
compatibility boundary.
- Verification: focused consumer compile/tests, migration and layer guards,
formatting, diff hygiene, full pre-commit, and three-expert review.
- [x] `API-071` Prune final direct ECStore object aliases.
- Completed slice: replace heal and RustFS storage
`GetObjectReader`/`ObjectInfo`/`ObjectOptions`/`PutObjReader`
compatibility aliases with concrete store `rustfs_storage_api` associated
types.
- Acceptance: no external `storage_compat.rs` module names
`rustfs_ecstore::object_api::{GetObjectReader,ObjectInfo,ObjectOptions,PutObjReader}`
directly, and the external object-api alias allowlist is empty.
- Must preserve: heal object metadata and rewrite reader construction,
RustFS storage object read/write paths, S3 response metadata semantics,
SSE/encryption handling, and storage object option behavior.
- Verification: focused heal/storage compile/tests, migration and layer
guards, formatting, diff hygiene, full pre-commit, and three-expert review.
- [x] `TEST-PRTYPE-001` Check PR type enum consistency.
- Acceptance: `./scripts/check_architecture_migration_rules.sh` parses the
allowed PR types from [`crate-boundaries.md`](crate-boundaries.md) and fails
when `ARCHITECTURE.md` or architecture docs reference an unknown PR type.
- [x] `COMPAT-REG-001` Check temporary compatibility cleanup consistency.
- Acceptance: `./scripts/check_architecture_migration_rules.sh` fails when a
source `RUSTFS_COMPAT_TODO(<task-id>)` marker lacks a cleanup-register entry,
when a register entry lacks a source marker, or when a source marker omits a
removal condition.
## Phase 1a Config Model Tasks
- [x] `CFG-001` Inventory `ecstore::config::{Config, KV, KVS}` consumers.
- Acceptance:
[`ecstore-config-consumer-inventory.md`](ecstore-config-consumer-inventory.md)
records the current definitions, persistence helpers, global accessors,
consumer groups, migration risks, and do-not-change contract.
- [x] `CFG-002` Decide model boundary.
- Acceptance:
[`config-model-boundary-adr.md`](config-model-boundary-adr.md) records
`rustfs-config` as the target package, `server_config` as the future model
module, allowed dependencies, forbidden dependencies, preserved shape, and
extraction verification gates.
- [x] `CFG-003` Move pure model definitions.
- Completed slice: `rustfs/rustfs#3351` moved only `Config`, `KV`, `KVS`,
and default-registration surface into `rustfs-config`; persistence helpers
and global server-config state remain in `ecstore`.
- Must preserve: tuple struct shapes, serde alias behavior, default
application, internal JSON shape, and existing persisted config semantics.
- [x] `CFG-004` Keep and clean up old `ecstore::config::*` compatibility path.
- Completed slice: `rustfs/rustfs#3351` re-exported moved model types and
default-registration surface from `rustfs_ecstore::config` with
`RUSTFS_COMPAT_TODO(CFG-004)` and cleanup-register coverage.
- Cleanup slice: remove the temporary model re-export and smoke test after
CFG-005/CFG-006/CFG-007 migrated all in-repo consumers to
`rustfs_config::server_config`.
- [x] `CFG-005` Migrate external server-config model consumers.
- Current branch: migrate admin handlers, admin services, runtime context,
server audit/event setup, and the audit/notify/targets/iam crates from the
temporary `rustfs_ecstore::config::{Config, KV, KVS}` model path to
`rustfs_config::server_config`.
- Acceptance: external consumers use the model crate for pure config types
while still using ECStore for persistence helpers, global server-config
accessors, storage-class helpers, and startup initialization.
- [x] `CFG-006` Migrate ECStore service/default model consumers.
- Current branch: migrate ECStore config default modules, shared config
helpers, and store accessor signatures to the `rustfs_config` model type
while preserving ECStore-owned persistence and runtime state.
- Acceptance: ECStore internals no longer depend on the old compatibility
model import path except the deliberate compatibility smoke test; the old
public re-export remains available for downstream callers until CFG-004 is
cleaned up.
- [x] `CFG-007` Migrate scanner runtime-config model consumer.
- Current branch: migrate scanner runtime-config parsing and validation from
the temporary `rustfs_ecstore::config::{Config, KVS}` model path to
`rustfs_config::server_config`.
- Acceptance: scanner uses the model crate for pure server-config types while
still using ECStore for the global server-config accessor; scanner defaults,
env overrides, persisted-config validation, cycle scheduling, bitrot-cycle
compatibility, cache timeout, and alert threshold semantics remain
unchanged.
- [x] `CFG-008` Move global server-config accessors.
- Current branch: move `GLOBAL_SERVER_CONFIG`,
`get_global_server_config`, and `set_global_server_config` to
`rustfs_config::server_config`; migrate in-repo runtime consumers to the
new owner.
- Compatibility: keep
`rustfs_ecstore::config::{get_global_server_config,
set_global_server_config}` as a temporary re-export with
`RUSTFS_COMPAT_TODO(CFG-008)`.
- Cleanup slice: remove the temporary accessor re-export after code scans
showed in-repo consumers import accessors from
`rustfs_config::server_config`.
- Acceptance: ECStore still owns `ConfigSys`, config persistence helpers,
storage-class global state, default registration wiring, and startup
initialization; global server-config reads and writes keep the same
`std::sync::RwLock<Option<Config>>` clone semantics.
## Phase 1b Context Foundation Tasks
- [x] `CTX-001` Split AppContext files.
- Current branch: split `rustfs/src/app/context.rs` into `interfaces`,
`handles`, `global`, and `compat` submodules.
- Acceptance: old `crate::app::context::*` imports continue to compile via
re-exports; context-first and global fallback resolver bodies are moved
without semantic changes.
- Must preserve: AppContext construction, default adapters, global singleton
initialization, resolver fallback order, and all consumer import paths.
- Verification: formatting, compile checks, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-002` Add resolver compatibility tests.
- Do: test context-first and global fallback for KMS runtime, bucket
metadata, object store, endpoints, tier config, server config, and buffer
config.
- Acceptance: context wins when present and global fallback works when absent.
- Verification: focused resolver compatibility test, formatting, compile
checks, migration guards, diff hygiene, Rust risk scan, and full
`make pre-commit`.
- [x] `CTX-003` Add IAM deferred recovery readiness test.
- Do: verify IAM degraded recovery can still publish `IamReady` and
`FullReady`.
- Acceptance: boot/lifecycle changes cannot lose deferred readiness
publication.
- Verification: focused IAM recovery test, formatting, compile checks,
migration guards, diff hygiene, Rust risk scan, and full
`make pre-commit`.
- [x] `CTX-004` Migrate app usecase object-store consumers.
- Do: migrate admin, bucket, multipart, and object usecases to resolve the
object store from AppContext first.
- Acceptance: usecase object-store lookups use AppContext when present and
preserve the existing global object-layer fallback when absent.
- Verification: formatting, compile check, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-005` Migrate admin object-store consumers.
- Do: migrate admin handlers, admin services, and admin router helpers to the
shared object-store resolver.
- Acceptance: admin object-store lookups use AppContext when present and
preserve the existing global object-layer fallback when absent.
- Verification: focused resolver test, formatting, compile check, migration
guards, diff hygiene, Rust risk scan, and full `make pre-commit`.
- [x] `CTX-006` Migrate ECFS object-store consumers.
- Do: migrate S3 ECFS object operations to the shared object-store resolver.
- Acceptance: ECFS object-store lookups use AppContext when present and
preserve the existing global object-layer fallback when absent.
- Must preserve: S3 object/bucket API behavior, object-lock/tagging/metadata
semantics, and existing storage error paths.
- Verification: formatting, compile check, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-007` Migrate admin ZIP object-store consumers.
- Do: migrate admin object ZIP download object-store lookups to the shared
object-store resolver.
- Acceptance: admin ZIP object-store lookups use AppContext when present and
preserve the existing global object-layer fallback when absent.
- Must preserve: admin download authorization/preflight behavior, ZIP listing
and streaming behavior, and existing storage error paths.
- Verification: formatting, compile check, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-008` Migrate standalone crate object-store consumers.
- Do: add an ECStore-owned resolver hook for AppContext-first object-store
lookup and migrate Swift, S3 Select, scanner, notify, and observability
object-store consumers to that resolver.
- Acceptance: standalone crates can prefer the AppContext-owned object store
without depending on the `rustfs` application crate and preserve the
existing global object-layer fallback.
- Must preserve: Swift protocol behavior, S3 Select object reads, scanner
cache/scan behavior, notification config persistence, observability stats
collection, and existing storage error paths.
- Verification: formatting, compile checks, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-009` Migrate server/storage infra object-store consumers.
- Do: migrate server readiness/module-switch and storage access, ecfs
extension, and node RPC object-store lookups to the ECStore-owned resolver.
- Acceptance: server/storage infra consumers prefer the AppContext-owned
object store after context initialization and preserve the existing global
object-layer fallback.
- Must preserve: readiness reporting, module-switch config persistence,
storage access authorization checks, ecfs extension validation, node RPC
metadata/storage-info/rebalance/tier reload behavior, and existing storage
error paths.
- Verification: formatting, compile checks, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-010` Migrate ECStore internal object-store consumers.
- Do: migrate ECStore internal/background object-store lookups to the
ECStore-owned resolver.
- Acceptance: ECStore metrics realtime, notification, tier config save,
decommission, admin server info, bucket metadata, replication decision,
lifecycle compensation/expiry, and data-usage cache consumers prefer the
AppContext-owned object store after context initialization and preserve the
existing global object-layer fallback.
- Must preserve: metrics collection, notification rebalance stop behavior,
tier config persistence, decommission startup, admin server info reporting,
bucket metadata persistence, replication decisions, lifecycle queueing, data
usage cache persistence, and existing storage error paths.
- Verification: formatting, compile checks, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
- [x] `CTX-011` Consolidate app usecase object-store fallback.
- Do: migrate app admin, bucket, multipart, and object usecases away from
direct `new_object_layer_fn` calls and through an explicit-context resolver
helper.
- Acceptance: usecase lookups keep their injected AppContext precedence,
preserve `without_context()` legacy global object-layer fallback semantics,
and avoid consulting the global AppContext when a usecase intentionally has
no context.
- Must preserve: admin storage/data-usage reads, bucket create/delete/list
behavior, multipart object writes, object API reads/writes, lifecycle
transition tests, and existing "Not init" error paths.
- Verification: formatting, compile checks, migration guards, diff hygiene,
Rust risk scan, and full `make pre-commit`.
## Phase 1 Security Governance Tasks
- [x] `S-001` Add `crates/security-governance`.
- Acceptance: the crate is a workspace member and has no dependency on
`rustfs`, `ecstore`, admin handlers, Axum, or runtime state.
- Verification: `cargo check -p rustfs-security-governance`.
- [x] `S-002` Add admin route matrix core types.
- Acceptance: `AdminRouteSpec`, `AdminRouteAccess`, `AdminActionRef`,
`PublicRouteKind`, `RouteRiskLevel`, and validation errors model route
governance metadata without registering routes or enforcing auth.
- Verification: `cargo test -p rustfs-security-governance`.
- [x] `S-003` Add redaction contract types.
- Acceptance: `RedactionRule`, `RedactionLevel`, and validation errors model
sensitive field handling without logging, masking, or runtime integration.
- Verification: `cargo test -p rustfs-security-governance`.
- [x] `S-004` Add serde policy marker types.
- Acceptance: `SerdePolicy`, `SerdePolicyKind`, `UnknownFieldPolicy`, and
validation errors model strict ingress and compatibility serde contracts
without changing deserialization behavior.
- Verification: `cargo test -p rustfs-security-governance`.
- [x] `S-005` Add supply-chain policy contract types.
- Acceptance: `ArtifactIntegrityPolicy`, `ArtifactSourceKind`, and validation
errors model digest, signature, and provenance requirements without changing
release or CI behavior.
- Verification: `cargo test -p rustfs-security-governance`.
- [x] `S-006` Add `rustfs/src/admin/route_policy.rs` backed by these contract
types, without changing route registration or auth behavior.
- Acceptance: direct `AdminRouteSpec` entries cover routes with a single
stable admin policy action, deferred inventory records routes that need
richer contract support, and tests prove the combined inventory covers every
registered admin route.
- [x] `S-011` Add KMS action taxonomy.
- Acceptance: `KmsAction` can parse and serialize dedicated configure,
service-control, clear-cache, generate-data-key, delete, rotate, list, and
describe actions; wildcard matching still works.
- Verification: `cargo test -p rustfs-policy action --no-fail-fast`.
- [x] `S-012` Migrate KMS handlers to dedicated actions.
- Acceptance: KMS data-key, delete/cancel-delete, cache, configure,
service-control, list, and describe handlers use dedicated `kms:*` actions.
- Compatibility: legacy KMS create/status admin actions are retained only as
temporary compatibility paths and registered in
[`compat-cleanup-register.md`](compat-cleanup-register.md).
- Verification: focused handler and route policy tests, migration rules,
formatting, and `make pre-commit`.
- [x] `S-013` Apply KMS redaction.
- Acceptance: KMS Debug output and admin status response summaries contain no
Vault token, AppRole secret ID, or local master key values.
- Must preserve: internal KMS config values remain available to runtime code
and persisted config serialization still writes the original secret values.
- Verification: focused KMS redaction/status tests, full KMS tests, migration
guards, Rust quality scan, clippy, and `make pre-commit` passed.
- [x] `S-014` Remove legacy KMS admin action fallbacks.
- Acceptance: KMS create, describe, and list-key handlers authorize only the
dedicated `kms:*` actions and no longer retain legacy admin grant fallbacks.
- Must preserve: legacy KMS endpoint URLs, query aliases, request bodies, and
response contracts remain unchanged.
- Verification: focused KMS auth and route-policy tests, migration guards,
formatting, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed before push.
- [x] `S-015` Remove legacy KMS admin policy action taxonomy.
- Acceptance: `admin:KMSCreateKey` and `admin:KMSKeyStatus` no longer parse as
valid policy actions; KMS key handlers keep using dedicated `kms:*` actions.
- Must preserve: legacy KMS endpoint URLs, query aliases, request bodies, and
response contracts remain unchanged.
- Verification: focused policy and KMS auth tests, route-policy tests,
migration guards, formatting, diff hygiene, risk scan, full pre-commit, and
required three-expert review passed before push.
- [x] `KMSD-001` Inventory KMS development defaults.
- Acceptance:
[`kms-development-defaults-inventory.md`](kms-development-defaults-inventory.md)
records Local and Vault defaults for missing master keys, temp key dirs,
HTTP Vault addresses, default dev-token credentials, and skip-TLS behavior.
- Must preserve: no KMS runtime behavior, config serialization,
authorization, startup order, storage path, or crate boundary changes.
- Verification: docs diff review, migration guards, metrics reference guard,
and `git diff --check`.
- [x] `KMSD-002` Make Local KMS unsafe defaults explicit dev opt-in.
- Acceptance: Local KMS now rejects missing master keys and process-temp key
directories unless `allow_insecure_dev_defaults` is explicitly set.
- Compatibility: server CLI/config now accepts `RUSTFS_KMS_LOCAL_MASTER_KEY`
for production local encryption and
`RUSTFS_KMS_ALLOW_INSECURE_DEV_DEFAULTS=true` for development-only local
setups.
- [x] `KMSD-003` Make Vault unsafe defaults explicit dev opt-in.
- Acceptance: Vault KV2 and Vault Transit now reject HTTP addresses,
`dev-token`, and `skip_tls_verify` unless explicit development opt-in is set.
- Compatibility: the KMS env loader and admin configure requests support the
same explicit development opt-in.
- [x] `KMSD-004` Add production KMS default tests.
- Acceptance: focused tests cover Local and Vault production rejection plus
explicit development opt-in paths across config, env loading, admin request
conversion, and service-manager validation.
- [x] `KMSD-005` Write KMS compatibility notes.
- Acceptance:
[`kms-development-defaults-inventory.md`](kms-development-defaults-inventory.md)
now records the production-safe alternatives and explicit development opt-in
behavior for deployments that relied on old defaults.
## Phase 2 Storage API Tasks
- [x] `API-001` Add `crates/storage-api`.
- Acceptance: `rustfs-storage-api` is a workspace member and remains a
dependency-free contract crate.
- Verification: `cargo check -p rustfs-storage-api`.
- [x] `API-002` Move public storage error/result contracts.
- Current PR: `rustfs/rustfs#3313` merged.
- Completed slice: add public `StorageErrorCode` and `StorageResult`
contracts in `rustfs-storage-api`, then make ECStore
`StorageError::to_u32/from_u32` consume the shared code table.
- Deferred: keep the full ECStore `StorageError` enum and ECStore-specific
conversions in `rustfs-ecstore` until the `DiskError`, filemeta, lock, and
`std::io::Error` downcast boundary is proven safe.
- Acceptance: storage-api contract tests pass, ECStore compatibility tests
prove numeric codes match the new contract, and
`cargo check -p rustfs-storage-api -p rustfs-ecstore` passes.
- Must preserve: storage error display, conversions, object error mapping,
quorum classification, and reserved code gaps `0x2B/0x2C`.
- Risk defense: no storage hot-path enum move in this PR; only numeric code
mapping uses the new contract.
- [x] `API-003` Move DTOs.
- Current PR: `rustfs/rustfs#3314` merged.
- Cleanup branch: `overtrue/arch-storage-api-dto-compat-cleanup`.
- Completed slice: move the pure bucket/options DTO subset:
`MakeBucketOptions`, `SRBucketDeleteOp`, `DeleteBucketOptions`,
`BucketOptions`, and `BucketInfo`.
- Cleanup slice: migrate in-repo external consumers to
`rustfs_storage_api`, keep ECStore implementation use crate-private, and
remove the old public `ecstore::store_api` bucket DTO re-export.
- Completed follow-up slice: remove the remaining ECStore-internal bucket DTO
aliases from `store_api` and guard against restoring that compatibility
path.
- Acceptance: `rustfs-storage-api` exports these DTOs, in-repo external
consumers no longer use the old `rustfs_ecstore::store_api` DTO path, and
`RUSTFS_COMPAT_TODO(API-003)` is removed from source and cleanup register.
- Must preserve: no `ObjectOptions`, `ObjectInfo`, reader, compression,
encryption, filemeta conversion, multipart conversion, route, storage, or
runtime behavior changes in this PR.
- [x] `API-006` Add disk inventory/admin trait.
- Current PR: `rustfs/rustfs#3330` merged.
- Completed slice: add `StorageAdminApi` and `DiskSetSelector` to
`rustfs-storage-api`.
- Acceptance: `StorageAdminApi` exposes backend info, global storage info,
local storage info, disk-set inventory, and drive-count surfaces without
depending on ECStore implementation types.
- Must preserve: no `StorageAPI::get_disks` removal, no ECStore implementation
change, no admin/readiness/capacity behavior change.
- Risk defense: use associated types for backend/storage/disk DTOs so this
contract slice does not pull `rustfs-madmin` or `rustfs-ecstore` into
`rustfs-storage-api`.
- Verification: focused storage-api tests, dependency tree, migration guards,
formatting, and diff hygiene.
- [x] `API-007` Dual-route `get_disks` consumers.
- Completed first slice: `rustfs/rustfs#3331` bound `ECStore` to
`StorageAdminApi` while keeping all consumers unchanged.
- Completed second slice: `rustfs/rustfs#3332` migrated the admin
storage-class config drive-count consumer to
`StorageAdminApi::set_drive_counts`.
- Completed third slice: `rustfs/rustfs#3333` migrated
`DefaultAdminUsecase` storage-info reads to
`StorageAdminApi::storage_info`.
- Completed fourth slice: `rustfs/rustfs#3334` migrated account-info
`backend_info`, rebalance status `storage_info`, and runtime readiness
`storage_info`.
- Completed fifth slice: `rustfs/rustfs#3335` migrated grouped observability,
RPC health, server-info, realtime metrics, and notification read-side
consumers.
- Completed sixth slice: `rustfs/rustfs#3336` migrated ECStore internal
decommission space, local-storage-info, backend-info, drive-count, and
disk-inventory admin handlers away from old `StorageAPI` method calls.
- Completed seventh slice: `rustfs/rustfs#3337` migrated maintenance and
background read-side storage inventory consumers in rebalance metadata
initialization, heal resume disk lookup, and scanner local disk scan lookup.
- Completion acceptance: admin inventory consumers no longer use old
`StorageAPI` calls for backend info, storage info, local storage info,
drive-count, or disk-set inventory when the inventory-facing
`StorageAdminApi` contract represents the same read-only operation.
- [x] `API-008` Remove duplicate old-path admin surfaces.
- Completed slice: `rustfs/rustfs#3340` removed duplicate admin-read methods
from the old `StorageAPI` trait and its ECStore/Sets/SetDisks/test
implementations after API-007 migrated their consumers.
- Final cleanup slice: remove the old `StorageAPI` facade after all real
consumers moved to concrete operation groups.
- Loss-prevention cleanup slice: rename the remaining ECStore contract
compatibility test away from the old storage-api facade name and guard
production ECStore/RustFS source against reintroducing the removed
aggregate facade identifier.
- Acceptance: storage operation traits remain available directly while admin
inventory surfaces live only on `StorageAdminApi`.
- [x] `API-009` Narrow metadata helper storage bounds.
- Completed slice: `rustfs/rustfs#3343` narrowed server config, tier config,
rebalance metadata, and startup metadata migration helper bounds away from
full `StorageAPI` when the helper only needs `ObjectIO`,
`ObjectOperations`, `BucketOperations`, `ListOperations`, or
`StorageAdminApi`.
- Cleanup slice: remove stale full `StorageAPI` dependencies from config
persistence test support after the server-config persistence helpers moved
to their actual object I/O and storage-admin bounds.
- Completed cleanup slice: `rustfs/rustfs#3489` removed the stale full
facade dependency from config persistence test support.
- Acceptance: metadata helper contracts express the actual operation group
they need, while callers and persistence behavior remain unchanged.
- [x] `API-010` Narrow replication resync metadata bounds.
- Completed slice: `rustfs/rustfs#3345` narrowed replication resync status
load/save/mark/persist helper bounds away from full `StorageAPI` when the
helper only needs `ObjectIO`.
- Acceptance: resync metadata helpers express object-I/O-only persistence
requirements, while replication execution, delete replication, multipart
replication, object lookups, and scheduling behavior remain on the concrete
operation groups they need.
- [x] `API-011` Narrow scanner cache helper storage bounds.
- Completed slice: `rustfs/rustfs#3348` narrowed scanner data-usage cache
load/save and cache snapshot persistence helper bounds away from full
`StorageAPI` when the helper only needs `ObjectIO`.
- Acceptance: scanner cache persistence helpers express object-I/O-only
requirements, while scanner cycle orchestration, bucket scanning, local disk
selection, cache publication, and storage hot paths remain unchanged.
- Must preserve: data-usage cache wire format, cache object paths, backup
cache paths, retry and timeout behavior, cache-save metrics, publish/update
channel behavior, scanner cycle scheduling, disk scan concurrency, bucket
scan semantics, lifecycle/replication decisions, and storage hot paths.
- Risk defense: do not move traits to `rustfs-storage-api`, do not alter
helper bodies, and do not narrow scanner paths that need bucket operations,
disk inventory, or full storage orchestration.
- Verification: focused compile/tests, migration guards, Rust risk scan, and
required quality/architecture, migration-preservation, and
testing/verification review passed.
- [x] `API-012` Narrow table catalog object backend bounds.
- Completed slice: `rustfs/rustfs#3350` added a narrow `NamespaceLocking`
operation-group trait as a compatibility facade, then narrowed
`EcStoreTableCatalogObjectBackend` from full `StorageAPI` to `ObjectIO`,
`ObjectOperations`, `ListOperations`, and `NamespaceLocking`.
- Cleanup slice: migrate the remaining scanner leader-lock and self-copy
object use-case namespace-lock consumers to `NamespaceLocking`, implement
namespace locking directly on ECStore storage types, and remove the
temporary namespace-lock compatibility method from the full storage trait
and cleanup register entry.
- Completed cleanup slice: `rustfs/rustfs#3477` narrowed remaining table
catalog backend and rebalance metadata helper consumers away from full
`StorageAPI` where they only need object I/O, object operations, list
operations, and namespace locking.
- Completed follow-up slice: `rustfs/rustfs#3485` narrowed replication pool,
resync leader-lock, delete replication, object replication, and multipart
replication helpers away from full `StorageAPI` where they only need object
I/O, object operations, list operations, and namespace locking.
- Final cleanup slice: remove the unused old `StorageAPI` facade, its
implementation blocks, public re-export, and stale guard coverage.
- Acceptance: table catalog object backend contracts express the actual
object read/write, metadata/delete, list, and namespace-lock capabilities
they need; namespace-lock consumers depend on `NamespaceLocking` instead of
full `StorageAPI`; and storage lock behavior remains unchanged.
- Must preserve: table catalog object paths, metadata pointer semantics,
optimistic write preconditions, object listing pagination, missing-object
handling, namespace write-lock acquisition, object APIs,
scanner/heal/replication/config persistence, and storage hot paths.
- Risk defense: do not move traits into `rustfs-storage-api`, do not change
lock implementation code, do not alter table catalog method bodies, and do
not leave stale full-facade compatibility coverage after consumers move to
concrete operation groups.
- Verification: focused compile/tests, migration guards, Rust risk scan, and
required quality/architecture, migration-preservation, and
testing/verification review passed.
- [x] `API-013` Move multipart list/result DTO contracts.
- Completed slice: move `MultipartUploadResult`, `PartInfo`,
`MultipartInfo`, `ListMultipartsInfo`, and `ListPartsInfo` from ECStore
`store_api` into `rustfs-storage-api`; update ECStore traits and RustFS S3
multipart response builders to import these shared contracts directly.
- Acceptance: `rustfs-storage-api` exports the multipart DTO contracts,
in-repo consumers no longer use the old `rustfs_ecstore::store_api` path
for these DTOs, and migration guards reject restoring the old ECStore-owned
definitions or re-exports.
- Must preserve: multipart upload creation, part listing, multipart upload
listing, part metadata, checksum fields, S3 response mapping, and storage
operation trait behavior.
- Risk defense: keep `CompletePart`, `ObjectInfo`, `ObjectOptions`, readers,
filemeta conversions, replication state, encryption, compression, and range
semantics in ECStore for this slice.
- Verification: focused storage-api/ECStore/RustFS compile checks, multipart
response tests, migration/layer guards, formatting, diff hygiene, Rust risk
scan, and required three-expert review passed.
- [x] `API-014` Move bucket operation contract.
- Completed slice: move `BucketOperations` from ECStore `store_api` into
`rustfs-storage-api`, keep ECStore/Sets/SetDisks implementations in
ECStore, and migrate in-repo consumers to import the shared contract path.
- Acceptance: `rustfs-storage-api` exports the bucket operation contract,
in-repo consumers no longer use the old `rustfs_ecstore::store_api` path
for `BucketOperations`, and migration guards reject restoring the old
ECStore-owned definition or re-export.
- Must preserve: bucket create/delete/list/info behavior, object store
initialization, bucket metadata migration, Swift/admin/storage consumers,
and all storage hot paths.
- Risk defense: only the trait contract crosses into `rustfs-storage-api`;
ECStore errors, object contracts, list contracts, readers, lock handling,
and implementation bodies stay in ECStore.
- Verification: focused storage-api/ECStore/RustFS/downstream compile checks,
migration/layer guards, formatting, diff hygiene, Rust risk scan, and
required three-expert review passed.
- [x] `API-015` Move object option helper contracts.
- Completed slice: move `CompletePart`, `HTTPPreconditions`, and
`ObjectLockRetentionOptions` from ECStore `store_api` into
`rustfs-storage-api`; keep `ObjectOptions`, object/list DTOs, readers,
filemeta conversions, and storage implementations in ECStore.
- Acceptance: `rustfs-storage-api` exports the moved helper contracts,
in-repo consumers no longer use the old `rustfs_ecstore::store_api` path
for these helpers, and migration guards reject restoring the old ECStore
definitions or public re-exports.
- Must preserve: multipart completion mapping, HTTP precondition semantics,
object-lock retention fields, object lookup/drop-precondition behavior,
storage hot paths, and ECStore-owned implementation-heavy object contracts.
- Risk defense: only pure helper DTOs cross into `rustfs-storage-api`;
ECStore keeps `ObjectOptions`, `ObjectInfo`, list contracts, readers,
lifecycle/replication/rio/filemeta coupling, errors, and implementation
bodies.
- Verification: focused storage-api/ECStore/RustFS/downstream compile checks,
migration/layer guards, formatting, diff hygiene, Rust risk scan, and
required three-expert review passed.
- [x] `API-016` Move HTTP range helper contracts.
- Completed slice: move `HTTPRangeSpec` and `HTTPRangeError` from ECStore
`store_api/readers.rs` into `rustfs-storage-api`; keep `ObjectInfo` part
adaptation in ECStore and migrate RustFS, ECStore, Swift, scanner, and
S3-select consumers to import the shared range contract directly.
- Acceptance: `rustfs-storage-api` exports the range helper contracts,
in-repo consumers no longer use the old `rustfs_ecstore::store_api` path
for `HTTPRangeSpec`, and migration guards reject restoring old ECStore
definitions or public re-exports.
- Must preserve: S3 range semantics, suffix ranges, multipart part-range
boundaries, SSE/rio/compressed range planning, Swift/S3-select reads, and
ECStore-owned object-info/filemeta adaptation.
- Risk defense: only pure range contract behavior crosses into
`rustfs-storage-api`; ECStore keeps readers, `ObjectInfo`, part plaintext
size selection, encryption/compression planning, lifecycle/replication/rio
coupling, and storage implementation bodies.
- Verification: focused storage-api/ECStore/RustFS/downstream compile checks,
migration/layer guards, formatting, diff hygiene, Rust risk scan, and
required three-expert review passed.
- [x] `API-017` Move object list helper contracts.
- Completed slice: move `VersionMarker` and `WalkVersionsSortOrder` from
ECStore `store_api/types.rs` into `rustfs-storage-api`; keep
`versions_after_marker`, `WalkOptions`, `ObjectInfo`, list result DTOs,
readers, and storage list/walk implementations in ECStore.
- Acceptance: `rustfs-storage-api` exports the list helper contracts,
in-repo production code no longer imports them from
`rustfs_ecstore::store_api`, and migration guards reject restoring old
ECStore definitions or public re-exports.
- Must preserve: list-object-versions marker parsing, null version markers,
version marker application only to the first matching entry, walk sort
default, and ECStore-owned filemeta/list implementation behavior.
- Risk defense: only pure marker/sort contracts cross into
`rustfs-storage-api`; ECStore keeps filemeta conversion, list result DTOs,
walk options with filemeta filters, readers, lifecycle/replication coupling,
and storage implementation bodies.
- Verification: focused storage-api/ECStore/RustFS/downstream compile checks,
migration/layer guards, formatting, diff hygiene, Rust risk scan, and
required three-expert review passed.
- [x] `API-018` Move object precondition helper contracts.
- Completed slice: add `ObjectPreconditionState`,
`ObjectPreconditionPart`, and `ObjectPreconditionError` to
`rustfs-storage-api`; make ECStore `ObjectOptions::precondition_check`
adapt `ObjectInfo` into the shared pure contract and map the contract
result back to the existing ECStore errors.
- Acceptance: `rustfs-storage-api` exports the precondition helper contracts,
ECStore keeps `ObjectOptions` and `ObjectInfo`, and migration guards reject
dropping the public precondition contract re-export.
- Must preserve: requested-part validation, empty condition handling,
`If-None-Match`/`If-Modified-Since` `NotModified` behavior,
`If-Match`/`If-Unmodified-Since` `PreconditionFailed` behavior, wildcard
ETag matching, and ECStore error mapping.
- Risk defense: only pure precondition decision state and result contracts
cross into `rustfs-storage-api`; ECStore keeps object metadata adaptation,
storage error types, `ObjectOptions`, `ObjectInfo`, readers,
lifecycle/replication coupling, and storage implementation bodies.
- Verification: focused storage-api tests, ECStore/RustFS/downstream compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
and required three-expert review passed.
- [x] `API-019` Move object list response contracts.
- Completed slice: move `ListObjectsInfo`, `ListObjectsV2Info`,
`ListObjectVersionsInfo`, and `ObjectInfoOrErr` from ECStore
`store_api/types.rs` into `rustfs-storage-api` as generic public
contracts, then keep ECStore's old public names as type aliases bound to
`ObjectInfo` and `Error`.
- Acceptance: `rustfs-storage-api` exports the generic list response
contracts, ECStore no longer defines local response structs for these
contracts, existing ECStore consumers keep their old import path, and
migration guards reject dropping the public storage-api re-export or
reintroducing local ECStore definitions.
- Must preserve: list v1/v2 truncation and marker fields, list-object-version
marker fields, object/prefix vectors, walk item/error channel shape, and
ECStore list/walk runtime behavior.
- Risk defense: only generic response containers cross into
`rustfs-storage-api`; ECStore keeps `ObjectInfo`, `ObjectOptions`,
`WalkOptions`, filemeta filters, object metadata adaptation, storage errors,
readers, lifecycle/replication coupling, and list/walk implementation
bodies.
- Verification: focused storage-api tests, ECStore/RustFS/downstream compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-020` Move walk options contract.
- Completed slice: move `WalkOptions` from ECStore `store_api/types.rs` into
`rustfs-storage-api` as a generic public contract over the filter type,
then keep ECStore's old public `WalkOptions` name as a type alias bound to
the existing `fn(&FileInfo) -> bool` filter shape.
- Acceptance: `rustfs-storage-api` exports `WalkOptions`, ECStore no longer
defines a local `WalkOptions` struct, existing ECStore consumers keep their
old import path, and migration guards reject dropping the public
storage-api re-export or reintroducing a local ECStore definition.
- Must preserve: walk filter optionality, marker, latest-only flag, ask-disks
string, version sort default, limit semantics, include-free-versions flag,
and ECStore list/walk runtime behavior.
- Risk defense: only the generic options container crosses into
`rustfs-storage-api`; ECStore keeps the concrete `FileInfo` filter binding,
list/walk implementations, metadata conversion, readers, storage errors,
lifecycle/replication coupling, and operation traits.
- Verification: focused storage-api tests, ECStore/RustFS/downstream compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-021` Move list operations contract.
- Completed slice: move `ListOperations` from ECStore `store_api/traits.rs`
into `rustfs-storage-api` as a generic public operation contract over list
response, walk option, cancellation, sender, and error associated types;
keep ECStore's old public `ListOperations` name as a fixed associated-type
compatibility subtrait.
- Acceptance: `rustfs-storage-api` exports `ListOperations`, ECStore no
longer defines local list operation method signatures, existing ECStore
generic bounds keep the old import path, and migration guards reject
dropping the public storage-api re-export or reintroducing local ECStore
list method definitions.
- Must preserve: list v2 pagination, list-object-versions pagination, walk
channel shape, cancellation token usage, ECStore public compatibility
bounds, and all ECStore list/walk runtime behavior.
- Risk defense: only the trait contract crosses into `rustfs-storage-api`;
ECStore keeps the concrete associated type bindings, response aliases,
walk option alias, object metadata conversion, storage errors, lifecycle
and replication coupling, and implementation bodies.
- Verification: focused storage-api tests, ECStore/RustFS/downstream compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-022` Move object and multipart operation contracts.
- Completed slice: move `ObjectIO`, `ObjectOperations`, and
`MultipartOperations` from ECStore `store_api/traits.rs` into
`rustfs-storage-api` as generic public operation contracts over ECStore
reader, option, metadata, multipart DTO, file-info, delete, header, range,
and error associated types; keep ECStore's old public trait names as fixed
associated-type compatibility subtraits.
- Acceptance: `rustfs-storage-api` exports the object and multipart
operation contracts, ECStore no longer defines local object/multipart method
signatures, existing ECStore generic bounds keep the old import path, and
migration guards reject dropping the public storage-api re-export or
reintroducing local ECStore object/multipart method definitions.
- Must preserve: object reader/writer behavior, object metadata/tag/delete
behavior, multipart create/copy/part/list/complete/abort behavior, ECStore
public compatibility bounds, and all ECStore object/multipart runtime
behavior.
- Risk defense: only the trait contracts cross into `rustfs-storage-api`;
ECStore keeps the concrete associated type bindings, readers,
`ObjectInfo`, `ObjectOptions`, `PutObjReader`, filemeta adaptation, storage
errors, lifecycle/replication/rio/compression/encryption coupling, and
implementation bodies.
- Verification: focused storage-api tests, ECStore/RustFS/downstream compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-023` Move heal and namespace-lock operation contracts.
- Completed slice: move `HealOperations` and `NamespaceLocking` from ECStore
`store_api/traits.rs` into `rustfs-storage-api` as generic public
operation contracts over ECStore heal result/options, namespace-lock
wrapper, and error associated types; keep ECStore's old public trait names
as fixed associated-type compatibility subtraits.
- Acceptance: `rustfs-storage-api` exports the heal and namespace-lock
operation contracts, ECStore no longer defines local heal/namespace-lock
method signatures, focused consumers use the shared trait for method
resolution, and migration guards reject dropping the public storage-api
re-export or reintroducing local ECStore method definitions.
- Must preserve: heal format/bucket/object behavior, abandoned-part checks,
pool/set lookup behavior, namespace-lock acquisition behavior, ECStore
public compatibility bounds, and all runtime lock/heal implementation
bodies.
- Risk defense: only the trait contracts cross into `rustfs-storage-api`;
ECStore keeps concrete associated type bindings, `HealOpts`,
`HealResultItem`, `NamespaceLockWrapper`, lock implementation, peer heal
behavior, set/pool dispatch, and storage error mapping.
- Verification: focused storage-api/ECStore/RustFS/heal/scanner compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-024` Clean shared list operation consumer bounds.
- Completed slice: migrate RustFS S3/bucket usecase list response builders from
ECStore `ListObjectVersionsInfo`/`ListObjectsV2Info` aliases to
`rustfs-storage-api` generic list response contracts bound to ECStore
`ObjectInfo`; migrate IAM walk channel typing from ECStore
`ObjectInfoOrErr` alias to the shared generic item contract.
- Acceptance: outer RustFS/IAM consumers use storage-api list response
contracts directly, ECStore keeps concrete aliases for internal
implementation and compatibility, and migration guards reject restoring the
old outer-consumer imports.
- Must preserve: S3 list v2/version output mapping, IAM config walk channel
item/error handling, ECStore concrete object metadata shape, walk options
inference, and storage error conversion behavior.
- Risk defense: this slice moves only low-coupling generic response/channel
typing; ECStore still owns `ObjectInfo`, `ObjectOptions`, readers,
filemeta-bound walk filter type, delete DTOs, and list/walk implementation
bodies.
- Verification: focused RustFS/IAM compile and tests, migration/layer guards,
formatting, diff hygiene, Rust risk scan, full pre-commit, and required
three-expert review passed.
- [x] `API-025` Clean external operation consumer bounds.
- Completed slice: migrate scanner data-usage cache storage bounds, RustFS
object-usecase namespace-lock helper bounds, and table catalog object
backend storage bounds from ECStore compatibility operation traits to
`rustfs-storage-api` operation traits with explicit ECStore concrete
associated-type bindings.
- Acceptance: outer RustFS/scanner consumers no longer import ECStore
operation traits, ECStore keeps compatibility traits for internal
implementation and downstream compatibility, and migration guards reject
restoring old outer-consumer operation trait imports.
- Must preserve: scanner cache load/save behavior, scanner backend timeout
and retry behavior, object self-copy namespace-lock quorum/error mapping,
table catalog object read/write/list/lock behavior, ECStore object metadata
shape, reader shape, walk filter shape, and storage error conversion.
- Risk defense: this slice changes only generic bounds/import ownership;
ECStore still owns concrete object DTOs, readers, delete DTOs, lock wrappers,
walk filters, and implementation bodies.
- Verification: focused RustFS/scanner compile and tests, migration/layer
guards, formatting, diff hygiene, Rust risk scan, full pre-commit, and
required three-expert review passed.
- [x] `API-026` Clean external DTO consumer boundaries.
- Current branch: `overtrue/arch-storage-dto-consumer-boundaries`.
- Completed slice: introduce crate-local semantic aliases for ECStore-owned
object metadata/options/readers/delete DTOs in scanner, heal, notify, Swift,
S3 Select, and RustFS storage/app consumers; update production and affected
test call sites to use those local aliases instead of raw
`rustfs_ecstore::store_api` DTO imports.
- Acceptance: non-ECStore direct `rustfs_ecstore::store_api` references are
limited to boundary alias definitions, ECStore remains the owner of
`ObjectInfo`, `ObjectOptions`, object readers, delete DTOs, walk filters,
lock wrappers, and implementation behavior, and external consumers express
their local semantic dependency through crate-owned names.
- Must preserve: object metadata shape, object option defaults, reader/writer
behavior, delete replication DTO handling, scanner cache semantics, heal
storage metadata semantics, Swift and S3 Select object reads, notification
event payloads, S3 response DTO mapping, and storage/app test behavior.
- Risk defense: this slice uses type aliases and import-boundary cleanup only;
it does not move DTO definitions, alter serialization, change object-store
implementations, or adjust runtime control flow.
- Verification: focused compile/tests, migration/layer guards, formatting,
diff hygiene, direct import scan, Rust risk scan, full pre-commit, and
required three-expert review passed.
- [x] `API-027` Clean remaining external storage DTO imports.
- Current branch: `overtrue/arch-storage-compat-contract-cleanup`.
- Completed slice: move table catalog, IAM object-store, admin zip-download,
capacity dirty-scope tests, heal integration tests, scanner, Swift, S3
Select, and notify event payloads from raw ECStore `store_api` DTO imports
to crate-local compatibility aliases/modules.
- Acceptance: non-ECStore direct `rustfs_ecstore::store_api` references are
limited to explicit boundary alias points in RustFS storage plus scanner,
heal, IAM, notify, Swift, and S3 Select compatibility modules; table
catalog, affected tests, and protocol/scanner/notification consumers
consume those boundary names instead of raw ECStore DTO paths.
- Must preserve: table catalog storage trait bindings, IAM metadata/lazy
rewrite behavior, object zip preflight/read semantics, capacity dirty-disk
assertions, heal integration object read/write behavior, scanner cache
load/save semantics, Swift object read/write/copy/delete behavior, S3
Select object-store reads, notify event payload shape, and ECStore-owned DTO
concrete shapes.
- Risk defense: this slice changes import ownership and type aliases only; it
does not move DTO definitions, alter serialization, change object-store
implementation bodies, or adjust runtime control flow.
- Verification: focused compile/tests, migration/layer guards, formatting,
diff hygiene, direct import scan, Rust risk scan, full pre-commit, and
required three-expert review passed.
- [x] `API-028` Clean Swift ECStore runtime boundary imports.
- Current branch: `overtrue/arch-swift-ecstore-boundaries`.
- Completed slice: move Swift account, container, object, and versioning
access to ECStore object-store resolver and bucket metadata get/set calls
behind the Swift-local `storage_compat` module.
- Acceptance: direct Swift module references to `rustfs_ecstore` for object
store resolution, bucket metadata reads, bucket metadata writes, and object
DTO aliases are limited to `swift::storage_compat`; Swift business modules
consume Swift-owned compatibility names.
- Must preserve: Swift account metadata tags, container metadata tags,
versioning location tags, ACL tag storage, object CRUD/copy/range behavior,
storage-not-initialized error mapping, and bucket metadata load/save error
mapping.
- Risk defense: this slice changes import ownership and thin wrapper
boundaries only; it does not move ECStore definitions, alter metadata
serialization, change Swift bucket naming, or adjust runtime control flow.
- Verification: focused Swift compile/tests, migration/layer guards,
formatting, diff hygiene, direct Swift import scan, Rust risk scan, full
pre-commit, and required three-expert review passed.
- [x] `API-029` Clean scanner and heal ECStore runtime boundaries.
- Current branch: `overtrue/arch-scanner-heal-runtime-boundaries`.
- Completed slice: move scanner and heal direct ECStore runtime, disk,
metadata, lifecycle, replication, config, and error imports behind their
crate-local compatibility modules.
- Acceptance: direct `rustfs_ecstore` references in `crates/scanner/src` and
`crates/heal/src` are limited to scanner/heal compatibility boundary
modules; scanner/heal business modules consume local compatibility names.
- Must preserve: scanner cache load/save behavior, lifecycle and replication
scan behavior, disk bucket scan inventory lookup, heal object/bucket/format
behavior, resume state storage, heal channel test contracts, and existing
ECStore-owned concrete types.
- Risk defense: this slice changes import ownership and thin compatibility
boundaries only; it does not alter scanner scheduling, heal scheduling,
object I/O logic, disk operations, metadata serialization, or error
mapping.
- Verification: focused scanner/heal compile/tests, direct import scans,
migration/layer guards, formatting, diff hygiene, Rust risk scan, full
pre-commit, and required three-expert review passed.
- [x] `API-030` Clean app, storage, and admin ECStore runtime boundaries.
- Current branch: `overtrue/arch-app-storage-admin-runtime-boundaries`.
- Completed slice: add crate-local app, storage, and admin compatibility
boundary modules for ECStore-owned runtime contracts, then migrate direct
`rustfs_ecstore` imports in `rustfs/src/app`, `rustfs/src/storage`, and
`rustfs/src/admin` through those boundary modules.
- Acceptance: direct `rustfs_ecstore` references in app/storage/admin source
are limited to the local compatibility boundary modules; app, storage, and
admin business/test modules consume local compatibility names.
- Must preserve: app object/bucket/multipart/admin usecase behavior, storage
ECFS/access/SSE/RPC behavior, admin route/handler/service behavior,
metadata serialization, encryption handling, authorization, and existing
ECStore-owned concrete type ownership.
- Risk defense: this slice changes import ownership only; it does not move
ECStore definitions, alter runtime control flow, adjust route registration,
change storage I/O, mutate metadata formats, or alter admin authorization.
- Verification: direct app/storage/admin import scan, RustFS test compile
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
full pre-commit, and required three-expert review passed.
- [x] `API-031` Clean runtime, observability, S3 Select, notify, and IAM
ECStore runtime boundaries.
- Current branch: `overtrue/arch-runtime-observability-select-boundaries`.
- Completed slice: add RustFS root, obs, and IAM compatibility boundary
modules; extend notify and S3 Select compatibility modules; migrate direct
`rustfs_ecstore` imports in RustFS startup/server/runtime/table-catalog
code plus obs, notify, S3 Select, and IAM through those local boundaries.
- Acceptance: direct `rustfs_ecstore` references in those source areas are
limited to local compatibility boundary modules; runtime and crate business
modules consume local compatibility names.
- Must preserve: startup ordering, readiness/RPC behavior, capacity metrics,
table catalog object I/O behavior, notification config persistence, S3
Select object-store reads, IAM storage/error mapping, and observability
metrics collection behavior.
- Risk defense: this slice changes import ownership only; it does not move
ECStore definitions, alter runtime control flow, adjust readiness checks,
mutate table catalog metadata, change IAM policy behavior, or alter notify,
S3 Select, or obs runtime semantics.
- Verification: focused compile, direct import scan, migration/layer guards,
formatting, diff hygiene, Rust risk scan, full pre-commit, and required
three-expert review passed.
- [x] `API-032` Clean test harness and fuzz ECStore compatibility boundaries.
- Current branch: `overtrue/arch-test-harness-fuzz-storage-boundaries`.
- Completed slice: add scanner/heal integration test, e2e test, and fuzz
target compatibility boundary modules; migrate direct `rustfs_ecstore`
imports in those test/fuzz harnesses through local boundaries.
- Acceptance: direct `rustfs_ecstore` references in scanner/heal integration
tests, e2e test helpers, and fuzz targets are limited to local
compatibility boundary modules; test and fuzz modules consume local
compatibility names.
- Must preserve: scanner lifecycle integration behavior, heal integration and
bug-fix test behavior, e2e node/grpc/replication helpers, fuzz target input
shape, and existing ECStore-owned concrete type ownership.
- Risk defense: this slice changes import ownership only; it does not move
ECStore definitions, alter test setup semantics, change fuzz inputs, adjust
runtime control flow, or mutate metadata formats.
- Verification: focused scanner/heal/e2e compile, fuzz target compile,
migration/layer guards, formatting check, diff hygiene, direct import scan,
risk scan, full pre-commit, and required three-expert review passed.
- [x] `API-033` Narrow ECStore compatibility export surfaces.
- Current branch: `overtrue/arch-narrow-storage-compat-exports`.
- Completed slice: replace local whole-crate ECStore compatibility aliases
with explicit re-export modules for RustFS runtime/app/admin/storage, obs,
notify, S3 Select, IAM, scanner/heal integration tests, e2e helpers, and
fuzz targets.
- Acceptance: local ECStore compatibility boundaries expose only the ECStore
modules/functions required by their consumers; direct `rustfs_ecstore`
references remain limited to compatibility boundary modules.
- Must preserve: all runtime, admin, storage, observability, notification, S3
Select, IAM, scanner/heal test, e2e helper, and fuzz behavior from
API-031/API-032.
- Risk defense: this slice changes compatibility re-export ownership only; it
does not move ECStore definitions, alter runtime control flow, mutate
metadata formats, change test setup semantics, or adjust fuzz inputs.
- Verification: focused compile, fuzz target compile, migration/layer guards,
formatting check, diff hygiene, direct import scan, risk scan, full
pre-commit, and required three-expert review passed.
- [x] `API-034` Narrow remaining ECStore compatibility export surfaces.
- Current branch: `overtrue/arch-remaining-storage-compat-exports`.
- Completed slice: narrow the remaining scanner, heal, Swift, and IAM store
ECStore compatibility boundary modules from direct ECStore imports to
explicit local `ecstore` re-export surfaces while keeping existing local
semantic aliases unchanged; add a migration guard that rejects future direct
`rustfs_ecstore` imports outside compatibility boundary modules.
- Acceptance: direct `rustfs_ecstore` references in non-ECStore source are
limited to local compatibility boundary modules; business modules continue
to consume crate-local compatibility names, and migration rules reject
bypassing those boundaries.
- Must preserve: scanner cache/lifecycle/replication behavior, heal storage
and disk behavior, Swift object/bucket metadata behavior, IAM object-store
metadata behavior, and all ECStore-owned concrete type ownership.
- Risk defense: this slice changes compatibility import ownership only; it
does not move ECStore definitions, alter runtime control flow, mutate
metadata formats, change Swift/IAM semantics, or adjust scanner/heal
scheduling.
- Verification: focused scanner/heal/IAM compile, Swift feature compile,
migration/layer guards, formatting check, diff hygiene, direct import scan,
risk scan, full pre-commit, and required three-expert review passed.
- [x] `API-035` Prune compatibility re-export allowances.
- Current branch: `overtrue/arch-compat-reexport-prune`.
- Current slice: remove unused-import allowances from production and fuzz
ECStore compatibility boundary modules, keep target-specific test harness
exceptions explicit, gate test-only RustFS storage compatibility re-exports
with `cfg(test)`, and add a migration rule preventing production
compatibility boundaries from hiding unused ECStore re-exports.
- Acceptance: production and fuzz `storage_compat.rs` modules compile without
unused-import allows, test-only compatibility exceptions remain scoped to
harnesses with target-specific compile needs, and migration rules reject
reintroducing broad unused-import allowances in production compatibility
boundaries.
- Must preserve: all ECStore-owned concrete types and runtime behavior,
startup/storage/admin/app/Swift/scanner/heal/IAM/notify/obs/S3 Select
import paths, test harness behavior, and fuzz target behavior.
- Risk defense: this slice changes only compatibility boundary re-export
hygiene and migration guard coverage; it does not move definitions, alter
runtime control flow, mutate metadata formats, or change storage behavior.
- Verification: focused compile checks, fuzz manifest compile, migration and
layer guards, formatting check, diff hygiene, risk scan, full pre-commit,
and required three-expert review passed.
- [x] `API-036` Move delete-object DTO contracts.
- Current branch: `overtrue/arch-delete-object-contracts`.
- Current slice: move `ObjectToDelete` and `DeletedObject` from ECStore
`store_api` into `rustfs-storage-api`, keep old ECStore paths as type
aliases for compatibility, migrate RustFS/scanner aliases to the
storage-api contracts, and guard against reintroducing ECStore-owned delete
DTO definitions.
- Acceptance: storage-api exports delete-object DTO contracts, ECStore keeps
compatibility type aliases without owning the definitions, external
RustFS/scanner aliases consume storage-api directly, and migration rules
reject restoring ECStore definitions or public re-exports.
- Must preserve: delete-object field names and types, replication-state helper
semantics, ECStore object/delete operation associated types, scanner delete
selection behavior, RustFS object delete behavior, and old ECStore import
compatibility.
- Risk defense: this is a pure DTO ownership move; it does not change
deletion control flow, replication decisions, lifecycle expiry behavior, or
object metadata persistence.
- Verification: focused compile checks, storage-api tests, migration and layer
guards, formatting check, diff hygiene, risk scan, full pre-commit, and
required three-expert review passed.
- [x] `API-037` Clean delete-object DTO consumers.
- Current branch: `overtrue/arch-delete-object-contracts`.
- Current slice: migrate ECStore internal delete-object DTO consumers from
old `crate::store_api` imports to `rustfs-storage-api` contracts while
keeping public ECStore type aliases for downstream compatibility.
- Acceptance: ECStore object, set, lifecycle, and replication internals use
storage-api delete DTO contracts directly; public old-path type aliases
remain available; migration rules reject reintroducing ECStore internal
old-path delete DTO consumers.
- Must preserve: object delete result shape, batch delete error alignment,
lifecycle replication scheduling, MRF delete replay, replication retry
decisions, and old ECStore public import compatibility.
- Risk defense: this is a consumer import cleanup over identical type
definitions; it does not change delete control flow, replication decisions,
lifecycle expiry behavior, or object metadata persistence.
- Verification: focused ECStore/RustFS/scanner compile checks, migration and
layer guards, formatting check, diff hygiene, risk scan, full pre-commit,
and required three-expert review passed.
- [x] `API-038` Narrow remaining `store_api` compatibility re-export surfaces.
- Current branch: `overtrue/arch-delete-object-contracts`.
- Current slice: replace whole-module `rustfs_ecstore::store_api`
compatibility re-exports in RustFS storage, scanner, heal, Swift,
S3 Select, IAM, and notify boundaries with explicit contract type
re-exports, and add a migration rule rejecting broad `store_api`
compatibility re-exports.
- Acceptance: storage compatibility boundaries expose only the concrete
`store_api` contracts their consumers use; downstream local aliases keep
the same names; migration rules reject reintroducing broad `store_api`
passthroughs in production compatibility boundaries.
- Must preserve: object info/options reader aliases, storage/list/multipart
operation trait bindings, scanner/heal/Swift/S3 Select/IAM/notify behavior,
and all ECStore-owned concrete type ownership.
- Risk defense: this is compatibility import surface cleanup only; it does
not move definitions, alter storage/runtime control flow, change object
metadata conversion, or mutate reader behavior.
- Verification: focused multi-crate compile, migration guard, formatting
check, diff hygiene, risk scan, full pre-commit, and required three-expert
review passed.
- [x] `API-039` Collapse nested `store_api` compatibility modules.
- Current branch: `overtrue/arch-compat-boundary-prune`.
- Current slice: replace nested `store_api` compatibility modules in RustFS
storage, scanner, heal, Swift, S3 Select, IAM, and notify boundaries with
direct local type aliases, and add a migration rule rejecting nested
`store_api` modules in storage compatibility files.
- Acceptance: storage compatibility boundaries no longer recreate
`store_api` module shapes; downstream aliases keep the same concrete
contract types; migration rules reject restoring nested `store_api`
compatibility modules outside ECStore and test-only boundaries.
- Must preserve: object info/options reader aliases, scanner/heal/Swift/S3
Select/IAM/notify compile-time contracts, storage API compatibility names,
and ECStore-owned concrete type ownership.
- Risk defense: this is a local alias-shape cleanup only; it does not move
definitions, alter storage/runtime control flow, change object metadata
conversion, or mutate reader behavior.
- Verification: focused multi-crate compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed.
- [x] `API-040` Lock remaining `store_api` compatibility aliases.
- Current branch: `overtrue/arch-compat-boundary-prune`.
- Current slice: add a migration rule that allows the remaining
`rustfs_ecstore::store_api::*` references in production storage
compatibility files only when they are explicit local type aliases to the
four ECStore-owned contracts still intentionally kept in ECStore.
- Acceptance: production compatibility boundaries can keep only explicit
aliases to `GetObjectReader`, `ObjectInfo`, `ObjectOptions`, and
`PutObjReader`; any broader import, module recreation, or new raw
`store_api` compatibility dependency fails the architecture guard.
- Must preserve: existing local alias names and concrete ECStore-owned reader,
object info, and object option contract ownership.
- Risk defense: this is a guardrail-only slice; it does not change runtime
code, storage behavior, object metadata shape, or reader behavior.
- Verification: migration and layer guards, formatting check, diff hygiene,
risk scan, full pre-commit, and required three-expert review passed.
- [x] `API-041` Lock ECStore compatibility passthrough allowlists.
- Current branch: `overtrue/arch-compat-passthrough-guards`.
- Current slice: add a migration rule that snapshots every
`rustfs_ecstore` module/function passthrough exposed from local
`storage_compat.rs` boundaries across RustFS, scanner, heal, Swift,
S3 Select, IAM, notify, observability, e2e, and fuzz harnesses.
- Acceptance: compatibility boundaries cannot silently add or remove ECStore
passthrough items; future cleanup PRs must update the explicit allowlist
when they intentionally shrink or reshape a boundary.
- Must preserve: all existing local compatibility paths, ECStore concrete
type ownership, storage behavior, startup behavior, scanner/heal behavior,
Swift/S3 Select/IAM/notify behavior, observability reads, and test/fuzz
harness behavior.
- Risk defense: this is a loss-prevention guard only; it does not change
runtime code, storage APIs, object metadata shape, reader behavior, or
worker lifecycle.
- Verification: migration guard, formatting check, diff hygiene, risk scan,
focused script check, and full pre-commit required before push.
- [x] `API-042` Split notify event object contract from ECStore ObjectInfo.
- Current branch: `overtrue/arch-compat-passthrough-contracts`.
- Current slice: give `rustfs-notify` its own lightweight
`NotifyObjectInfo` event DTO, keep ECStore-to-notify conversion private to
the notify compatibility boundary, and update RustFS event handoff sites to
use the conversion explicitly.
- Acceptance: notify no longer publicly re-exports ECStore `ObjectInfo` as
its event object type; existing RustFS event generation, restore-completed
event data, version IDs, object metadata filtering, and ECStore bridge
behavior are preserved.
- Must preserve: S3 event JSON shape, remove-event metadata suppression,
restore-completed glacier data formatting, object key URL encoding,
request/response headers, replication request filtering, and existing
EventArgsBuilder call sites.
- Risk defense: this is a consumer contract split only; ECStore remains the
producer of storage metadata, while notify owns the event-facing DTO.
- Verification: focused notify/RustFS compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed.
- [x] `API-043` Remove notify ECStore config passthroughs.
- Current branch: `overtrue/arch-compat-passthrough-contracts`.
- Current slice: replace notify's public compatibility passthroughs for
ECStore config/global modules with a crate-local config update boundary,
then shrink the passthrough guard snapshot.
- Acceptance: notify config mutation code no longer reaches through
ECStore config/global modules directly; the storage compatibility boundary
owns ECStore handle resolution, read, save, and error classification.
- Must preserve: target config read-modify-save behavior, unchanged-config
no-op handling, storage-not-initialized error wording, read/save error
mapping, target reload ordering, and runtime lifecycle logging.
- Risk defense: this keeps persistence semantics unchanged while reducing
the compatibility surface visible to notify business logic.
- Verification: focused notify/RustFS compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review required before push.
- [x] `API-044` Remove S3 Select ECStore module passthroughs.
- Current branch: `overtrue/arch-compat-passthrough-contracts`.
- Current slice: replace S3 Select's public compatibility passthroughs for
ECStore error, store, set-disk, and resolver modules with crate-local
aliases/functions, then shrink the passthrough guard snapshot.
- Acceptance: S3 Select object-store code no longer reaches through ECStore
modules directly; storage errors, store handle resolution, ECStore store
type ownership, and default read-buffer sizing remain behind the local
storage compatibility boundary.
- Must preserve: S3 Select object-store initialization, not-found error
mapping, scan-range defaults, stream buffer sizing, JSON document handling,
CSV conversion streams, and ECStore object reader/info calls.
- Risk defense: this changes import ownership only; S3 Select still uses the
same ECStore runtime APIs through narrower local compatibility names.
- Verification: focused S3 Select/notify/RustFS compile, migration and layer
guards, formatting check, diff hygiene, risk scan, full pre-commit, and
required three-expert review required before push.
- [x] `API-045` Remove observability ECStore module passthroughs.
- Current branch: `overtrue/arch-compat-passthrough-contracts`.
- Current slice: replace OBS metrics passthroughs for ECStore bucket,
data-usage, global, pools, and object-store resolver modules with
crate-local storage compatibility functions and snapshots, then shrink the
passthrough guard snapshot.
- Acceptance: OBS metrics collection no longer reaches through ECStore
modules directly; object-store resolution, data-usage loading, capacity
calculation, quota reads, replication state, bucket bandwidth monitor
access, and ILM runtime counters remain behind the OBS compatibility
boundary.
- Must preserve: cluster/health metrics, bucket usage metrics, replication
and bandwidth metrics, scheduler tombstone behavior, disk/drive metrics,
erasure-set metrics, ILM metrics, existing warning paths, and no-data
fallback behavior.
- Risk defense: this changes compatibility ownership only; OBS still reads
the same ECStore runtime state through narrower local compatibility names.
- Verification: focused OBS/notify/S3 Select/RustFS compile, migration and
layer guards, formatting check, diff hygiene, risk scan, full pre-commit,
and required three-expert review required before push.
- [x] `API-046` Remove IAM and Swift ECStore module passthroughs.
- Current branch: `overtrue/arch-compat-iam-swift-boundaries`.
- Current slice: replace IAM's ECStore config/error/global/notification/store
module passthroughs and Swift's ECStore bucket/error/store resolver
passthroughs with local compatibility aliases and wrapper functions, then
shrink the passthrough guard snapshot.
- Acceptance: IAM store, IAM notification fanout, IAM error conversion, IAM
first-node checks, and Swift bucket metadata/object-store access no longer
reach through ECStore modules directly from consumer code.
- Must preserve: IAM config prefix layout, IAM config read/write/delete
semantics, lazy rewrite precondition behavior, config-not-found mapping,
peer notification fanout error logging, first-node initial load behavior,
Swift object-store resolution, and Swift bucket metadata get/set behavior.
- Risk defense: this is an import ownership and compatibility-boundary
cleanup only; ECStore remains the owner of concrete storage/runtime state
while IAM and Swift expose narrower local names to their consumers.
- Verification: focused IAM/Swift compile, IAM unit tests, migration and
layer guards, formatting check, diff hygiene, risk scan, full pre-commit,
and required three-expert review required before push.
- [x] `API-047` Remove heal and scanner production ECStore module passthroughs.
- Current branch: `overtrue/arch-heal-scanner-compat-boundaries`.
- Current slice: replace heal and scanner production compatibility
passthrough modules with explicit local aliases and wrapper functions,
while leaving test-only ECStore compatibility harnesses for later cleanup.
- Acceptance: heal and scanner production code no longer exposes broad
ECStore module passthroughs for bucket/config/data-usage/disk/error/global,
pools, set-disk, store, or store-utils through `storage_compat.rs`.
- Must preserve: heal disk/resume/task behavior, scanner config persistence,
scanner lifecycle/replication actions, bucket cache scanning, object-store
resolution, erasure-mode checks, storage-class accounting, and data-usage
memory updates.
- Risk defense: this narrows import ownership only; ECStore remains the owner
of concrete storage/runtime state and scanner/heal keep the same local
compatibility names for existing call sites.
- Verification: focused heal/scanner compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review required before push.
- [x] `API-048` Remove RustFS runtime ECStore module passthroughs.
- Current branch: `overtrue/arch-rustfs-runtime-compat-boundaries`.
- Current slice: replace the RustFS app, admin, storage, and root runtime
compatibility passthrough modules with explicit local aliases and nested
compatibility exports, while preserving existing consumer paths.
- Acceptance: RustFS runtime compatibility files no longer expose broad
ECStore top-level module passthroughs for app/admin/storage/root runtime
consumers, and the passthrough guard snapshot keeps only test/fuzz
harness allowances.
- Must preserve: startup config/bootstrap behavior, server readiness checks,
admin replication/rebalance/tier/config handlers, app object/bucket/
multipart usecases, storage RPC/SSE/access paths, table catalog storage
access, and existing test-only harness imports.
- Risk defense: this is an import ownership and compatibility-boundary
cleanup only; ECStore remains the owner of concrete storage/runtime state
while RustFS runtime modules retain stable local compatibility paths.
- Verification: focused RustFS test compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed before push.
- [x] `API-049` Remove test and fuzz ECStore module passthroughs.
- Current branch: `overtrue/arch-test-fuzz-compat-boundaries`.
- Current slice: replace the remaining e2e, heal-test, scanner-test, and
fuzz-target ECStore module passthroughs with explicit local compatibility
aliases, split fuzz storage compatibility by target, and empty the
passthrough guard snapshot.
- Acceptance: no `storage_compat.rs` file may expose broad
`rustfs_ecstore` module passthroughs; the migration guard now rejects any
new passthrough unless a later slice deliberately adds a reviewed
allowlist entry.
- Must preserve: e2e bucket target and RPC helper imports, heal test disk and
store setup imports, scanner test lifecycle/tier/disk/storage imports,
fuzz bucket validation behavior, and fuzz path containment behavior.
- Risk defense: this is test-harness and fuzz-harness import ownership
cleanup only; ECStore remains the owner of the same concrete APIs and no
production runtime path is changed.
- Verification: focused test/fuzz compiles, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed before push.
- [x] `API-050` Move lifecycle helper DTO contracts.
- Current branch: `overtrue/arch-storage-api-lifecycle-contracts`.
- Current slice: move `ExpirationOptions` and `TransitionedObject` into
rustfs-storage-api, update ECStore internal consumers plus notify test
coverage to import them directly, and keep ECStore old-path re-exports for
downstream compatibility callers.
- Acceptance: rustfs-storage-api exports both lifecycle helper DTOs, ECStore
no longer owns their concrete struct definitions, ECStore internal
consumers and notify coverage use the storage-api contracts directly, old
ECStore lifecycle paths remain available as re-exports, and migration rules
reject restoring the ECStore definitions or old internal imports.
- Must preserve: lifecycle expiration flags, transitioned object journal
metadata, object info construction, notify event conversion, and all old
ECStore import paths used by existing callers.
- Risk defense: this is a pure DTO move; no lifecycle scheduling, object I/O,
transition journal, replication, or reader behavior is changed.
- Verification: storage-api lifecycle helper unit test, ECStore transitioned
lifecycle tests, notify event conversion test, focused compile checks,
migration and layer guards, formatting check, diff hygiene, risk scan, full
pre-commit, and required three-expert review passed before push.
- [x] `API-051` Flatten test harness storage compatibility aliases.
- Current branch: `overtrue/arch-test-harness-compat-aliases`.
- Current slice: flatten e2e, heal, scanner, and fuzz storage compatibility
harnesses from nested `storage_compat::ecstore` modules into direct
crate-local aliases, constants, and function imports.
- Acceptance: no e2e, heal-test, scanner-test, or fuzz-target harness file
may expose or consume nested `storage_compat::ecstore` paths, and migration
rules reject reintroducing nested test/fuzz ECStore compatibility modules.
- Must preserve: e2e bucket target/RPC/disk helper imports, heal ECStore disk
and endpoint setup, scanner lifecycle/tier/disk/storage setup, fuzz bucket
validation behavior, and fuzz path-containment validation behavior.
- Risk defense: this is test-harness and fuzz-harness import cleanup only; no
production runtime behavior, ECStore ownership, storage metadata format, or
scanner/heal lifecycle logic is changed.
- Verification: focused e2e/heal/scanner test compile, harness tests,
migration and layer guards, formatting check, diff hygiene, risk scan, full
pre-commit, and required three-expert review passed before push.
- [x] `API-052` Flatten RustFS runtime storage compatibility aliases.
- Current branch: `overtrue/arch-rustfs-storage-compat-aliases`.
- Current slice: flatten RustFS root, app, admin, and storage runtime
compatibility facades from nested `storage_compat::ecstore` modules into
direct crate-local aliases, constants, and function imports.
- Acceptance: no RustFS runtime source file may expose or consume nested
`storage_compat::ecstore` paths, and migration rules reject reintroducing
nested RustFS runtime ECStore compatibility modules.
- Must preserve: startup/config/bootstrap behavior, server readiness checks,
admin replication/rebalance/tier/config handlers, app object/bucket/
multipart usecases, storage RPC/SSE/access paths, table catalog storage
access, and existing local compatibility ownership.
- Risk defense: this is RustFS runtime import cleanup only; no production
runtime behavior, ECStore ownership, storage metadata format, object I/O,
admin authorization, or readiness semantics are changed.
- Verification: focused RustFS compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed before push.
- [x] `API-053` Flatten RustFS runtime scalar storage compatibility aliases.
- Current branch: `overtrue/arch-runtime-compat-surface-prune`.
- Current slice: flatten RustFS root, app, admin, and storage runtime scalar
compatibility facades such as store, error, global, endpoints, RPC,
metrics, notification, set-disk, and data-usage paths into direct
crate-local aliases and functions.
- Acceptance: RustFS runtime source no longer consumes those scalar
compatibility surfaces through secondary modules, while higher-coupling
bucket/config/rio compatibility modules remain unchanged; migration rules
reject restoring the flattened scalar paths.
- Must preserve: startup config/bootstrap behavior, server readiness checks,
admin replication/rebalance/tier/config handlers, app object/bucket/
multipart usecases, storage RPC/SSE/access paths, table catalog storage
access, and existing ECStore concrete type ownership.
- Risk defense: this is import ownership and facade-shape cleanup only; no
production runtime behavior, ECStore ownership, storage metadata format,
object I/O, admin authorization, or readiness semantics are changed.
- Verification: focused RustFS compile, migration and layer guards,
formatting check, diff hygiene, risk scan, full pre-commit, and required
three-expert review passed before push.
- [x] `API-054` Flatten RustFS runtime secondary storage compatibility aliases.
- Current branch: `overtrue/arch-runtime-secondary-compat-flatten`.
- Current slice: flatten RustFS root, app, admin, and storage runtime
secondary compatibility modules such as bucket, config, rio, client, tier,
compress, disk, and rebalance into direct crate-local aliases, modules, and
functions.
- Acceptance: RustFS runtime source no longer consumes those compatibility
surfaces through broad secondary modules, the runtime compatibility files no
longer define those wrapper modules, and migration rules reject restoring
the flattened secondary paths.
- Must preserve: startup config/bootstrap behavior, server module-switch
config reads, embedded startup storage initialization, admin bucket/meta/
tier/rebalance/config handlers, app object/bucket/multipart usecases,
storage RPC/SSE/access paths, table catalog storage access, and ECStore
concrete type ownership.
- Risk defense: this is import ownership and facade-shape cleanup only; no
production runtime behavior, ECStore ownership, storage metadata format,
object I/O, admin authorization, tier behavior, or readiness semantics are
changed.
- Verification: focused RustFS compile, migration and layer guards,
formatting check, diff hygiene, risk scan, and required three-expert review
passed before push.
## Phase 8 Background Controller Tasks
- [x] `BGC-001` Inventory background services.
- Acceptance:
[`background-services-inventory.md`](background-services-inventory.md)
records scanner, heal, lifecycle, replication, config reload, metrics,
shutdown, cancellation, and side-effect surfaces before controller work.
- Must preserve: no code behavior change and no new controller contract in
this PR.
- Verification: docs-only architecture checks and diff hygiene.
- [x] `BGC-002` Define minimal controller contract.
- Acceptance:
[`background-controller-contract.md`](background-controller-contract.md)
defines desired/current/status/reconcile vocabulary, status state
semantics, service boundaries, and side-effect rules without starting
workers or changing scheduling.
- Must preserve: no Rust trait, scheduler, service registry, worker
start/stop path, storage write, readiness change, peer signal, or runtime
behavior change.
- Verification: docs-only architecture checks and diff hygiene.
- [x] `BGC-003` Add read-only status snapshot.
- Acceptance: memory observability exposes a typed status snapshot that reports
service state, metrics enablement, configured interval, cancellation source,
and shutdown handle shape.
- Must preserve: no controller framework, admin route, worker lifecycle
change, storage write, readiness change, peer signal, or metrics emission
behavior change.
- Verification: focused memory observability tests, compile checks, migration
guards, formatting, and pre-commit quality gate.
- [x] `BGC-004` Pilot one controller.
- Acceptance: memory observability exposes a typed controller snapshot and
reconcile plan that compare desired state with current status.
- Must preserve: no admin route, scheduler, service registry, worker
lifecycle mutation, storage write, readiness signal, peer signal, or metrics
emission behavior change.
- Verification: focused controller tests prove repeated reconcile is
idempotent, cancellation state is preserved, and worker mutation remains
none.
- [x] `TEST-BGC-001` Add controller harness coverage.
- Acceptance: controller tests cover cancellation state, repeated reconcile,
paused-time stability, and no worker mutation for the low-risk controller
surfaces.
- Must preserve: no worker spawn, start, stop, resize, wakeup, storage write,
readiness signal, peer signal, or metrics emission behavior change.
- Verification: focused memory observability and allocator reclaim controller
tests.
- [x] `BGC-005` Add allocator reclaim controller/status surface.
- Acceptance: allocator reclaim exposes typed desired/status/controller
snapshots and a typed reconcile plan that reports backend, effective force,
idle interval, runtime cancellation, shutdown handle shape, and no-op worker
mutation.
- Must preserve: existing allocator reclaim enablement, backend-specific force
handling, idle-streak logic, metrics emission, runtime-token cancellation,
and startup call shape.
- Verification: focused allocator reclaim tests, compile checks, formatting,
migration guards, Rust risk scan, and pre-commit quality gate.
- [x] `BGC-006` Add metrics runtime controller/status surface.
- Acceptance: metrics runtime exposes typed desired/status/controller
snapshots and a typed reconcile plan that reports observability enablement,
collector task count, configured intervals, runtime cancellation, shutdown
handle shape, and no-op worker mutation.
- Must preserve: existing metrics collector grouping, interval parsing,
replication bandwidth tombstone cycles, metrics emission, runtime-token
cancellation, and startup call shape.
- Verification: focused metrics runtime tests, compile checks, formatting,
migration guards, Rust risk scan, and pre-commit quality gate.
- [x] `TEST-BGC-002` Preserve config reload and shutdown assumptions.
- Acceptance: dynamic server-config reload reports no worker mutation for
scanner/heal runtime config, bucket lifecycle/replication config files are
not dynamic server-config reload targets, and background shutdown keeps
scanner before AHM while preserving the scanner-implies-AHM dependency.
- Must preserve: no scanner, heal, lifecycle, replication, audit, storage
class, peer-signal, readiness, or worker lifecycle behavior change.
- Verification: focused config reload and shutdown tests, compile checks,
formatting, diff hygiene, and Rust risk scan.
## Phase 9 Startup Bootstrap Tasks
- [x] `R-009` Centralize startup IAM readiness publication bootstrap.
- Do: move the ReadyInline/Deferred readiness publication decision behind
`startup_iam::publish_ready_for_iam_bootstrap` and use it from binary and
embedded startup.
- Acceptance: inline IAM bootstrap still waits for runtime readiness and
updates service state, deferred IAM bootstrap does not publish readiness
from main or embedded startup, and embedded runtime readiness failures still
trigger embedded shutdown error mapping.
- Must preserve: startup ordering, IAM degraded recovery ownership,
`IamReady`/`FullReady` publication semantics, and embedded shutdown
behavior.
- Verification: focused startup IAM tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, and pre-commit quality gate.
- [x] `R-010` Centralize startup optional service bootstrap.
- Do: move event notifier, audit startup, and notification system startup
behind `startup_services` helpers with caller-owned logging/error policy.
- Acceptance: binary still initializes the event notifier before audit, logs
audit start/failure through the same startup target, and treats notification
init failure as fatal; embedded still treats audit and notification failures
as non-fatal warnings.
- Must preserve: startup order, audit non-fatal behavior, notification fatal
boundary in binary, embedded warn-and-continue behavior, and event notifier
initialization.
- Verification: focused startup service tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, and pre-commit quality gate.
- [x] `R-011` Centralize startup protocol sidecar bootstrap.
- Do: move FTP, FTPS, WebDAV, and SFTP startup orchestration behind
`startup_protocols::init_protocol_shutdown_senders`.
- Acceptance: feature-gated protocols still return `None` when not compiled
or enabled, started/disabled/failure logging preserves protocol and state
fields, and startup failures still abort binary startup with the same
`Error::other` mapping.
- Must preserve: protocol feature gates, env-driven enable/disable behavior,
startup log event/state/protocol values, shutdown handle ownership, and
existing shutdown ordering.
- Verification: focused startup protocol tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, and pre-commit quality gate.
- [x] `R-012` Centralize startup runtime foundation bootstrap.
- Do: move dial9 runtime status logging, runtime license status logging,
startup logo logging, profiling setup, trusted-proxy setup, rustls provider
setup, and outbound TLS material publication behind
`startup_runtime::init_startup_runtime_foundation`.
- Acceptance: BOOT-006 order is unchanged, configured TLS material load
remains fatal with the same `Error::other(err.to_string())` mapping, TLS
generation remains saturating, TLS metrics still initialize only when
metrics are enabled and TLS is configured, and profiling/proxy/provider
setup remains non-fatal.
- Must preserve: dial9/license log event names and fields, startup logo
logging, profiling init timing, trusted-proxy init timing, crypto provider
already-installed handling, outbound TLS publication, generation metric
consumer, TLS metric init condition, and fatal boundaries.
- Verification: focused startup runtime tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-013` Centralize startup server preflight bootstrap.
- Do: move external-prefix compatibility reporting, config snapshot
initialization, runtime license initialization, observability guard
initialization/storage, and startup runtime foundation bootstrap behind
`startup_preflight::init_startup_server_preflight`.
- Acceptance: env compatibility is applied before command parsing and reported
after observability starts, config snapshot and license init happen before
runtime foundation, observability init failure still emits the dedicated
fatal stderr and sentinel, guard storage failure still returns the original
error, and runtime foundation ordering/fatal boundaries stay unchanged.
- Must preserve: env compat conflict/applied events, observability guard
set/failure events, startup order, fatal stderr suppression sentinel, and
existing command/subcommand behavior.
- Verification: focused startup preflight tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-014` Centralize startup listen and HTTP server bootstrap.
- Do: move server config logging, readiness creation, region/address setup,
default credential warning, global action credentials, global port/address
publication, capacity management, service state manager setup, and
S3/console HTTP server startup behind `startup_server` helpers.
- Acceptance: endpoint/storage initialization still happens after listen
context setup and before HTTP server startup; S3 still disables console
mode; console server still starts only when enabled with a non-empty console
address; global action credential and address error mappings remain
unchanged.
- Must preserve: sanitized config/start/default credential/action credential
log events, region validation, server address/port derivation, global
port/address publication, capacity init timing, service `Starting` update,
S3/console server config shape, and shutdown handle ownership.
- Verification: focused startup server tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-015` Centralize startup storage foundation bootstrap.
- Do: move endpoint parsing, unsupported filesystem policy enforcement, global
endpoint publication, erasure type update, local disk initialization, local
disk ID map prewarm, lock client initialization, and storage pool logging
behind a `startup_storage` helper.
- Acceptance: storage foundation still runs after listen context setup and
before HTTP server startup; endpoint parse errors and local disk init errors
keep the same logging and `Error::other` mappings; global endpoints and
erasure type are published before local disk and lock client setup.
- Must preserve: endpoint parse start/failure events, unsupported filesystem
policy enforcement, global endpoint clone shape, erasure type update timing,
local disk init/prewarm order, lock client setup, storage pool
formatting/host-risk/debug logs, and endpoint pool ownership for later
ECStore startup.
- Verification: focused startup storage tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-016` Centralize startup storage runtime bootstrap.
- Do: move runtime cancellation token creation, ECStore initialization,
ECStore config initialization, server-config migration attempt, global
config retry loop, `StorageReady` stage publication, and background
replication startup behind the `startup_storage` boundary.
- Acceptance: storage runtime still starts after HTTP server startup and
before KMS startup; ECStore init failure keeps the same structured error log
and propagated error; global config init still logs every failed attempt,
sleeps between attempts, and becomes fatal after the 16th failed attempt;
`StorageReady` is still marked after global config init succeeds and before
background replication startup.
- Must preserve: cancellation token ownership for later shutdown, endpoint
pool clone ownership for ECStore startup, ECStore config init/migration
order, retry count/log fields, fatal error string, readiness stage timing,
and non-fatal background replication startup behavior.
- Verification: focused startup storage tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-017` Centralize startup runtime service bootstrap.
- Do: move KMS startup, optional protocol shutdown collection, buffer
profiling, event notifier/audit startup, deadlock detector startup, bucket
metadata migration, replication resync, IAM bootstrap, Keystone/OIDC auth
integration startup, notification runtime setup, AHM/heal setup, server info,
update check, allocator reclaim, metrics runtime, memory observability, and
auto-tuner startup behind the `startup_services` boundary.
- Acceptance: startup service initialization still runs after storage runtime
initialization and before the server-ready log; `main.rs` keeps ownership of
shutdown handling, server-ready publication, global init time, and scanner
start; `startup_services` returns protocol shutdown handles, IAM bootstrap
disposition, and scanner enablement.
- Must preserve: KMS fatal behavior, protocol fatal/disabled behavior, audit
non-fatal behavior, deadlock detector logging, bucket list and replication
resync fatal behavior, bucket/IAM metadata migration non-fatal behavior, IAM
deferred recovery semantics, Keystone parse fatal and runtime non-fatal
behavior, OIDC non-fatal behavior, notification init fatal behavior,
scanner-implies-heal behavior, metric-enabled guard, and shutdown token
ownership.
- Verification: focused startup services tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-018` Centralize startup ready, scanner, and shutdown lifecycle.
- Do: move server-ready logging, IAM readiness publication, global init time,
scanner start, shutdown signal wait, background shutdown ordering, protocol
shutdown, notifier/audit/profiling shutdown, HTTP shutdown, and final stopped
state logging behind the `startup_services` boundary.
- Acceptance: `main.rs` still initializes listen/storage/runtime services in
the same order, then delegates lifecycle completion; `startup_services`
owns the shutdown handles, runtime token, readiness handle, store, and
service runtime needed for ready/scanner/shutdown orchestration.
- Must preserve: server-ready log fields, inline/deferred IAM readiness
behavior, global init time timing, scanner start timing, shutdown signal log,
runtime token cancellation before service-specific shutdown, scanner before
AHM shutdown order, protocol shutdown order, notifier/audit/profiling
shutdown order, HTTP shutdown order, stopped service state, and final stopped
logs.
- Verification: focused startup services tests, binary/lib compile checks,
formatting, migration guards, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-019` Centralize startup command and bootstrap entrypoint.
- Do: move Tokio runtime result handling, command parsing/dispatch, server
preflight error mapping, startup run orchestration, and pre-observability
fatal stderr formatting behind `startup_entrypoint::run_process`.
- Acceptance: `main.rs` only owns the global allocator declarations and calls
the startup entrypoint; `startup_entrypoint` preserves the existing
command, preflight, listen, storage, runtime-service, ready, and shutdown
order.
- Must preserve: Tokio runtime build fatal `expect`, command parse fatal
stderr context and exit code, info/TLS subcommand behavior, observability
fatal sentinel suppression, server runtime failure log fields, startup stage
ordering, readiness publication, and shutdown ownership.
- Verification: focused startup entrypoint and observability guardrail tests,
binary/lib compile checks, formatting, migration guards, Rust risk scan,
branch freshness check, and pre-commit quality gate.
- [x] `R-020` Isolate profiling lifecycle hooks.
- Do: route BOOT-006 profiling initialization and STOP-004 profiling shutdown
through `startup_profiling` hook functions while keeping `profiling.rs` as
the CPU/memory profiling implementation and admin dump API owner.
- Acceptance: startup still initializes profiling before trusted proxies and
outbound TLS material; shutdown still stops profiling after notifier/audit
shutdown and before HTTP shutdown; unsupported targets and disabled
profiling keep their existing no-op behavior.
- Must preserve: profiling env flags, CPU/memory mode handling, target gates,
cancellation-token ownership, admin pprof routes, non-fatal startup
behavior, and shutdown ordering.
- Verification: focused startup profiling hook tests, binary/lib compile
checks, formatting, migration guards, Rust risk scan, branch freshness
check, and pre-commit quality gate.
- [x] `X-012` Define ops profiler extension schema contract.
- Do: add `ops.profiler.v1` capability DTOs for profiler backend status,
capability-description mode, profile export redaction requirements, and
provenance in the extension schema contract crate.
- Acceptance: disabled, unsupported, enabled, and unknown backend states are
representable; execution requests are rejected; profile export declarations
require local path redaction; provenance records source, collection
boundary, and trust level without credentials.
- Must preserve: no plugin execution, no sidecar startup, no profile route or
admin API behavior changes, no exporter/storage/object-path/telemetry
behavior changes, and no dependency edge from `extension-schema` to
implementation crates.
- Verification: extension schema check/tests, formatting, migration/layer
guards, diff hygiene, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `X-013` Add ops profiler capability snapshot contract.
- Do: add `OpsProfilerCapabilitySnapshot` and `OpsProfilerRuntimeSnapshot`
DTOs plus validation for the `ops.profiler.v1` capability, disabled
external runtimes, and non-fatal profiler startup behavior.
- Acceptance: disabled, unsupported, and enabled profiler backend states
round-trip through the snapshot contract; sidecar/Wasm profiler runtimes
remain disabled by default; profiler snapshots cannot declare a startup
fatal boundary.
- Must preserve: no plugin execution, no sidecar startup, no profile route,
no admin API behavior changes, no runtime startup/shutdown behavior
changes, and no dependency edge from `extension-schema` to runtime or
storage implementation crates.
- Verification: extension schema check/tests, formatting, migration/layer
guards, diff hygiene, Rust risk scan, branch freshness check, and
pre-commit quality gate.
- [x] `R-021` Extract optional runtime shutdown boundary.
- Do: add `startup_optional_runtimes` and move optional protocol shutdown
ownership/logging out of `startup_services`.
- Acceptance: optional protocol shutdown plan order stays FTP, FTPS, WebDAV,
SFTP; stopping logs remain before event notifier/audit/profiling shutdown;
signal/wait remains after S3/console HTTP shutdown; later optional
sidecars have an explicit owner without startup behavior changes.
- Must preserve: protocol initialization, protocol shutdown signaling and
waiting, shutdown order, profiling/audit/event notifier shutdown, HTTP
shutdown, readiness state, and fatal boundaries.
- Verification: focused startup optional runtime/service tests, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-022` Extract optional runtime startup boundary.
- Do: add `init_optional_runtime_services` so optional protocol startup is
owned by `startup_optional_runtimes`, while `startup_protocols` remains the
protocol implementation adapter.
- Acceptance: optional protocol startup order stays FTP, FTPS, WebDAV, SFTP;
KMS initialization still happens before optional protocol startup; buffer
profiling, audit, deadlock detection, metadata, IAM, notification, scanner,
heal, and observability startup remain after optional protocol startup.
- Must preserve: protocol feature gates, disabled protocol behavior,
protocol startup error mapping, fatal boundary on protocol startup errors,
startup order, shutdown order, readiness state, and runtime behavior.
- Verification: focused optional runtime/protocol/startup service tests,
RustFS lib check, migration/layer guards, formatting, diff hygiene, Rust
risk scan, branch freshness check, pre-commit quality gate, and
three-expert review.
- [x] `R-023` Extract startup shutdown lifecycle boundary.
- Do: add `startup_shutdown` and move runtime token cancellation, service
state transitions, background shutdown, notifier/audit/profiling shutdown,
HTTP shutdown, and optional runtime wait sequencing out of
`startup_services`.
- Acceptance: shutdown order stays runtime token cancellation, `Stopping`
state, scanner/AHM shutdown, optional runtime shutdown planning,
notifier/audit/profiling shutdown, S3 and console HTTP shutdown, optional
runtime waits, then `Stopped` state.
- Must preserve: service state transitions, readiness state behavior,
scanner/heal enable flag handling, notifier/audit/profiling shutdown logs,
HTTP shutdown ordering, optional protocol shutdown ordering, and fatal
boundaries.
- Verification: focused shutdown/service/optional runtime tests, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-024` Extract startup ready lifecycle boundary.
- Do: add `startup_lifecycle` and move ready publication, global init time,
scanner startup, shutdown-signal wait, shutdown delegation, and final
stopped-state logging out of `startup_services`.
- Acceptance: lifecycle order stays server-ready log, IAM readiness
publication, global init time, optional scanner startup, shutdown wait,
shutdown sequence delegation, and final stopped log.
- Must preserve: inline/deferred IAM readiness behavior, scanner start timing,
global init-time timing, shutdown signal wait semantics, shutdown ordering,
service state reporting, and fatal boundary on readiness publication.
- Verification: focused lifecycle/service/shutdown tests, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-025` Extract startup service component boundary.
- Do: add `startup_service_components` and move audit/deadlock, bucket
metadata, IAM bootstrap, auth integration, notification, background service,
and observability component helpers out of `startup_services`.
- Acceptance: `startup_services` keeps the same runtime service orchestration
order while component helpers own the individual service startup side
effects.
- Must preserve: KMS before optional runtime startup, buffer profiling before
audit, event notifier before audit, bucket metadata before IAM, IAM before
auth and notification, notification before background services, and
observability startup after background service setup.
- Verification: focused startup service component/service/lifecycle tests,
RustFS lib check, migration/layer guards, formatting, diff hygiene, Rust
risk scan, branch freshness check, pre-commit quality gate, and
three-expert review.
- [x] `R-026` Extract optional runtime sidecar boundary.
- Do: add `startup_optional_runtime_sidecars` and move optional runtime
sidecar ownership, shutdown planning, shutdown execution, and protocol
shutdown order tests out of `startup_optional_runtimes`.
- Acceptance: optional protocol startup still happens after KMS and before
buffer profiling, while shutdown planning still records FTP, FTPS, WebDAV,
then SFTP handles before later shutdown signaling.
- Must preserve: feature-gated protocol startup behavior, disabled-protocol
handling, protocol shutdown ordering, HTTP shutdown before optional protocol
shutdown signaling, and the compatibility `startup_optional_runtimes` API.
- Verification: focused optional runtime sidecar/runtime/shutdown tests,
RustFS lib check, migration/layer guards, formatting, diff hygiene, Rust
risk scan, branch freshness check, pre-commit quality gate, and
three-expert review.
- [x] `R-027` Extract startup runtime hook boundary.
- Do: add `startup_runtime_hooks` and move startup runtime diagnostics,
profiling hook dispatch, shutdown profiling dispatch, and default crypto
provider installation out of `startup_runtime` and `startup_profiling`.
- Acceptance: BOOT-006 keeps diagnostics, profiling init, trusted proxy init,
provider install, and outbound TLS material load in the same order, while
STOP-004 still stops profiling through the existing compatibility path.
- Must preserve: startup logo and telemetry/license log behavior, profiling
hook dispatch behavior, rustls provider install behavior, trusted proxy init
order, outbound TLS fatal boundary, and profiling shutdown call path.
- Verification: focused runtime hook/profiling/runtime/shutdown tests, RustFS
lib check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-028` Extract startup TLS material boundary.
- Do: add `startup_tls_material` and move outbound TLS material loading,
global TLS publication, generation recording, TLS metrics initialization,
and existing TLS path/generation tests out of `startup_runtime`.
- Acceptance: BOOT-006 keeps diagnostics, profiling init, trusted proxy init,
provider install, and outbound TLS material load in the same order.
- Must preserve: configured TLS material fatal behavior, TLS path trimming,
saturating TLS generation behavior, outbound TLS global state publication,
generation metric recording, and metrics initialization when observability
metrics are enabled.
- Verification: focused TLS material/runtime tests, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-029` Reuse startup phase boundaries in embedded mode.
- Do: move embedded listen setup, endpoint/local disk setup, ECStore/global
config setup, storage readiness publication, and replication startup behind
startup server/storage helpers.
- Acceptance: embedded startup keeps its stable-port requirement, global
startup guard placement, S3-only HTTP startup, readiness publication, and
storage initialization order while sharing the same startup phase owners.
- Must preserve: embedded port 0 rejection, credential/region publication,
endpoint and unsupported filesystem validation, local disk and lock client
initialization, ECStore fatal shutdown behavior, global config retry limit,
and embedded-specific non-fatal KMS/audit/notification behavior.
- Verification: focused embedded/startup storage checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-030` Reuse runtime service boundaries in embedded mode.
- Do: move embedded KMS/buffer/audit setup, bucket metadata migration, IAM
bootstrap, notification setup, and event/audit shutdown cleanup behind
startup service/shutdown helpers.
- Acceptance: embedded startup keeps KMS/audit/notification failures
non-fatal, preserves bucket metadata and IAM initialization order, and
keeps shutdown cleanup behavior unchanged.
- Must preserve: KMS warning-only behavior, buffer profile initialization,
audit warning-only behavior, bucket listing failure shutdown, bucket
metadata migration before IAM migration, IAM bootstrap fatal behavior,
notification warning-only behavior, readiness publication, event notifier
shutdown, audit stop warning behavior, and temp directory cleanup.
- Verification: focused embedded/service/shutdown checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-031` Reuse lifecycle publication boundaries in embedded mode.
- Do: move embedded IAM readiness publication, global init-time publication,
and ready-state logging behind startup lifecycle helpers.
- Acceptance: embedded startup still publishes readiness after runtime
service setup, preserves the `runtime readiness` error prefix on failure,
records global init time after successful readiness publication, and logs
the same ready endpoint message after the server handle is built.
- Must preserve: deferred IAM bootstrap readiness behavior, ready-inline
runtime readiness publication, startup failure shutdown signaling, global
init-time publication ordering, and endpoint-address normalization used by
the ready log.
- Verification: focused embedded/lifecycle checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-032` Publish ops profiler runtime contract boundaries.
- Do: add the builtin ops profiler extension schema/contract to the targets
catalog, expose it through the admin extension catalog, and add a read-only
registry for profiler backend capability descriptions.
- Acceptance: the catalog advertises `builtin:ops-profiler` with
`ops.profiler.v1`, backend capability descriptions validate through the
extension-schema contract, and registry access is admin/capability limited
without executing profiler collection.
- Must preserve: existing `/debug/pprof/*` admin behavior, profiling startup
and shutdown hooks, disabled external profiler runtime defaults, local path
redaction requirements, and no plugin execution or sidecar startup.
- Verification: focused targets/admin extension checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-033` Expose extension runtime capability snapshots.
- Do: add read-only diagnostics/profiler runtime capability snapshots to the
admin extension catalog response using existing schema and contract DTOs.
- Acceptance: `/v4/extensions/catalog` reports builtin diagnostics and
profiler capability contracts with their runtime boundaries, disabled
defaults, and non-fatal startup flags while preserving schema validation.
- Must preserve: existing extension catalog route/auth, plugin instance
listing, profiler/diagnostics execution paths, and external plugin flow
status semantics.
- Verification: focused admin catalog and targets runtime checks, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-034` Extract embedded runtime hook boundary.
- Do: move embedded observability guard setup, default crypto provider
installation, and trusted proxy initialization behind startup runtime hooks.
- Acceptance: embedded startup keeps observability initialization before the
global startup guard/listen/storage phases while sharing the runtime hook
owner used by normal startup.
- Must preserve: `init_obs` and `set_global_guard` error prefixes, embedded
crypto provider already-installed debug fields, trusted proxy init timing,
and no added embedded server runtime behavior.
- Verification: focused embedded/runtime hook checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-035` Extract embedded shutdown glue boundary.
- Do: move embedded async shutdown logging, cancellation, event/audit cleanup,
HTTP shutdown, and temporary directory cleanup behind startup shutdown
helpers.
- Acceptance: embedded server shutdown preserves the same stopping/stopped
logs, cancellation timing, best-effort audit cleanup, HTTP shutdown, and
temp-dir cleanup behavior while leaving `Drop` as a synchronous best-effort
fallback.
- Must preserve: event notifier shutdown before audit stop, audit stop
warning-only behavior, HTTP shutdown after background cancellation, temp
directory cleanup warning fields, and final stopped log.
- Verification: focused embedded/shutdown checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-036` Extract embedded startup config preparation boundary.
- Do: move embedded temporary volume allocation, custom volume directory
creation, and embedded `Config` construction behind startup server helpers.
- Acceptance: embedded builder still creates a temporary volume when none is
provided, creates missing custom volume directories, disables console for
embedded S3 startup, and keeps the temp-dir guard alive until success.
- Must preserve: temp-dir cleanup-on-failure behavior, configured address,
access key, secret key, region, volume ordering, directory creation error
text, and no new normal startup behavior.
- Verification: focused startup server and embedded checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-037` Extract embedded S3-only HTTP startup boundary.
- Do: move embedded S3-only HTTP server startup behind a startup server
helper that returns the bound address and shutdown handle.
- Acceptance: embedded startup keeps console disabled for the HTTP server,
keeps using the same readiness object, and preserves the shutdown handle
and bound address used by `RustFSServer`.
- Must preserve: S3-only embedded HTTP config, readiness sharing, startup
error propagation, shutdown signaling, bound endpoint reporting, and no
public embedded API behavior changes.
- Verification: focused startup server and embedded checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-038` Extract embedded process-global startup guard boundary.
- Do: move the embedded process-global once guard behind a startup lifecycle
helper.
- Acceptance: embedded startup still allows retry before irreversible global
initialization, treats repeated marks inside the same startup as idempotent,
and rejects a second process-local embedded server after the first
irreversible mark.
- Must preserve: startup guard timing after runtime hooks and listen context,
`AlreadyStarted` error mapping, no reset-after-stop behavior, and no normal
startup behavior changes.
- Verification: focused startup lifecycle and embedded checks, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-039` Extract embedded startup failure shutdown signal boundary.
- Do: move the post-HTTP embedded startup failure shutdown signal behind a
startup shutdown helper.
- Acceptance: embedded startup still signals the HTTP shutdown handle and
cancels the background token before returning initialization errors from
storage runtime, service runtime, or readiness publication failures.
- Must preserve: no shutdown signal before HTTP startup exists, signal-then-
cancel ordering, `Init` error mapping, and no public embedded API behavior
changes.
- Verification: focused startup shutdown and embedded checks, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-040` Extract embedded build orchestration owner.
- Do: move the embedded build sequence behind a crate-only startup embedded
helper.
- Acceptance: embedded startup still runs config preparation, runtime hooks,
listen context, process-global guard, storage foundation, HTTP startup,
storage runtime, runtime services, and readiness publication in the same
order.
- Must preserve: retry-before-global-init behavior, temp-dir guard lifetime,
post-HTTP startup failure shutdown signaling, readiness publication error
text, and no public embedded API behavior changes.
- Verification: focused embedded checks, RustFS lib check, migration/layer
guards, formatting, diff hygiene, Rust risk scan, branch freshness check,
pre-commit quality gate, and three-expert review.
- [x] `R-041` Keep embedded public API as handle assembly.
- Do: keep `embedded.rs` focused on public builder inputs, `RustFSServer`
handle construction, endpoint reporting, shutdown, and drop cleanup.
- Acceptance: builder defaults and fluent setters still feed the same startup
fields, server accessors still return the configured credentials and
region, endpoint normalization stays in the public handle, and shutdown/drop
cleanup remains unchanged.
- Must preserve: `ServerError` variants and messages, `Io` versus `Init`
error mapping, endpoint URL shape, shutdown handle ownership, cancellation
token ownership, and temp-dir cleanup path.
- Verification: focused embedded checks, RustFS lib check, migration/layer
guards, formatting, diff hygiene, Rust risk scan, branch freshness check,
pre-commit quality gate, and three-expert review.
- [x] `R-042` Extract embedded endpoint normalization.
- Do: move unspecified-address endpoint normalization into a crate-only
startup lifecycle helper.
- Acceptance: embedded endpoint reporting still rewrites unspecified IPv4 and
IPv6 bind addresses to localhost while preserving concrete bound hosts.
- Must preserve: public endpoint URL shape, `address()` returning the bound
socket address, ready-log endpoint text, and no public embedded API
signature changes.
- Verification: focused startup lifecycle and embedded checks, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-043` Extract embedded drop cleanup boundary.
- Do: move synchronous embedded server drop cleanup into a crate-only startup
shutdown helper.
- Acceptance: dropping a server still cancels the token, signals the shutdown
handle, and best-effort removes the temporary directory.
- Must preserve: explicit async shutdown behavior, shutdown handle ownership,
temp-dir cleanup behavior, ignored drop cleanup errors, and no public
embedded API signature changes.
- Verification: focused startup shutdown and embedded checks, RustFS lib
check, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-044` Keep embedded builder state in startup args.
- Do: replace duplicated public builder private fields with crate-only
embedded startup arguments while preserving the fluent builder API.
- Acceptance: builder defaults, fluent setters, server credential accessors,
region accessors, and startup arguments remain behaviorally unchanged.
- Must preserve: public builder signatures, default address and credentials,
volume replacement semantics, region publication, and error mapping.
- Verification: focused embedded/startup-embedded checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `R-045` Move embedded port probing behind startup server.
- Do: delegate public embedded available-port probing to a crate-only startup
server helper.
- Acceptance: `find_available_port` still returns a bindable localhost TCP
port and preserves the same public result type.
- Must preserve: public helper signature, localhost bind target, ephemeral
port behavior, and no embedded startup side effects.
- Verification: focused startup-server and embedded checks, RustFS lib check,
migration/layer guards, formatting, diff hygiene, Rust risk scan, branch
freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-001/E-SET-001` Add ECStore layout skeleton and set-layout boundary.
- Do: create the ECStore internal layout ownership buckets and pin static set
layout versus runtime `Sets`/`SetDisks` orchestration boundaries before any
file moves.
- Acceptance: the skeleton documents future ownership buckets, static format
set distribution is preserved, and runtime flat disk plus per-set lock-host
mapping is described by focused tests.
- Must preserve: format distribution, object-to-set hashing owner, local disk
replacement, lock client mapping, existing public module paths, and runtime
`Sets`/`SetDisks` behavior.
- Verification: focused ECStore set layout tests, ECStore/RustFS compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-002/E-LAYOUT-001` Move ECStore format and disk-layout owners.
- Do: pure-move persisted format ownership and disk-layout expansion into
the ECStore layout bucket while keeping compatibility stubs at the old
public paths.
- Acceptance: `crate::disk::format::*` and `crate::disks_layout::*` remain
usable, `layout::format` owns `FormatV3`, and `layout::disks_layout` owns
CLI volume expansion.
- Must preserve: format JSON wire shape, disk UUID lookup, distribution
algorithm, `RUSTFS_ERASURE_SET_DRIVE_COUNT` handling, endpoint expansion,
and old public module paths.
- Verification: focused ECStore format and disks-layout tests,
ECStore/RustFS/Heal compile checks, migration/layer guards, formatting,
diff hygiene, Rust risk scan, branch freshness check, pre-commit quality
gate, and three-expert review.
- [x] `E-003/E-LAYOUT-002` Move ECStore endpoint layout owners.
- Do: pure-move endpoint parsing and endpoint grouping into the ECStore
layout bucket while keeping compatibility stubs at the old public paths.
- Acceptance: `crate::disk::endpoint::*` and `crate::endpoints::*` remain
usable, `layout::endpoint` owns `Endpoint`, and `layout::endpoints` owns
`EndpointServerPools` and endpoint grouping.
- Must preserve: endpoint string parsing, URL/path validation, local-host
detection, pool/set/disk indexes, endpoint grouping, disk independence
checks, setup type classification, and old public module paths.
- Verification: focused ECStore endpoint tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-004/E-LAYOUT-003` Move ECStore set-format heal helpers.
- Do: move runtime-neutral set-format heal helper logic into the ECStore
layout bucket while keeping disk initialization and `Sets` orchestration in
`sets.rs`.
- Acceptance: `layout::set_heal` owns drive-info mapping and unformatted
format regeneration helpers, `Sets` keeps the same heal orchestration, and
focused tests cover the extracted helper behavior.
- Must preserve: disk format heal state mapping, unformatted disk format
regeneration, current disk-info preservation, dry-run behavior, save-format
behavior, and all `Sets` runtime control flow.
- Verification: focused ECStore set-heal tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-005/E-LAYOUT-004` Move ECStore pool-space selection helpers.
- Do: move runtime-neutral pool-space selection helper structs into the
ECStore layout bucket while keeping the old `store` export path available.
- Acceptance: `layout::pool_space` owns `PoolAvailableSpace` and
`ServerPoolsAvailableSpace`, rebalance pool selection keeps the same tuple
storage access inside the crate, and external `store` imports remain
source-compatible through re-export.
- Must preserve: pool index ordering, available-space summation,
max-used-percent filtering semantics, excluded-pool zeroing, object
placement pool selection, and rebalance pool-space behavior.
- Verification: focused ECStore pool-space tests, ECStore/RustFS/Heal
compile checks, migration/layer guards, formatting, diff hygiene, Rust risk
scan, branch freshness check, pre-commit quality gate, and three-expert
review.
- [x] `E-006/E-REBALANCE-001` Move ECStore rebalance support helpers.
- Do: move rebalance-only helper DTOs, pool lookup error classification, and
delete/latest-object result reducers into `store::rebalance::support`
while keeping async store orchestration in the existing modules.
- Acceptance: rebalance callers keep the same `PoolObjInfo`/`PoolErr`
access inside `store`, delete aggregation and latest-object selection keep
the same behavior, and the moved helpers remain private to the rebalance
boundary.
- Must preserve: latest-object tie-breaks, delete result aggregation, pool
lookup not-found/version-not-found classification, rebalance disk-set lookup
error context, object delete flows, and existing rebalance control flow.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-007/E-LAYOUT-005` Move ECStore pool-space builder helpers.
- Do: move `has_space_for` and server-pool available-space construction into
the ECStore layout pool-space owner while keeping `store::has_space_for`
source-compatible through re-export.
- Acceptance: `layout::pool_space` owns capacity checks, pool availability
construction, filter helpers, and focused tests; rebalance only gathers
runtime disk snapshots and calls the layout owner.
- Must preserve: unknown-size handling, erasure fill-fraction math,
inode/free-space guard behavior, meta-bucket capacity bypass, pool index
ordering, available-space summation, and rebalance pool selection.
- Verification: focused ECStore pool-space and rebalance tests,
ECStore/RustFS/Heal compile checks, migration/layer guards, formatting,
diff hygiene, Rust risk scan, branch freshness check, pre-commit quality
gate, and three-expert review.
- [x] `E-008/E-REBALANCE-002` Move ECStore rebalance metadata helpers.
- Do: move rebalance metadata status, bucket queue, terminal event,
participant, cleanup-warning, metadata merge, and stop-state helpers into
`rebalance::meta` while keeping wire structs and ECStore orchestration in
`rebalance.rs`.
- Acceptance: `rebalance::meta` owns the helper functions, `rebalance.rs`
keeps save/load and object-flow orchestration, and focused rebalance tests
keep covering the moved behavior.
- Must preserve: metadata wire shape, stopped/completed/failed precedence,
bucket queue ordering, cleanup-warning merge semantics, participant
resolution, data-usage cache filtering, start/stop validation, and
percent-free goal math.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-009/E-REBALANCE-003` Move ECStore rebalance worker helpers.
- Do: move rebalance worker task/result handling, transient retry
classification, retry timing, bucket config loading, source cleanup
decisions, and listing retry wrappers into `rebalance::worker` while keeping
high-level rebalance orchestration in `rebalance.rs`.
- Acceptance: `rebalance::worker` owns worker helper functions,
`rebalance.rs` keeps orchestration and wire structs, and focused rebalance
tests keep covering the moved behavior.
- Must preserve: worker join error context, transient/terminal error
classification, retry backoff, missing bucket config handling, delete-marker
skip and cleanup decisions, listing retry cancellation behavior, and
migration result accounting.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-010/E-REBALANCE-004` Move ECStore rebalance migration helpers.
- Do: move migration backend abstraction, migration version result,
delete-marker/remote-tier option builders, and version migration retry flow
into `rebalance::migration` while keeping high-level rebalance orchestration
in `rebalance.rs`.
- Acceptance: `rebalance::migration` owns migration helper functions and
result types, `rebalance.rs` keeps orchestration and wire structs, and
focused rebalance tests keep covering moved behavior.
- Must preserve: remote-tier object movement, delete-marker replication
state, data-usage cache skip behavior, source read/write retry semantics,
transient/non-transient classification, retry backoff, not-found handling,
migration stage labels, and cleanup accounting.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-011/E-REBALANCE-005` Move ECStore rebalance state impls.
- Do: move `RebalanceStats` update helpers, `RebalStatus` conversions, and
`RebalanceMeta` load/save impls into `rebalance::meta` while leaving public
wire structs in `rebalance.rs`.
- Acceptance: `rebalance::meta` owns metadata/state behavior, `rebalance.rs`
keeps data contracts and ECStore orchestration, and focused rebalance tests
keep covering moved behavior.
- Must preserve: serialized rebalance metadata header format/version,
empty/short/unknown metadata handling, last refresh timestamps, save-skip
behavior for empty pool stats, object/version/byte accounting, batch update
behavior, status display labels, and legacy status byte mapping.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-012/E-REBALANCE-006` Move ECStore rebalance control impls.
- Do: move ECStore rebalance metadata save/load/update/init/status/stop
control methods into `rebalance::control` while leaving the worker loop and
entry migration orchestration in `rebalance.rs`.
- Acceptance: `rebalance::control` owns metadata/control methods,
`rebalance.rs` keeps public data contracts and worker orchestration, and
focused rebalance tests keep covering moved behavior.
- Must preserve: metadata merge locking, load/save error wrapping, pool stats
refresh and extension, init free-space goal, pool stat update behavior,
bucket queue done/defer behavior, cleanup warning recording, start/stop
status checks, decommission conflict checks, and stop snapshot persistence.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-013/E-REBALANCE-007` Move ECStore rebalance runtime loop.
- Do: move `start_rebalance`, the pool rebalance worker loop, completion
check, and periodic stats save loop into `rebalance::runtime` while leaving
entry/object/bucket migration orchestration in `rebalance.rs`.
- Acceptance: `rebalance::runtime` owns start and pool runtime orchestration,
`rebalance.rs` keeps public data contracts and entry/object/bucket
migration flow, and focused rebalance tests keep covering moved behavior.
- Must preserve: decommission/start validation, duplicate-start skipping,
pool-at-goal and empty-queue completion persistence, participant/local
endpoint filtering, cancellation handling, deferred-bucket repeated failure
guard, bucket done/defer behavior, terminal event application, save-task
error precedence, goal completion math, and save option persistence.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-014/E-REBALANCE-008` Move ECStore rebalance entry flow.
- Do: move the remaining entry, object-transfer, deferred-error, and bucket
entry-scan migration flow into `rebalance::entry` while leaving public data
contracts in `rebalance.rs`.
- Acceptance: `rebalance::entry` owns bucket/entry migration flow,
`rebalance::runtime` keeps pool-level orchestration, and focused rebalance
tests keep covering moved behavior.
- Must preserve: directory and completed-pool skips, lifecycle-expired
filtering, delete-marker skip semantics, data-movement retry flow, deferred
transient failure recording, batch stats updates, source cleanup warning
recording, entry worker semaphore limits, cancellation handling, listing
retry flow, and bucket outcome precedence.
- Verification: focused ECStore rebalance tests, ECStore/RustFS/Heal compile
checks, migration/layer guards, formatting, diff hygiene, Rust risk scan,
branch freshness check, pre-commit quality gate, and three-expert review.
- [x] `E-015/E-REBALANCE-009` Split ECStore rebalance unit tests.
- Do: move the large inline `rebalance_unit_tests` module out of
`rebalance.rs` into `rebalance/rebalance_unit_tests.rs` while preserving
the module name and test filter path.
- Acceptance: `rebalance.rs` is reduced to public rebalance data contracts
plus submodule wiring, rebalance unit tests remain under
`rebalance::rebalance_unit_tests`, and focused rebalance tests keep covering
moved behavior.
- Must preserve: test coverage, helper visibility, legacy metadata
serialization coverage, migration backend spies, panic-context tests, and
every existing rebalance unit-test filter path.
- Verification: focused ECStore rebalance tests, migration/layer guards,
formatting, diff hygiene, Rust risk scan, branch freshness check,
pre-commit quality gate, and three-expert review.
- [x] `E-016/E-REBALANCE-010` Move ECStore rebalance type contracts.
- Do: move rebalance stats, status, info, metadata DTOs, and internal
bucket/entry outcomes into `rebalance::types` while preserving root
re-exports.
- Acceptance: public `crate::rebalance::*` paths remain stable, internal
submodules keep `super::...` access, and `rebalance.rs` only wires shared
constants, modules, and re-exports.
- Must preserve: serde field names/defaults, rebalance metadata wire shape,
status/save-option defaults, cancellation/refresh metadata fields, and
internal bucket/entry outcome semantics.
- Verification: focused ECStore rebalance tests, migration/layer guards,
formatting, diff hygiene, Rust risk scan, branch freshness check,
pre-commit quality gate, and three-expert review.
## Next PRs
1. `pure-move`: continue pruning residual embedded builder/startup-only
boundaries after the embedded builder shell slice lands.
## Pre-Push Review Log
| Expert | Status | Notes |
|---|---|---|
| Quality/architecture | passed | R-044 and R-045 keep the public embedded builder as a thin shell over crate-only startup args and move port probing behind startup-server helpers without widening the public API. |
| Migration preservation | passed | Builder defaults, fluent setters, volume replacement, credential/region accessors, public port helper signature, and localhost ephemeral port behavior stay unchanged. |
| Testing/verification | passed | Focused embedded/startup-embedded/startup-server checks, RustFS lib check, architecture/layer/unsafe guards, formatting, diff hygiene, Rust risk scan, and pre-commit gate passed. |
## Verification Notes
Passed before push:
- Issue #660 R-044/R-045 current slice:
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_embedded -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_server -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- Rust risk scan on changed Rust files: passed; matches were limited to
existing doc examples and test-only `expect` calls.
- `./scripts/check_unsafe_code_allowances.sh`: passed after avoiding a local
`pipefail` false positive when `rg -q` finds nearby `SAFETY:` comments.
- `make pre-commit`: passed.
- Issue #660 R-042/R-043 current slice:
- `cargo test -p rustfs --lib startup_lifecycle -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; the only production risky
token was the intended move of embedded drop `remove_dir_all` cleanup from
the public embedded handle into `startup_shutdown`.
- `./scripts/check_unsafe_code_allowances.sh`: passed.
- `make pre-commit`: passed.
- Issue #660 R-040/R-041 current slice:
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; newly added risky-token
matches were empty, and the changed-file scan only matched the existing
embedded `Drop` cleanup path.
- `make pre-commit`: passed.
- Issue #660 R-038/R-039 current slice:
- `cargo test -p rustfs --lib startup_lifecycle -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: reviewed; newly added risky-token
matches were limited to test-only `expect` calls, and broader changed-file
matches were pre-existing lifecycle/doc examples plus cleanup paths.
- `make pre-commit`: passed.
- Issue #660 R-036/R-037 current slice:
- `cargo test -p rustfs --lib startup_server -- --nocapture`: passed.
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only test-only
`expect` calls and the existing embedded temp-dir cleanup path were
present.
- `make pre-commit`: passed.
- Issue #660 R-034/R-035 current slice:
- `cargo test -p rustfs --lib startup_runtime_hooks -- --nocapture`:
passed.
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed; no
matching unit tests currently exist.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only existing default
credential fields and moved temp-dir cleanup paths were present.
- `make pre-commit`: passed.
- Issue #660 R-031 current slice:
- `cargo test -p rustfs --lib startup_lifecycle -- --nocapture`: passed;
no matching unit tests currently exist.
- `cargo test -p rustfs --lib embedded -- --nocapture`: passed; no
matching unit tests currently exist.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only existing embedded doc
examples use `Box<dyn Error>` / `println!`.
- `make pre-commit`: passed.
- Issue #660 R-032 current slice:
- `cargo test -p rustfs-targets ops_profiler -- --nocapture`: passed.
- `cargo test -p rustfs-targets builtin_ops_profiler -- --nocapture`:
passed.
- `cargo test -p rustfs --lib extension_catalog -- --nocapture`: passed.
- `cargo check -p rustfs-targets`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only test-only
expectations/assertion paths were present.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-033 current slice:
- `cargo test -p rustfs --lib extension_catalog -- --nocapture`: passed.
- `cargo test -p rustfs-targets ops_diagnostics -- --nocapture`: passed.
- `cargo test -p rustfs-targets ops_profiler -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only test-only
expectations/assertion paths were present.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-001/E-SET-001 current slice:
- `cargo test -p rustfs-ecstore test_eset -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only test-only
expectation paths were present.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-002/E-LAYOUT-001 current slice:
- `cargo test -p rustfs-ecstore format::test -- --nocapture`: passed.
- `cargo test -p rustfs-ecstore disks_layout -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only existing test-only
unwrap/println/panic/expect paths were present.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-003/E-LAYOUT-002 current slice:
- `cargo test -p rustfs-ecstore layout::endpoint -- --nocapture`: passed.
- `cargo test -p rustfs-ecstore layout::endpoints -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only existing endpoint
production/test unwrap and expectation paths were moved.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-004/E-LAYOUT-003 current slice:
- `cargo test -p rustfs-ecstore layout::set_heal -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only test-only unwrap
expectations were added around deterministic helper construction.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-005/E-LAYOUT-004 current slice:
- `cargo test -p rustfs-ecstore layout::pool_space -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; only existing `store.rs`
test-only `expect` calls and an existing `Result<String>` method signature
were present outside the moved helper body.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-006/E-REBALANCE-001 current slice:
- `cargo test -p rustfs-ecstore store::rebalance -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; no risky added lines were
introduced.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-007/E-LAYOUT-005 current slice:
- `cargo test -p rustfs-ecstore layout::pool_space -- --nocapture`: passed.
- `cargo test -p rustfs-ecstore store::rebalance -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; added cast lines are moved
capacity math from the existing implementation.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-008/E-REBALANCE-002 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-009/E-REBALANCE-003 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-012/E-REBALANCE-006 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; added casts are moved
pool-index accounting from the existing implementation and remain guarded.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-013/E-REBALANCE-007 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; moved casts are existing
pool completion math and remain guarded.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-014/E-REBALANCE-008 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; moved casts and unwraps are
existing test or migration-flow code and remain guarded.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-015/E-REBALANCE-009 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `./scripts/check_unsafe_code_allowances.sh`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; the runtime diff is a test
module move plus a SAFETY-comment proximity fix required by the guard.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 E-016/E-REBALANCE-010 current slice:
- `cargo test -p rustfs-ecstore rebalance::rebalance_unit_tests -- --nocapture`: passed.
- `cargo check -p rustfs-ecstore -p rustfs -p rustfs-heal`: passed.
- `./scripts/check_unsafe_code_allowances.sh`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed; production changes are a
type-contract move and existing Windows FFI casts remain unchanged.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 X-012 current slice:
- `cargo test -p rustfs-extension-schema`: passed.
- `cargo check -p rustfs-extension-schema`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 X-013 current slice:
- `cargo test -p rustfs-extension-schema`: passed.
- `cargo check -p rustfs-extension-schema`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-021 current slice:
- `cargo test -p rustfs --lib startup_optional_runtimes -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_services -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-022 current slice:
- `cargo test -p rustfs --lib startup_optional_runtimes -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_protocols -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_services -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-023 current slice:
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_services -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_optional_runtimes -- --nocapture`:
passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-024 current slice:
- `cargo test -p rustfs --lib startup_lifecycle -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_services -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-025 current slice:
- `cargo test -p rustfs --lib startup_service_components -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_services -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_lifecycle -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-026 current slice:
- `cargo test -p rustfs --lib startup_optional_runtime_sidecars -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_optional_runtimes -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-027 current slice:
- `cargo test -p rustfs --lib startup_runtime_hooks -- --nocapture`:
passed.
- `cargo test -p rustfs --lib startup_profiling -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_runtime -- --nocapture`: passed.
- `cargo test -p rustfs --lib startup_shutdown -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 R-020 current slice:
- `cargo test -p rustfs --lib startup_profiling -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan on changed Rust files: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 API-056/R-016 current slice:
- `cargo test -p rustfs --lib runtime_capabilities -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 API-055/SCH-001 current slice:
- `cargo test -p rustfs --lib storage::concurrency::manager::integration_tests -- --nocapture`: passed.
- `cargo check -p rustfs --lib`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 PR-05/PR-07 current slice:
- `cargo test -p rustfs-concurrency --no-fail-fast`: passed.
- `cargo check -p rustfs-concurrency`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- Issue #660 PR-08/PR-09 current slice:
- `cargo test -p rustfs-storage-api`: passed.
- `cargo check -p rustfs-storage-api`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `make pre-commit`: passed.
- Three-expert review: passed.
- G-011/G-012/G-013 current slice:
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `git diff --check`: passed.
- Three-expert review: passed.
- Full `make pre-commit`: not run because this slice is documentation-only.
- API-054 current slice:
- `cargo check -p rustfs --lib`: passed.
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; only existing import and path rewrites were
reviewed, with no new unwrap/expect, panic/todo/unsafe, risky casts,
ad-hoc error construction, or sensitive-token handling semantics.
- API-053 current slice:
- `cargo check -p rustfs --lib`: passed.
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; only existing import and path rewrites were
reviewed, with no new unwrap/expect, panic/todo/unsafe, risky casts,
ad-hoc error construction, or sensitive-token handling semantics.
- `make pre-commit`: passed.
- API-052 current slice:
- `cargo check -p rustfs --lib`: passed.
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; only existing-semantic path replacement hits were
reviewed, with no new unwrap/expect, panic/todo/unsafe, risky casts,
ad-hoc error construction, or sensitive-token handling semantics.
- `make pre-commit`: passed, including 6250 nextest tests and doctests.
- API-050 current slice:
- `cargo test -p rustfs-storage-api lifecycle_helper_defaults_preserve_existing_contracts --no-fail-fast`:
passed.
- `cargo check --tests -p rustfs-storage-api -p rustfs-ecstore -p rustfs-notify`:
passed.
- `cargo test -p rustfs-ecstore transitioned --no-fail-fast`: passed.
- `cargo test -p rustfs-notify ecstore_object_info_conversion_preserves_notify_event_fields --no-fail-fast`:
passed.
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, panic/todo/unsafe, risky
casts, ad-hoc error construction, or sensitive-token handling in added
lines.
- `make pre-commit`: passed.
- API-051 current slice:
- `cargo check --tests -p e2e_test -p rustfs-heal -p rustfs-scanner`:
passed.
- `cargo check --manifest-path fuzz/Cargo.toml --all-targets`: passed.
- `cargo test -p rustfs-heal --test endpoint_index_test test_endpoint_index_settings --no-fail-fast`:
passed.
- `cargo test -p rustfs-scanner --test lifecycle_integration_test --no-run`:
passed.
- `cargo test -p e2e_test --no-run`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; only existing test `unwrap` calls were touched by
import path rewrites, with no new unwrap/expect, panic/todo/unsafe, risky
casts, ad-hoc error construction, or sensitive-token handling semantics.
- `make pre-commit`: passed.
- S-015 current slice:
- `cargo test -p rustfs-policy test_legacy_kms_admin_actions_are_rejected --no-fail-fast`:
passed.
- `cargo test -p rustfs kms_key_auth_actions_use_dedicated_kms_actions --no-fail-fast`:
passed.
- `cargo test -p rustfs route_policy_records_dedicated_kms_actions --no-fail-fast`:
passed.
- `cargo test -p rustfs route_policy_rejects_server_info_for_sensitive_kms_actions --no-fail-fast`:
passed.
- `cargo check --tests -p rustfs-policy -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- `make pre-commit`: passed.
- S-014 previous slice:
- `cargo test -p rustfs kms_key_auth_actions_use_dedicated_kms_actions --no-fail-fast`:
passed.
- `cargo test -p rustfs route_policy_records_dedicated_kms_actions --no-fail-fast`:
passed.
- `cargo test -p rustfs route_policy_rejects_server_info_for_sensitive_kms_actions --no-fail-fast`:
passed.
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Source marker scan: passed; no non-doc `RUSTFS_COMPAT_TODO` markers remain.
- Rust risk scan: passed; no new unwrap/expect, panic/todo/unsafe, risky
casts, ad-hoc error construction, or sensitive-token handling in added
lines.
- `make pre-commit`: passed.
- API-049 current slice:
- `cargo check --tests -p rustfs-heal -p rustfs-scanner -p e2e_test`:
passed.
- `cargo check --manifest-path fuzz/Cargo.toml --all-targets`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, panic/todo/unsafe, risky
casts, ad-hoc error construction, or sensitive-token handling in added
lines.
- `make pre-commit`: passed.
- API-048 current slice:
- `cargo check --tests -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- Rust risk scan: passed; no new unwrap/expect, panic/todo/unsafe, risky
casts, ad-hoc error construction, or sensitive-token handling in added
lines.
- `make pre-commit`: passed.
- API-047 current slice:
- `cargo check --tests -p rustfs-heal -p rustfs-scanner`: passed.
- `cargo test -p rustfs-heal -p rustfs-scanner`: passed, 290 tests passed
and 14 ignored.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; the only match was a test-only scanner config init
re-export.
- API-046 current slice:
- `cargo check --tests -p rustfs-iam -p rustfs-protos`: passed.
- `cargo test -p rustfs-iam`: passed, 150 tests.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: reviewed added lines; only existing error-mapping behavior
was renamed to IAM-local compatibility aliases.
- `make pre-commit`: passed.
- API-042 current slice:
- `cargo check --tests -p rustfs-notify -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
- API-043 current slice:
- `cargo test -p rustfs-notify
storage_compat::tests::ecstore_object_info_conversion_preserves_notify_event_fields`:
passed.
- `cargo check --tests -p rustfs-notify -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed, including 6245 nextest tests passed and 111
skipped.
- API-044 current slice:
- `cargo check --tests -p rustfs-s3select-api -p rustfs-notify -p
rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed, including 6245 nextest tests passed and 111
skipped.
- API-045 current slice:
- `cargo check --tests -p rustfs-obs -p rustfs-s3select-api -p
rustfs-notify -p rustfs`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed, including 6245 nextest tests passed and 111
skipped.
- API-041 current slice:
- `bash -n scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no Rust code changed.
- `make pre-commit`: passed.
- API-040 current slice:
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
- API-039 current slice:
- `cargo check --tests -p rustfs -p rustfs-scanner -p rustfs-heal -p rustfs-protocols -p rustfs-s3select-api -p rustfs-iam -p rustfs-notify`:
passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
- API-038 current slice:
- `cargo check --tests -p rustfs -p rustfs-scanner -p rustfs-heal -p rustfs-protocols -p rustfs-s3select-api -p rustfs-iam -p rustfs-notify`:
passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
- API-037 current slice:
- `cargo check --tests -p rustfs-ecstore -p rustfs -p rustfs-scanner`:
passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
- API-036 current slice:
- `cargo test -p rustfs-storage-api`: passed.
- `cargo check --tests -p rustfs-storage-api -p rustfs-ecstore -p rustfs-scanner -p rustfs`:
passed.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
API-035 prior slice:
- `cargo check --tests -p rustfs-scanner -p rustfs-heal -p rustfs-iam`:
passed.
- `cargo check --tests -p rustfs-protocols --features swift`: passed.
- `cargo check --tests -p rustfs -p rustfs-scanner -p rustfs-heal -p rustfs-iam -p rustfs-notify -p rustfs-obs -p rustfs-s3select-api -p e2e_test`:
passed.
- `cargo check --manifest-path fuzz/Cargo.toml --bins`: passed.
- `rg -n 'rustfs_ecstore' crates/scanner/src crates/heal/src crates/protocols/src/swift crates/iam/src/store --glob '*.rs'`:
remaining matches are deliberate compatibility boundary definitions.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: passed; no new unwrap/expect, numeric casts, string error
public APIs, boxed public errors, production println/eprintln, or relaxed
ordering introduced in changed Rust files.
- `make pre-commit`: passed.
Earlier API-033 verification retained in prior branch/PR:
- `cargo check --tests -p rustfs -p rustfs-obs -p rustfs-notify -p rustfs-s3select-api -p rustfs-iam`:
passed.
- `cargo check --manifest-path fuzz/Cargo.toml --bins`: passed.
- `rg -n 'rustfs_ecstore' rustfs/src crates/obs/src crates/notify/src crates/s3select-api/src crates/iam/src --glob '*.rs'`:
remaining matches are deliberate compatibility boundary definitions.
- Direct import scan for target scanner/heal/e2e/fuzz paths: passed; remaining
matches are deliberate compatibility boundary definitions.
- `./scripts/check_architecture_migration_rules.sh`: passed.
- `./scripts/check_layer_dependencies.sh`: passed.
- `cargo fmt --all --check`: passed.
- `git diff --check`: passed.
- Rust risk scan: reviewed added `.unwrap()` matches as preserved test setup
unwraps caused by path rewrite formatting; no new risky behavior added.
- `make pre-commit`: passed.
Notes:
- This larger slice is based on `origin/main` after `rustfs/rustfs#3572`
merged.
- Direct ECStore imports in the target runtime/obs/notify/S3 Select/IAM and
scanner/heal/e2e/fuzz areas now remain only in local compatibility boundary
modules.
- The slice does not alter startup behavior, readiness behavior, table catalog
object I/O, notification persistence, S3 Select reads, IAM error mapping,
observability metrics, test/fuzz semantics, or ECStore definitions.
## Handoff Notes
- Continue with larger consumer-migration batches outside the cleaned
app/storage/admin/scanner/heal/Swift/runtime/obs/notify/S3 Select/IAM/test
and fuzz boundaries; keep ECStore-owned behavior in ECStore until concrete
behavior is isolated enough for a pure-move slice.