4.6 KiB
PBS - Compatibility and Evolution Policy v1 (Draft)
Status: Draft (Normative policy for language/runtime evolution) Scope: Compatibility contract for PBS features across hardware/runtime updates Language: English
1. Purpose
This document defines how PBS remains stable while the logical hardware evolves.
Goals:
- preserve existing cartridge behavior across updates,
- allow additive platform growth without silent regressions,
- keep evolution deterministic and verifier-friendly,
- define explicit upgrade/rejection rules for toolchains and firmware.
2. Authority and precedence
Normative precedence order:
- Runtime authority (
docs/specs/hardware/topics/chapter-2.md,chapter-3.md,chapter-9.md,chapter-12.md,chapter-16.md) - Bytecode authority (
docs/specs/bytecode/ISA_CORE.md) PBS - Language Syntax Specification v0.mdPBS - Game Language Profile v1 (Draft).mdPBS - Game Profile Syntax Specification v1 (Draft).md- This document
- Legacy references (
docs/specs/pbs_old/*)
If any rule here conflicts with higher authority, this document is invalid for that rule.
3. Core stability model
3.1 Frozen core contract
The following contracts MUST remain stable once released in a major line:
- frame synchronization semantics (
FRAME_SYNCas deterministic safepoint), - trap and verifier invariants,
- stack/call/return discipline for valid bytecode,
- deterministic scheduling and host-call contract rules.
Behavioral changes to frozen core contracts require a new major line.
3.2 Additive extension rule
New features SHOULD be additive by default. Existing valid programs MUST keep their previous behavior unless they explicitly target a newer incompatible major.
4. Primitive and host API versioning
4.1 Canonical identity
Host-call primitives MUST be versioned by canonical identity:
(module, name, version)
An incompatible change MUST create a new version.
The old version MUST remain resolvable during its supported compatibility window.
4.2 No semantic retcon
Implementations MUST NOT silently change semantics of an existing canonical identity. If semantics must change incompatibly, publish a new identity version and deprecate the old one by policy.
5. Cartridge target contract
Each cartridge/app manifest MUST declare, at minimum:
- target VM/runtime major (or compatible range),
- language profile and profile version,
- required canonical host-call identities and versions,
- required capabilities.
Loader behavior MUST be deterministic:
- load and run when all requirements resolve,
- reject with explicit diagnostic when requirements are missing or incompatible.
Implicit fallback to a different major/version is forbidden.
6. Evolution policy (major/minor)
6.1 Minor updates
Minor updates MUST be backward compatible. Allowed examples:
- adding new host-call identities,
- adding optional metadata/diagnostics,
- adding syntax/features gated behind explicit profile selection.
6.2 Major updates
Major updates MAY introduce incompatible changes. When this happens, maintainers MUST provide:
- explicit migration notes,
- compatibility window policy for prior majors,
- deterministic loader diagnostics for unsupported targets.
7. Compatibility layer policy
Runtime/firmware SHOULD provide compatibility shims for older identity versions for a defined window.
If shims are provided:
- shim behavior MUST be deterministic,
- shim scope and support horizon MUST be documented,
- shim removal MUST occur only in a new major line.
8. Toolchain requirements
Compiler/linker/tooling MUST:
- resolve host calls by canonical identity and declared version,
- fail deterministically on unresolved identities,
- emit target/profile metadata in output artifacts,
- avoid emitting instructions/features not supported by selected target contracts.
9. Conformance and replay guarantees
Each release MUST pass compatibility conformance suites that include:
- bytecode verifier invariants,
- host-call resolution checks by version,
- deterministic replay checks under fixed input/event traces.
For supported target contracts, the same cartridge plus the same input/event sequence MUST produce the same observable behavior.
10. Deprecation policy
Deprecation MUST be explicit and non-breaking during its support window. Required stages:
- Mark as deprecated (tooling warning + documentation).
- Maintain compatibility through declared window.
- Remove only in a subsequent major line.
11. Non-goals
- Defining subsystem-specific syscall tables.
- Defining game-stdlib API surfaces.
- Replacing runtime authority with PBS-layer policy.