STRICT PORTABILITY IS A CHECK, NOT A VIBE.
The 13.1 source asks one canonical project to survive every admitted profile/layout pair without changing its public interface. It rejects operations whose meaning depends on target width, address representation, C ABI or host capability.
00 command
dbytec check-portable path\to\project
The validator declares PORTABLE_PROFILE_COUNT = 10: hosted i686/x86_64, VM i686/x86_64, i686 freestanding/user, x86_64 freestanding/user, x86_64 Linux and x86_64 Windows.
10 first strict type set
Fixed-width integers, explicit f32/f64, bool, named types and arrays built from admitted types can participate. Other DBYTE types are not “bad”; strict mode simply refuses to pretend an address-sized or target-ABI value has one representation everywhere.
20 intentionally refused
| Diagnostic | Reason |
|---|---|
E_PORTABLE_TARGET_WIDTH | usize changes with target width. |
E_PORTABLE_LEGACY_INT | Legacy int is outside the first strict contract. |
E_PORTABLE_LEGACY_FLOAT | Legacy float/literals do not use the explicit fixed representation. |
E_PORTABLE_ADDRESS_REPRESENTATION | Pointers, borrows, slices, StringView and null carry address meaning. |
E_PORTABLE_C_ABI | extern "C" and repr(C) are target ABI contracts. |
E_PORTABLE_TARGET_CAPABILITY | Target/host namespaces are not target-neutral. |
E_PORTABLE_INDEX_SEMANTICS | Indexing stays out until every admitted backend enforces one bounds contract. |
30 interface drift
Each successful profile analysis contributes the canonical semantic interface fingerprint. More than one fingerprint produces E_PORTABLE_INTERFACE_DRIFT. “Same source” is therefore checked at the public interface instead of inferred from two lucky executions.
40 example
portable_runtime_parity.dby uses fixed-width integers and a deterministic 42 return contract. The parity verifier drives that same source through the execution matrix.
fn mix(value: u32) -> u32:
let x: u32 = value * (3 as u32)
x = x + (7 as u32)
if x > (100 as u32):
x = x - (11 as u32)
return x
pub fn main() -> i32:
let left: u32 = mix(40 as u32)
let right: u32 = mix(10 as u32)
let total: u32 = left + right
if total == (153 as u32):
return 42 as i32
return 1 as i32
let status: i32 = main()
if status != (42 as i32):
let crash: i32 = (1 as i32) / (0 as i32)