prometeu-studio/docs/pbs/decisions/Allocation and Cost Visibility Decision.md

5.6 KiB

Allocation and Cost Visibility Decision

Status: Accepted Cycle: Initial allocation-and-cost closure pass

1. Context

PBS v1 needs a minimal but explicit contract for which runtime cost facts matter semantically and which belong only to diagnostics/profiling quality.

Earlier decisions already fixed important inputs:

  • bind(context, fn_name) has real retention/storage consequences,
  • optional, result, handle, !, if, and switch are not intended to hide implicit allocation semantics,
  • host/userland interaction is stack-only across the boundary,
  • and value categories already distinguish copied payload from preserved aliasing.

2. Decision

PBS v1 adopts the following cost-visibility baseline:

  1. The normatively relevant cost facts are:
    • whether an operation may allocate VM-owned runtime storage,
    • whether an operation retains state beyond the current evaluation,
    • whether an operation copies payload versus preserves aliasing,
    • whether an operation crosses the host boundary,
    • and whether an operation may trap.
  2. bind(context, fn_name) is normatively retention-bearing and requires runtime storage sufficient to keep the callback target and captured context alive.
  3. apply is not allocation-bearing by itself.
  4. optional, result, handle, !, if, and switch are not allocation-bearing by themselves.
  5. Host-boundary crossing is a normatively relevant cost fact, but concrete host-side allocation details belong to subsystem-specific contracts rather than to a general PBS rule.
  6. Quantitative reporting such as exact byte counts, exact object counts, or precise collector timing is not a normative language guarantee in v1.

3. Normatively Relevant Cost Facts

The following cost facts are part of the PBS semantic model and may be relied on by later tooling/spec work:

  • VM allocation-bearing versus non-allocation-bearing behavior,
  • retention-bearing versus non-retention-bearing behavior,
  • copy versus aliasing preservation,
  • host-boundary crossing,
  • trap possibility.

These facts matter because they affect how advanced tooling, diagnostics, and performance reasoning should interpret a construct.

4. bind

bind(context, fn_name) is the strongest closed cost case in the current PBS core.

Rules:

  • bind is not semantically free,
  • bind is retention-bearing,
  • bind requires runtime storage sufficient to preserve the callback target and captured context,
  • the captured context remains alive while the callback value remains alive.

This decision does not require the spec to freeze the exact runtime layout used to implement that storage.

5. Non-Allocation-Bearing Surfaces

The following constructs are not allocation-bearing by themselves in PBS v1:

  • optional
  • result
  • handle
  • !
  • if
  • switch
  • apply

If allocation or retention occurs while evaluating one of these constructs, that cost arises from:

  • subexpression evaluation,
  • called targets,
  • payload formation already defined elsewhere,
  • or runtime behavior outside the surface itself.

6. Copy Versus Aliasing

Copy versus aliasing is a normatively relevant cost fact.

The language already distinguishes:

  • pure values copied by value,
  • identity-bearing values passed by preserved aliasing,
  • carriers that preserve the semantics of their contained values.

Tooling and later specs may rely on these distinctions even if PBS v1 does not require a warning at every such site.

7. Host Boundary

Crossing the host boundary is a normatively relevant cost fact.

However, this decision does not impose a universal rule for:

  • host-side allocation volume,
  • host-side object count,
  • or host-side retention internals.

Those details belong to subsystem-specific contracts when and if they become relevant.

8. Normative Versus Best-Effort Reporting

8.1 Normative facts

The following facts are normative and may be surfaced by diagnostics/tooling:

  • whether a construct is retention-bearing,
  • whether a construct crosses the host boundary,
  • whether semantics preserve aliasing or copy payload,
  • whether a construct may trap.

8.2 Best-effort facts

The following facts are not normative language guarantees in v1:

  • exact byte counts,
  • exact object counts,
  • exact collector timing,
  • exact host-side allocation volume,
  • precise performance ranking beyond the semantic facts above.

These may be surfaced by implementations as profiling or tooling enrichment, but they are not part of the core language contract.

9. Invariants

  • The language must not imply hidden allocation semantics where none were intentionally specified.
  • bind remains the canonical retention-bearing callback-forming construct in v1.
  • Cost visibility must be strong enough for advanced tooling without forcing exact runtime accounting into the language spec.
  • Host-boundary cost reporting must not pretend to know subsystem-specific runtime internals unless those are explicitly specified.

10. Explicit Non-Decisions

This decision record does not yet close:

  • the final diagnostics wording for warnings or notes,
  • subsystem-specific host cost contracts,
  • precise collection/profiling metrics,
  • optimizer-facing reporting policy.

11. Spec Impact

This decision should feed at least:

  • docs/pbs/specs/10. Memory and Lifetime Specification.md
  • docs/pbs/specs/11. Diagnostics Specification.md

12. Validation Notes

The intended split is:

  • semantic cost facts are explicit,
  • bind is the main retained-storage construct already closed,
  • most other core surfaces are not allocation-bearing by themselves,
  • and quantitative performance reporting remains tooling-quality rather than normative language behavior.