Story: Clean ores.storage to the component clean standard
Table of Contents
This page documents a story in Sprint 26. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
ores.storage meets the Component Clean Standard: the items marked All pass, each item that does not apply is recorded with its reason, and ores.storage joins COMPONENTS_UNDER_TEST. Order 6 of 35 in the sprint 26 component clean-up, tier 1 (foundation infrastructure).
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 26 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. The interface work this pass deliberately left out is a story of its own: Give object storage a NATS and HTTP interface with authentication. |
| Last touched | 2026-09-26 |
| End | 2026-09-26 |
3. Acceptance
- Every checklist item that applies to a component of kind All passes, with its evidence recorded on the task.
- Every item that does not apply is recorded as not applicable, with the reason.
- Every generator defect found is fixed at its source, with a regression test.
- ores.storage is listed in
COMPONENTS_UNDER_TEST, andcheck_component_drift.py --allpasses.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Bring ores.storage to the clean standard | DONE | 2026-09-26 | 2026-09-26 | Work ores.storage through the Component Clean Standard in order and record each item. |
5. Notes
- Survey on 2026-09-23: 0 entity, junction or operation models; 9 C++ files outside tests, 0 of them generated (0%); 0 messaging headers, 0 of them hand-written.
- Closed in PR #2174, merged as
b79609d808; the remote branch was deleted by the merge and the local branch with it. The PR merged after a rebase onto0f8054f2bd, where two files conflicted: this story's layer page, which had gained a telemetry section onmainbeside the storage one this pass added, and the generated backlog index. - The pass side-loaded documentation it did not set out to write: the Object Storage target state, three defect captures, the Data storage hub, and one capture for the doc-lint gap the pass exposed.
6. Decisions
- The archiver stays in
ores.storagefor this pass. It carries the component's only platform conditional and it duplicatesores.compute.wrapper's own copy, so the audit's platform-placement rule and the duplicate rule point at the same fix: one archiver, inores.platform::filesystem, where the platform concern belongs. It is not done here because that would add libarchive to a foundation component and rewrite the tree of an already-closed clean pass. The capture Consolidate the duplicated tarball archivers into one shared utility owns the move. net::http_clientandfilesystem::archiverstay public even though nothing outside the component includes them. Their intended consumer isstorage_transfer, which composes both, and the cross-component captures want them as the survivor of the consolidation rather than as a private detail to be hidden first.- V06 is an accepted exception rather than a pass.
COMPONENTS_UNDER_TESTlists catalogue components, and a component with no entity model has no catalogue row, so the drift gate cannot nameores.storageat all. The standard records the same gap for the whole infrastructure tier. - The temporary-file migration from Migrate the remaining temp path call sites to the shared scoped temp types lands here rather than in a pass of its own, because that capture assigns each call site to the clean-up story of the component that holds it.
7. Out of scope
- The interface itself. The pass records that the component is model-free: it has no protocol, no handler, no permission codes and no shell commands, and its shell verbs are hand-written and named after the consumers that happen to call it. Giving it a NATS surface and an HTTP surface, authenticated on both, is the story Give object storage a NATS and HTTP interface with authentication.
- Authentication. The storage routes never call
auth_required(), so the route default is public and an unauthenticated write succeeds. That is a property of the surface, so it belongs to the interface story above rather than to this pass, which saw the client half only. - The bucket allow-list. The server accepts a hardcoded pair of names, which is an unowned literal that has already drifted from its consumers, and which owner should hold it is open in Object Storage.
- The defects found while reading the component, each with its own capture in
the product backlog inbox: the
report-databucket the server refuses, the three services whose storage base URL names a port the server does not use, and the shell recipe inventory that ships conflict markers its gate cannot see.