* test(s3/lifecycle): Layer 2 multi-shard composition for the dispatcher
The existing dispatcher unit tests cover individual outcomes
(DONE / RETRY_LATER / BLOCKED / etc.) on a single shard, and
pipeline_test.go has only one end-to-end happy-path assertion.
Multi-shard composition — the contract Pipeline.Run wires up at
runtime — was untested at the component level.
Add four Layer 2 tests in dispatcher/multi_shard_test.go:
Two events for two shards land in different schedules, dispatch
independently, and each cursor advances only for its own event
(no cross-contamination on the action-key map).
A poison event on shard 0 returns BLOCKED and freezes shard 0's
cursor; shard 1's normal event continues to dispatch and its
cursor advances. Per-shard isolation contract.
Save/Load round-trips a per-shard cursor snapshot through the
Persister: a fresh dispatcher restores the same TsNs map. Pins
the contract Pipeline.Run drives on the checkpoint ticker.
RETRY_LATER respects RetryBackoff against the wall clock — a
Tick within the backoff window doesn't re-dispatch; a Tick past
the new DueTime does. Guards against premature retries from
refresh ticks landing inside the backoff.
Pipeline.Run itself can't run here (it builds a real reader.Reader),
so the tests share the same fakeClient pattern dispatcher_test.go
uses and drive Tick directly.
* test(s3/lifecycle): drop unused snapshot helper and addAndTick parameter
see https://blog.aqwari.net/xml-schema-go/
1. go get aqwari.net/xml/cmd/xsdgen
2. Add EncodingType element for ListBucketResult in AmazonS3.xsd
3. xsdgen -o s3api_xsd_generated.go -pkg s3api AmazonS3.xsd
4. Remove empty Grantee struct in s3api_xsd_generated.go
5. Remove xmlns: sed s'/http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/\ //' s3api_xsd_generated.go