--- id: LSN-0063 ticket: multi-frontend-validation-boundaries title: Language vs platform validation ownership created: 2026-09-19 tags: [compiler, compiler-general, compiler-pbs, backend, validation, multi-frontend] --- # Language vs platform validation ownership ## Original Problem PBS mixed two kinds of rejection. Some failures only make sense with the language: syntax, types, markers, barrel files, imports. Others belong to any executable frontend: malformed `IRBackend`, invalid lifecycle declarations, missing assembled wrappers, host-capability identity, bytecode/preload. Without an ownership rule, the next frontend would copy PBS validators, or the common layer would start knowing `[Init]`, barrel, and `E_SEM_*`. Spec 19 was still titled as PBS verification, and the PBS diagnostics catalog listed wrapper and boot-guard failures as PBS coverage. Lifecycle assembly had already moved (`LSN-0062`). That proved the pattern. It did not inventory the rest. ## Consolidated Decision A validation lives at the lowest layer that understands the failure without knowing the source language. - Language: needs AST, tokens, a language marker, a barrel, or another source rule. - Platform: can be checked on `IRBackend`, `IRLifecycleDeclaration`, IRVM, PBX, host/capability tables, or ids. The discussion published that matrix. It did not extract a generic validator-core and did not move validators whose common contract is not closed. Host admission is split. PBS owns the source shape of `[Host]` and `[Capability]`. Platform owns canonical `(module, name, version)` identity and capability consistency once those facts exist on `IRReservedMetadata`. The current validator may stay in the PBS package until a later plan. `E_HOST_*` is not eternal PBS semantics. The same fact may exist on both sides with distinct identities. PBS can report `E_SEM_MISSING_PROJECT_FRAME`; the common layer still rejects an executable declaration with no frame root. Platform codes are `COMMON_*`, `LOWER_IRVM_*`, or `MARSHAL_*`. PBS keeps `E_PARSE_*`, `E_SEM_*`, `E_LINK_*`, and `E_HOST_*`. Copy origin/span when present; a missing origin is a structural error, not a reason to invent a span. Linking and barrel stay language-owned. `Addressable` is platform-owned and was classified only. SDK canonical source and the broad architectural harness stay on adjacent discussions. ## Final Implementation The work was editorial and test-facing. Spec 19 is now `Compiler Verification and Safety Checks Specification`. Gates S-U and S-I are unchanged. Section 11 states the classification rule, the English ownership matrix, diagnostic identity, dual reporting, and the host-admission split. It explicitly refuses validator-core extraction and package moves. PBS diagnostics spec 12 keeps marker, syntax, semantics, linking, and host-attribute coverage. Common structural failures now point at spec 19 section 11 and spec 20 instead of appearing as PBS required coverage. Spec 20 cross-references that same compiler-general ownership. The conformance matrix added `G19-11.1` through `G19-11.6` and `PBS12-11`. `CommonBackendArchitectureTest` now guards `backend/`, `lifecycle/`, and all common pipeline stages. `ValidationOwnershipSpecTest` locks the title, matrix, and PBS recut. `PbsHostAdmissionValidator` remains under `p.studio.compiler.pbs`. No linking or asset production code moved. ## Examples Language-owned: - parse errors; - `[Init]` / `[Frame]` signature and colocation; - barrel and import failures; - `host call not allowed during init`. Platform-owned and already implemented: - invalid `IRLifecycleDeclaration`; - assembled wrapper, boot guard, and synthetic origin preconditions; - IRVM and marshal rejection families. Classified as platform, not moved: - canonical host-binding identity on `IRReservedMetadata`; - `Addressable` / asset path. Dual reporting: - missing `[Frame]` in PBS source is `E_SEM_MISSING_PROJECT_FRAME`; - an executable declaration without frame root is a common structural error. ## Pitfalls - Do not treat “classified as platform” as “move the class now.” Host admission still waits on the SDK source discussion. - Do not merge language and platform failures into one hybrid code. Two identities are cheaper than a lost message. - Do not put PBS governance or PBS diagnostics in charge of compiler-general safety gates. - Do not scan PBS frontend sources with the platform architecture guard. The guard is for common validators, not for the language package that must remain. - Do not invent a validator-core because several common checks exist. They already live on their stages. ## References - Decision: `DEC-0047` - Plan: `PLN-0126` - Related lesson: `LSN-0062` - Common lifecycle assembly after frontend declaration - Related lesson: `LSN-0059` - Common IRBackend handoff and backend guardrails - `docs/specs/compiler/19. Verification and Safety Checks Specification.md` - `docs/specs/compiler-languages/pbs/12. Diagnostics Specification.md` - `docs/specs/compiler/20. IRBackend to IRVM Lowering Specification.md` - `docs/specs/compiler/22. Backend Spec-to-Test Conformance Matrix.md` - `prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/specs/ValidationOwnershipSpecTest.java` - `prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/specs/CommonBackendArchitectureTest.java`