railiance-master/workplans/RMASTER-WP-0022-establish-reef-storage.md
codex 654bbe891b feat: allow provider-delegated reefs with no rail
Object-storage reefs omit primary_rail and hosted_rails. Scaleway
operates S3; reef-storage only names the boundary. Finish
RMASTER-WP-0022.
2026-08-14 15:53:30 +02:00

136 lines
4.4 KiB
Markdown

---
id: RMASTER-WP-0022
type: workplan
title: "Establish reef-storage for Scaleway object storage"
domain: financials
repo: railiance-master
status: finished
owner: grok
topic_slug: railiance
created: "2026-08-14"
updated: "2026-08-14"
related:
- RMASTER-WP-0017
- RMASTER-WP-0021
- RESOURCE-WP-0002
- RESOURCE-WP-0006
state_hub_workstream_id: "b63b9d6b-deb5-4f13-b6db-12da6f7bd644"
---
# RMASTER-WP-0022 — establish reef-storage
## Goal
Create `reef-storage` as the reef that **operates** S3-compatible object
storage (first instance: Scaleway, for postgres backup). This is a
different substrate from `reef-railiance`. Backup will not be provided on
top of the home compute reef.
`resource-control` procures and costs the bucket. `reef-storage` owns the
committed non-secret operating attributes (endpoint, bucket, region,
prefix, lifecycle). `railiance-platform` holds the secret.
`rapp-postgres` consumes a reviewed destination.
Join convention: `resource-control/docs/operational-reference-convention.md`
(`reef:storage/…#key`).
## Why a new reef
`docs/reef-substrate-model.md`: a reef is one durable operational
boundary. Scaleway object storage has its own identity, access path,
lifecycle, and failure domain (`provider:scaleway` / `region:nl-ams`).
Putting a bucket “on” `reef-railiance` would mix a cloud object store into
a Host Europe compute substrate and hide the independent failure domain
the backup workplan requires.
## Schema tension
The current `reef.schema.json` requires `primary_rail` and
`hosted_rails`. A storage reef does not host `rail-kubernetes`. This
workplan must either:
- allow a storage substrate with no rail (preferred), or
- introduce a storage execution contract later, not as a fake rail.
Do not list `rail-kubernetes` as hosted just to satisfy the schema.
## Intended declaration (planned)
```yaml
kind: substrate-reef
reef_id: reef-storage
repo: reef-storage
ownership_repo: railiance-platform
substrate_kind: object-storage
lifecycle_state: planned
criticality: high
# primary_rail / hosted_rails: omitted or schema-extended — see T01
current_members: [] # fill with Scaleway project/bucket names after purchase
```
Non-secret attributes live under e.g.
`substrate/object-stores/<resource-slug>.yaml` so resource-control can cite
`reef:storage/substrate/object-stores/platform-audit-storage.yaml#endpoint`.
## T01 — Extend the reef schema for storage substrates
```task
id: RMASTER-WP-0022-T01
status: done
priority: high
state_hub_task_id: "c222e439-795d-45bb-ba81-b94b2a571a1c"
```
Amend `schemas/reef.schema.json` and
`docs/reef-substrate-model.md` so a reef may be an object-storage (or
other provider-managed) substrate without hosting a compute rail.
Document `substrate_kind: object-storage`. Keep `reef-railiance` valid.
Done when a planned `reef-storage` declaration validates and
`reef-railiance` still validates.
Completed 2026-08-14: `primary_rail` / `hosted_rails` optional; empty
`current_members` allowed; substrate model documents provider-delegated
reefs with no rail. Confirmed: no rail — Scaleway operates S3.
## T02 — Bootstrap the reef-storage repo
```task
id: RMASTER-WP-0022-T02
status: done
priority: high
state_hub_task_id: "61617b38-27b5-4c44-be8a-244a2476f1eb"
```
Materialize `reef-storage` from the first-wave bootstrap contract:
classification, INTENT, SCOPE, AGENTS, `declarations/reef.yaml`, empty
attribute file layout, workplans. Register the remote. Do not create a
Scaleway account in this task.
Done when the repo exists, declares `lifecycle_state: planned`, and
resource-control can name `reef:storage/…` paths that will be filled after
purchase.
Completed 2026-08-14: operator provided the repo; declaration, INTENT,
SCOPE, and planned attribute path committed.
## T03 — Attribute file contract for object stores
```task
id: RMASTER-WP-0022-T03
status: done
priority: medium
state_hub_task_id: "6ea318c4-33e5-4177-9f87-433670636304"
```
Define the committed YAML shape for one object-store: endpoint, region,
bucket, prefix, versioning/lifecycle flags, provider project ref. No
keys. Hand resource-control and `rapp-postgres` the path, not a chat
paste.
Done when a schema or documented example exists and WP-0002 T03 can cite
it as the destination of non-secret attributes after buy.
Completed 2026-08-14:
`reef-storage/schemas/object-store-attributes.schema.json` and planned
`substrate/object-stores/platform-audit-storage.yaml`.