253 lines
7.3 KiB
Markdown
253 lines
7.3 KiB
Markdown
# Cartridge Manifest and Runtime Capabilities Specification
|
|
|
|
Status: Draft v1 (Temporary)
|
|
Applies to: `manifest.json` in Prometeu cartridges, runtime capability declaration, and loader capability input
|
|
|
|
## 1. Purpose
|
|
|
|
This document defines the current cartridge manifest contract relevant to runtime loading.
|
|
|
|
Its purpose is to stabilize:
|
|
|
|
- the JSON surface consumed by the cartridge loader,
|
|
- the declaration of cartridge-requested runtime capabilities,
|
|
- the boundary between cartridge packaging and loader authority,
|
|
- the conversion from manifest-facing capability names to runtime capability flags.
|
|
|
|
This document is intentionally temporary and limited.
|
|
It does not define cartridge publishing, signing, or store policy.
|
|
|
|
## 2. Scope
|
|
|
|
This document defines:
|
|
|
|
- the role of `manifest.json` in cartridge loading,
|
|
- the current required manifest fields,
|
|
- the new `capabilities` field,
|
|
- the nominal capability enumeration used in JSON,
|
|
- the mapping from nominal capabilities to runtime `CapFlags`,
|
|
- the role of the loader when combining manifest capabilities with PBX `SYSC`.
|
|
|
|
This document does not define:
|
|
|
|
- the full package format beyond the current directory cartridge contract,
|
|
- policy UI or permission prompts,
|
|
- cartridge signing or trust chains,
|
|
- final platform grant policy when the host wants to reduce requested capabilities.
|
|
|
|
## 3. Current Cartridge Manifest Role
|
|
|
|
The cartridge manifest is an external load-time descriptor for a cartridge.
|
|
|
|
It is not compiled from PBS source directly.
|
|
It is produced by cartridge packaging tooling and consumed by the runtime loader.
|
|
|
|
The manifest currently carries:
|
|
|
|
- cartridge identity and metadata,
|
|
- asset metadata,
|
|
- preload metadata.
|
|
|
|
This document adds runtime capability declaration to that same manifest.
|
|
|
|
## 4. Manifest Shape
|
|
|
|
The current manifest shape relevant to this document is:
|
|
|
|
```json
|
|
{
|
|
"magic": "PMTU",
|
|
"cartridge_version": 1,
|
|
"app_id": 1001,
|
|
"title": "Example",
|
|
"app_version": "1.0.0",
|
|
"app_mode": "game",
|
|
"capabilities": ["gfx", "input"],
|
|
"asset_table": [],
|
|
"preload": []
|
|
}
|
|
```
|
|
|
|
Rules:
|
|
|
|
- `magic` identifies a Prometeu cartridge manifest,
|
|
- `cartridge_version` identifies the cartridge manifest format line,
|
|
- `capabilities` declares the cartridge's requested runtime capabilities,
|
|
- `asset_table` and `preload` remain separate concerns.
|
|
- `manifest.json` MUST NOT declare nominal entrypoint authority for PBS v1 executable boot.
|
|
- Runtime boot authority is the physical published entrypoint at function index `0`.
|
|
|
|
## 5. `capabilities`
|
|
|
|
### 5.1 General rules
|
|
|
|
`capabilities` is a manifest-facing nominal list.
|
|
|
|
Rules:
|
|
|
|
- `capabilities` is optional,
|
|
- when omitted, it behaves as an empty list,
|
|
- capability names are canonical lowercase identifiers,
|
|
- duplicate entries are invalid,
|
|
- unknown capability names are manifest errors.
|
|
|
|
### 5.2 Nominal capability set
|
|
|
|
The current nominal capability set is:
|
|
|
|
- `system`
|
|
- `gfx`
|
|
- `input`
|
|
- `audio`
|
|
- `fs`
|
|
- `log`
|
|
- `asset`
|
|
- `bank`
|
|
|
|
These names are the normative manifest-facing representation.
|
|
|
|
For the low-level PBS asset host surface, the capability spelling MUST remain `asset` in the singular.
|
|
PBS SDK owner names such as `LowAssets` do not change the manifest/runtime capability spelling.
|
|
|
|
## 6. Relationship to Runtime `CapFlags`
|
|
|
|
The runtime may continue to represent capabilities internally as a bitflag set.
|
|
|
|
That internal representation is an implementation detail.
|
|
|
|
The normative external model is:
|
|
|
|
- a nominal capability enum in the manifest,
|
|
- deterministic conversion by the loader into runtime flags.
|
|
|
|
Canonical mapping:
|
|
|
|
- `system` -> `SYSTEM`
|
|
- `gfx` -> `GFX`
|
|
- `input` -> `INPUT`
|
|
- `audio` -> `AUDIO`
|
|
- `fs` -> `FS`
|
|
- `log` -> `LOG`
|
|
- `asset` -> `ASSET`
|
|
- `bank` -> `BANK`
|
|
|
|
For asset host bindings, PBS declarations MUST use `[Capability(name = "asset")]` so that host admission, PBX host binding metadata, and cartridge capability checks all converge on the same runtime flag.
|
|
|
|
This means the recommended runtime design is:
|
|
|
|
1. deserialize `capabilities` into a nominal enum or equivalent validated representation,
|
|
2. convert that validated set into internal `CapFlags`,
|
|
3. use those flags during host-binding resolution.
|
|
|
|
## 7. Loader Semantics
|
|
|
|
The loader consumes both:
|
|
|
|
- the cartridge manifest,
|
|
- and the PBX `SYSC` table.
|
|
|
|
Required behavior:
|
|
|
|
1. parse `manifest.json`,
|
|
2. parse `capabilities`,
|
|
3. convert the nominal capability list to internal capability flags,
|
|
4. parse `program.pbx`,
|
|
5. resolve each `SYSC` entry against the host registry,
|
|
6. obtain required capabilities from resolved syscall metadata,
|
|
7. fail if required capabilities are not granted by the manifest/policy environment.
|
|
|
|
The manifest alone does not make a program valid.
|
|
The manifest must be consistent with the actual syscalls required by the PBX.
|
|
|
|
## 8. Requested vs Granted Authority
|
|
|
|
The manifest declares requested cartridge capabilities.
|
|
|
|
The loader/runtime environment is the authority that decides what is granted.
|
|
|
|
Current direction:
|
|
|
|
- in the initial runtime model, the manifest may act as the immediate source of granted capabilities,
|
|
- a future platform policy layer may reduce or deny requested capabilities before final load.
|
|
|
|
Normative rule:
|
|
|
|
- the compiler does not grant capabilities,
|
|
- the PBX does not grant capabilities,
|
|
- cartridge/runtime loading is the authority boundary.
|
|
|
|
## 9. Relationship to Compiler and Packer
|
|
|
|
Responsibilities are split as follows:
|
|
|
|
Compiler:
|
|
|
|
- compiles source to PBX,
|
|
- emits `SYSC`,
|
|
- emits `HOSTCALL <sysc_index>`,
|
|
- computes deterministic `requiredCapabilities` from admitted host bindings for packer tooling,
|
|
- does not grant authority.
|
|
|
|
Packer:
|
|
|
|
- produces the cartridge manifest,
|
|
- declares requested runtime capabilities,
|
|
- packages `manifest.json`, `program.pbx`, and assets.
|
|
|
|
Loader:
|
|
|
|
- reads the manifest,
|
|
- derives or receives granted capability flags,
|
|
- validates those capabilities against PBX host requirements.
|
|
|
|
## 10. Validation Rules
|
|
|
|
The cartridge manifest must fail validation if:
|
|
|
|
1. `capabilities` contains an unknown name,
|
|
2. `capabilities` contains duplicates,
|
|
3. `capabilities` is not an array of strings or nominal enum values under the chosen serialization form.
|
|
|
|
Cartridge load must fail if:
|
|
|
|
1. the manifest omits a capability required by a resolved `SYSC` entry,
|
|
2. a future platform policy denies a capability required by a resolved `SYSC` entry.
|
|
|
|
## 11. Serialization Guidance
|
|
|
|
The recommended manifest-facing model is a nominal enum list, not numeric masks.
|
|
|
|
Recommended JSON:
|
|
|
|
```json
|
|
{
|
|
"capabilities": ["gfx", "input", "audio"]
|
|
}
|
|
```
|
|
|
|
Rejected as normative surface:
|
|
|
|
- raw integer bitmasks,
|
|
- hex masks,
|
|
- unnamed positional arrays.
|
|
|
|
Rationale:
|
|
|
|
- nominal capability names are readable,
|
|
- manifest diffs remain understandable,
|
|
- packer and tooling validation is straightforward,
|
|
- runtime may still use bitflags internally after conversion.
|
|
|
|
## 12. Current Decision Summary
|
|
|
|
The current temporary contract is:
|
|
|
|
1. `manifest.json` is the cartridge-facing load descriptor.
|
|
2. `capabilities` is declared in `manifest.json`, not in `prometeu.json`.
|
|
3. `capabilities` uses nominal canonical names such as `gfx` and `audio`.
|
|
4. The runtime may keep using internal `CapFlags`.
|
|
5. The loader converts nominal manifest capabilities into internal flags.
|
|
6. PBX `SYSC` declares required host bindings, not authority.
|
|
7. Loader validation fails if PBX host requirements exceed granted cartridge capabilities.
|
|
8. `manifest.json` is not entrypoint authority for PBS v1 boot.
|