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, and check_component_drift.py --all passes.

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 onto 0f8054f2bd, where two files conflicted: this story's layer page, which had gained a telemetry section on main beside 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.storage for this pass. It carries the component's only platform conditional and it duplicates ores.compute.wrapper's own copy, so the audit's platform-placement rule and the duplicate rule point at the same fix: one archiver, in ores.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_client and filesystem::archiver stay public even though nothing outside the component includes them. Their intended consumer is storage_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_TEST lists catalogue components, and a component with no entity model has no catalogue row, so the drift gate cannot name ores.storage at 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-data bucket 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.

Emacs 29.3 (Org mode 9.6.15)