Project Manifest v16: Useful Data v2

September 10, 2026 ยท View on GitHub

Status: implemented bounded Project profile; HOSTED GREEN under the v0.4.0 release baseline, including the admitted cross-package roundtrip across Project backends.

Audience: compiler, project-tooling, and standard-library contributors.

Project v16 selects useful-data.v2. It combines the existing checked internal owned-data linking profile with the frozen Useful Data v1 public byte-export boundary. This permits a library to compose private Reader/Writer functions while retaining its existing borrowed-slice/scalar exports and contracts. It does not select Public Owned Data API v1 or relax that profile's contract-free closure rule.

Manifest

The flat projection has exactly the same ordered fields as Project v3, with an authenticated new schema/profile pair:

schema = "semaprax.project.v16"
name = "json-writer"
version = "0.1.0"
profile = "useful-data.v2"
entry = "json_writer.examples"
sources = ["src/examples.spx", "src/tests.spx", "src/write.spx"]
web_exports = ["json-writer.quoted-length"]
tests = ["json_writer.tests"]

The table manifest remains semaprax.manifest.v1; its package profile selects this flat projection. An empty export list selects private entry/test execution without a public artifact. Schema v3 with profile v2, or schema v16 with profile v1, is rejected. No command, capability grant, provider, public nominal type, or generic ABI is added.

Separate internal and public admission

One immutable authenticated Project snapshot supplies all role projections. Entry and test execution use the existing owned-data linker, including its checked nominal identities, ownership, contract evaluation, and independent cleanup replay. Private dependency records and consuming helpers may therefore compose behind the public boundary.

When exports are selected, the Web role retains its actual entry-main closure plus the selected export closures, using the existing conservative reachability rules. Unrelated private functions are excluded. The complete Web projection must still pass the frozen Useful Data v1 byte-export admission and emission. Consequently an entry-main closure that itself exceeds that public emitter's profile is rejected; this version does not replace an authored entry with an unchecked synthetic body. With no exports, the retained role is internal only: no public emitter or descriptor is constructed, an owning entry closure is allowed, and an npm artifact request fails closed.

Public parameters/results remain exactly those accepted by Useful Data v1. An owning Reader/Writer export, generic export, effectful export, or other unsupported signature fails before publication. The original contract checks and status/result publication order are preserved. Private ownership support is not a public ownership descriptor.

Legacy Useful Data v1 consumers keep their previous function inventory when all dependency declarations meet the old profile. For dependency modules with newer unsupported signatures or types, the linker retains the legacy-compatible functions and their complete checked callee closure. Unused newer members receive no target authority; any retained unsupported member still fails the ordinary v1 linker. Authored module checks and dependency permit/effect checks remain unchanged. The existing JSON writer sibling consumer exercises this fallback.

Artifacts and replay

The byte-export Wasm emitter, JavaScript bindings, TypeScript types, and semaprax.data-exports.v1 descriptor retain their existing format and carrier contract. Raw owned tokens and internal nominal records do not cross them. The existing deterministic npm carrier format commits the exact Project schema v16 and revision in its identity and digest; replay accepts that schema only through the same checked Useful Data artifact reconstruction. A v3/v16 cross-pair cannot substitute a different Project identity.

All previously accepted v3 parsing, rendering, descriptors and emitter bytes remain unchanged. This profile does not extend Project v1's inline scalar-Web carrier or the Public Owned Data API descriptor.

Focused verification

project::admission::tests::useful_data_v2_keeps_public_contract_abi_and_private_owned_calls_separate checks canonical v16 parsing, a public callee's retained postcondition, exclusion of an unrelated private owned function, refusal under the old internal profile, and rejection of an owning public root and schema/profile confusion. profile_admission::project_v16_json_cursor_public_facade_replays_and_executes additionally checks deterministic npm reconstruction and envelope replay, repeated execution of the borrowed-byte facade in Node, absence of the private owning function from that facade, and refusal to publish an empty export list. The standard JSON writer cursor corpus additionally exercises private owned composition on the interpreter, native C11 at -O0 and -O2, and Core Wasm through authenticated Project snapshots; its decoder/writer cases include a 300-byte decoded string. Six malformed-input, insufficient-capacity, and forged-cursor contract-rejection cases are retained. Cross-package decode/requote roundtrip uses the named private_json_cursor_roundtrip_executes_across_project_backends gate on the interpreter entry and repeated test, native C11 at -O0 and -O2, and repeated Core Wasm with a strict two-entry arena. The unchanged 16 MiB budget fits. The implemented release corpus is hosted green; earlier local observations remain historical witnesses. No broader nominal/public ownership support is created by that evidence classification.