From da32e70633f1a7a73fbc481ccafba9dea58c0624 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Sun, 13 Sep 2026 01:39:27 +0000 Subject: [PATCH] OpenServer: memory and gpu at the top level, range on any block Three additions from the OpenCPU, OpenMemory, OpenGPU and OpenBandwidth session, none renaming a unit. An offer may carry a memory block and a gpu block at its top level, each winning over the compute copy when both are present, so a resource spec's own shape nests without a translation. Any resource block may carry a range, what a buyer can dial at checkout, with its own per-unit price. ipv6 may be a prefix string, read as true, and a provider selling one resource may serve the same descriptor at the resource's own well-known name. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Khk1C6Ese6xjdHAWLVstca --- docs/openserver.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/openserver.md b/docs/openserver.md index 73d40ad..7a45360 100644 --- a/docs/openserver.md +++ b/docs/openserver.md @@ -46,7 +46,7 @@ A provider serves a JSON document at `/.well-known/openserver.json` on its own o "tenancy": "shared", "model": "centralized", "location": { "regions": ["ams1", "fra1"], "countries": ["NL", "DE"] }, - "compute": { "vcpu": 4, "ram_mb": 8192, "arch": "arm64" }, + "compute": { "vcpu": 4, "ram_mb": 8192, "arch": "arm64", "range": { "key": "vcpu", "min": 1, "max": 32, "step": 1, "price": { "amount": 1.5, "currency": "EUR", "interval": "month", "per": 1 } } }, "storage": [{ "type": "nvme", "size_gb": 80 }], "network": { "bandwidth_mbps": 1000, "transfer_gb": 4000, "ipv4": 1, "ipv6": true }, "price": { "amount": 7.5, "currency": "EUR", "interval": "month" }, @@ -117,7 +117,10 @@ The rules, and every one degrades: 4. **`offers[].id`** is stable for as long as the offer is the same thing. It is the dedupe key: a reader that sees the same provider origin and `id` tomorrow updates its row rather than adding one. Absent, the reader derives one from `name`, and a renamed offer becomes a new one, which is the cost of not stating it. 5. **`kind`** is what is sold, one word from the list below. **`premises`**, **`management`**, **`tenancy`** and **`model`** are four axes that cut across every kind, each its own key so a reader filters on them without guessing from the kind. A `dedicated` offer is usually `tenancy: dedicated`; a `managed` one is usually `management: managed`; but the axes are stated, not inferred, because a managed VPS and an unmanaged one are the same kind and different offers. 6. **`location`** is where the offer runs. `regions` are the provider's own region names, unchanged, so a buyer can use them at the order form. `countries` are ISO codes, so a directory can group across providers. An on-prem offer has no location, because it runs wherever the buyer puts it. -7. **`compute`, `storage`, `network`** describe the thing. Units are fixed: `ram_mb` and `vram_mb` in mebibytes, `size_gb` in gigabytes, `bandwidth_mbps` in megabits per second, `transfer_gb` per interval. `vcpu` is threads sold, `cores` is physical cores; a dedicated box states `cores`, a virtual one states `vcpu`, and one may state both. `arch` is `x86_64`, `arm64`, `riscv64` or the provider's own word. `storage` is a list, one entry per volume, so two drives are two entries. `ipv4` is a count, `ipv6` a boolean. +7. **`compute`, `storage`, `network`** describe the thing. Units are fixed: `ram_mb` and `vram_mb` in mebibytes, `size_gb` in gigabytes, `bandwidth_mbps` in megabits per second, `transfer_gb` per interval. `vcpu` is threads sold, `cores` is physical cores; a dedicated box states `cores`, a virtual one states `vcpu`, and one may state both. `arch` is `x86_64`, `arm64`, `riscv64` or the provider's own word. `storage` is a list, one entry per volume, so two drives are two entries. `ipv4` is a count, `ipv6` a boolean, or a prefix string such as `"/64"`, which a reader treats as true. + - **`memory`** may sit at the offer's top level as its own block, `{ram_mb, type, ecc, allocation, ...}` as [OpenMemory](/docs/openmemory) defines it. When both are present it wins over `compute.ram_mb`; `compute.ram_mb` alone stays valid. + - **`gpu`** may likewise sit at the offer's top level beside `compute`, as [OpenGPU](/docs/opengpu) defines it. When both `compute.gpu` and a top-level `gpu` are present, the top level wins. + - Any resource block, `compute`, `memory`, `gpu`, one `storage` entry or `network`, may carry **`range`**: `{key, min, max, step, price {amount, currency, interval, per}}`, for what a buyer can dial at checkout. `key` names the field in that block, `min`, `max` and `step` bound it, and `price` is what each `per` units above the offer's base costs. The VPS in the example sells 1 to 32 vCPU in steps of 1 at 1.5 EUR a month each. 8. **`price`** is one price. `amount` is a number, `currency` an ISO 4217 code, `interval` is `hour`, `month`, `year` or `once`. `setup` is a one-time amount on top. `commitment` is the shortest term a buyer signs for, in words the provider uses. An offer sold at several intervals is several offers with a shared prefix in `id`, or one offer at the interval the provider quotes first, and a reader shows what it was given. 9. **`stock`** is `in_stock`, `out_of_stock`, `preorder` or `unknown`. Absent means `unknown`. A directory that shows stock shows when it was read. 10. **Unknown keys are kept.** A provider says more than this document names, and a reader passes it through under the provider's own key. @@ -204,7 +207,7 @@ By hand, from the same table the order form reads. A provider with a database ha ## Related standards - [OpenSwarm](/openswarm): the settlement and proof layer under a peer-to-peer offer; [c0mpute](https://github.com/profullstack/logicsrc/blob/master/docs/openswarm/c0mpute.md) is its compute marketplace and [OpenDisk](/docs/opendisk) its disk-for-rent peer, each listable here as an offer. -- [OpenCPU](/docs/opencpu), [OpenMemory](/docs/openmemory), [OpenGPU](/docs/opengpu), [OpenBandwidth](/docs/openbandwidth): the resource blocks. An offer's `compute` (cpu and memory), `compute.gpu` and `network` may carry those specs' fields when the provider has them, and each can stand alone as an offer of its own. +- [OpenCPU](/docs/opencpu), [OpenMemory](/docs/openmemory), [OpenGPU](/docs/opengpu), [OpenBandwidth](/docs/openbandwidth): the resource blocks. An offer's `compute` (cpu and memory), `compute.gpu` and `network` may carry those specs' fields when the provider has them, and each can stand alone as an offer of its own. A provider selling one resource may serve the same descriptor shape at `/.well-known/opencpu.json`, `openmemory.json`, `opengpu.json` or `openbandwidth.json`, and a reader that finds one of those reads it as an OpenServer descriptor. - [OpenProfile.md](/openprofile): the `operator` behind a provider. - [OpenMCP](/openmcp): a directory that also serves its rows over MCP describes that door with an OpenMCP descriptor. - [OpenAccess](/openaccess): how a buyer's agent carries the credential it needs at the provider's order form, if the provider honours one.