# PBS AST Specification

Status: Draft v1  
Applies to: canonical AST contract emitted by PBS parser/frontend before IRBackend lowering

## 1. Purpose

This document defines the mandatory AST contract between PBS parsing and frontend lowering to `IRBackend`.

The contract is obligations-first: implementations may choose any internal representation, but must expose equivalent observable AST behavior and invariants.

## 2. Scope

This document defines:

- AST root and ordering invariants,
- mandatory node families for declarations, statements, and expressions in the supported v1 slice,
- mandatory node attribution and declaration metadata,
- deterministic rejection and recovery boundaries,
- and Gate U evidence obligations for AST conformance.

This document does not define:

- static-semantics algorithms,
- runtime/bytecode/verifier behavior,
- or `IRBackend -> IRVM` lowering.

## 3. Authority and Precedence

Normative precedence:

1. `3. Core Syntax Specification.md`
2. `4. Static Semantics Specification.md`
3. `12. Diagnostics Specification.md`
4. This document
5. `13. Lowering IRBackend Specification.md`

If a rule here conflicts with a higher-precedence source, the higher-precedence rule wins.

## 4. Normative Inputs

This document depends on:

- `3. Core Syntax Specification.md`
- `4. Static Semantics Specification.md`
- `12. Diagnostics Specification.md`
- `13. Lowering IRBackend Specification.md`

## 5. AST Contract Model

The AST contract is defined by required observable behavior, not by one mandatory class hierarchy or parser architecture.

Conformance is implementation-language agnostic.

## 6. Root and Structural Invariants

Parser output must satisfy all of the following:

1. exactly one AST root per source file;
2. deterministic child ordering consistent with source order;
3. preserved declaration and lexical block hierarchy;
4. parent/child span integrity (no structurally impossible attribution relationships);
5. no post-parse AST rewrite that changes source-observable parse meaning.

## 7. Mandatory Attribution and Declaration Metadata

Every node consumed by diagnostics or lowering must carry stable source attribution:

- `file`,
- `start`,
- `end`.

Mandatory declaration metadata on required declaration nodes includes:

1. declaration name,
2. declared signature/surface when applicable (parameters/return),
3. declaration-level syntactic flags/attributes required by later phases,
4. stable `file/start/end` attribution,
5. lifecycle-marker metadata when a declaration carries `[Init]` or `[Frame]`.

Missing required attribution or metadata on mandatory nodes is non-conformant.

## 8. Mandatory Declaration Families

The v1 AST must represent, at minimum, declaration families for:

- imports,
- top-level `fn`,
- `struct`,
- `contract`,
- `service`,
- `error`,
- `enum`,
- `callback`,
- `declare global`,
- `declare const`,
- and declaration nodes required by barrel/linking flow.

Declaration identity must be preserved at AST boundary; implementations must not prematurely merge/collapse declarations (including overload sets).

Lifecycle-observable declarations must preserve marker metadata explicitly:

- top-level `fn` marked with `[Init]`,
- top-level `fn` marked with `[Frame]`,
- and host method signatures marked with `[InitAllowed]`.

## 9. Mandatory Statement and Expression Families

The v1 AST must represent statement/expression families for the supported core syntax slice, including at minimum:

- statements: `block`, `let`, `return`, expression statement;
- expressions: `identifier`, literals, `unary`, `binary`, `call`, `group`.

Additional supported forms required by `3` are also in scope for explicit node representation.

## 10. Precedence, Associativity, and Rejection

Precedence and associativity outcomes are normative through AST shape.

Rules:

1. accepted forms must preserve parse outcome explicitly in AST shape;
2. non-associative or forbidden chained forms are deterministic reject with stable diagnostics;
3. unsupported forms outside the active source slice are deterministic reject;
4. unsupported/invalid forms must not be masked by permissive synthetic nodes that imply accepted semantics.

## 11. Recovery and Diagnostics Integration

Parser recovery may continue after syntax errors for diagnostic collection, but recovered AST must remain:

- structurally coherent,
- attribution-consistent,
- and non-permissive (must not fabricate valid semantics that hide required rejection).

AST-facing diagnostics must follow `12` identity and attribution rules.

For conformance, required diagnostic identity is keyed by stable machine fields, not rendered sentence text.

## 12. Conformance and Gate U Evidence

AST conformance evidence is provided through Gate U fixtures as defined in `docs/specs/compiler/13. Conformance Test Specification.md`.

At minimum, Gate U must include:

1. representative valid AST fixtures for mandatory declaration/statement/expression families;
2. malformed/recovery fixtures with deterministic rejection assertions;
3. attribution assertions (`file/start/end`) on required nodes;
4. precedence/associativity shape assertions for representative expressions;
5. mandatory negative families:
   - unexpected token in declaration context,
   - missing required closer (`)`, `}`, or `;`) as applicable,
   - forbidden non-associative chains,
   - unsupported forms outside the active syntax slice.

## 13. Non-Goals

- Freezing one parser implementation architecture.
- Replacing static semantics/linking decisions with AST-only rules.
- Defining backend/runtime/bytecode/verifier behavior.

## 14. Exit Criteria

This document is healthy when:

1. mandatory AST families and metadata are explicit,
2. recovery/rejection invariants are explicit and test-backed,
3. attribution invariants are explicit and test-backed,
4. lowering preconditions consumed by `13` are unambiguous.
