# GC and Reachability Decision

Status: Accepted (Implemented)
Cycle: Initial GC-and-reachability closure pass

## 1. Context

PBS v1 uses GC as the baseline runtime model, but the language still needs a precise statement of:

- what reachability guarantees are normative,
- what reclamation guarantees are normative,
- what remains implementation-defined,
- how GC interacts with the single normative safepoint at `FRAME_SYNC`,
- and what user code may or may not observe.

## 2. Decision

PBS v1 adopts the following GC-and-reachability baseline:

1. GC is the baseline runtime model for VM-owned memory in PBS core.
2. Reachability is the normative liveness criterion for GC-managed values.
3. Eventual reclamation is the strongest reclamation guarantee in v1.
4. `FRAME_SYNC` is the only normative safepoint relevant to GC-observable behavior.
5. User code cannot observe reclamation directly.
6. PBS v1 defines no user-authored finalizers, destructors, or reclamation callbacks.
7. Implementations may perform internal GC work outside `FRAME_SYNC` only if doing so creates no additional user-visible semantic effects.

## 3. Normative Reachability Contract

For GC-managed VM-owned values, liveness is defined by reachability from the runtime roots that matter to PBS semantics.

At minimum, these roots include:

- currently active local/frame state,
- reachable fields of reachable struct instances,
- service singleton roots,
- retained callback state that remains reachable,
- and any other runtime roots required to preserve already-observable PBS behavior.

If a GC-managed value remains reachable through the normative runtime state, the implementation must preserve its continued semantic availability.

If a value becomes unreachable, user code must not rely on when reclamation occurs.

## 4. Reclamation Guarantee

PBS v1 guarantees eventual reclamation, not prompt reclamation.

This means:

- unreachable GC-managed memory may be reclaimed later,
- the language does not promise immediate reclamation,
- the language does not promise reclamation at a specific frame boundary,
- and the language does not expose a semantic event when reclamation occurs.

## 5. Safepoint Relationship

`FRAME_SYNC` is the only normative safepoint in PBS v1.

For GC semantics, this means:

- the language does not promise any additional observable GC safepoints,
- no user-visible program rule may depend on another safepoint existing,
- and any internal collector work outside `FRAME_SYNC` must remain semantically invisible to PBS userland.

The spec does not require a specific collector architecture.
It only constrains what may become observable.

## 6. Observability

User code cannot observe reclamation directly.

PBS v1 provides no user-visible mechanism for:

- detecting that a value was collected,
- registering a callback on reclamation,
- forcing immediate collection,
- or sequencing user code against GC timing.

GC-related information may appear in diagnostics, profiling, or runtime tooling, but those surfaces are not ordinary language semantics.

## 7. Finalization and Cleanup

PBS v1 forbids user-authored finalizers and destructor-like reclamation hooks.

GC reclamation of pure VM-owned values does not trigger user code.

Host-backed cleanup policy is not defined by GC finalization semantics in this decision.
If host-backed resources require explicit or contract-specific cleanup rules, those belong to the host-boundary decision track rather than to GC finalization in userland.

## 8. Invariants

- Reachability, not timing, is the normative semantic axis.
- Reclamation timing remains implementation-defined.
- No direct user-visible behavior is allowed to depend on collector timing.
- The only normative safepoint is `FRAME_SYNC`.
- GC must not create extra user-visible sequencing effects outside the already-closed execution model.

## 9. Beginner-Facing Model

The user-facing explanation should be:

- if a value can still be reached by the program, it remains alive,
- once it can no longer be reached, the runtime may clean it up later,
- the program does not control or directly observe that cleanup moment.

## 10. Explicit Non-Decisions

This decision record does not yet close:

- the exact collector algorithm,
- host-backed resource cleanup semantics,
- diagnostics wording for GC-related tooling surfaces,
- the full root-set wording as finally integrated into the memory specification.

## 11. Spec Impact

This decision should feed at least:

- `docs/pbs/specs/10. Memory and Lifetime Specification.md`
- `docs/pbs/specs/12. Diagnostics Specification.md`
- `docs/general/specs/16. Runtime Execution and Initialization Specification.md`

## 12. Validation Notes

The intended split is:

- GC defines reachability and eventual reclamation,
- `FRAME_SYNC` is the only normative safepoint,
- reclamation timing is not user-observable,
- host-backed cleanup is a separate boundary question rather than a user finalization feature.
