implements PLN-0120
This commit is contained in:
parent
38790c0b45
commit
1f1a92d43f
@ -6,7 +6,7 @@
|
|||||||
{"type":"discussion","id":"DSC-0061","status":"open","ticket":"multi-frontend-sdk-canonical-definition","title":"Auditoria e centralizacao gradual da definicao canonica do SDK","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","sdk","stdlib","hostcalls","intrinsics","multi-frontend"],"agendas":[{"id":"AGD-0064","file":"AGD-0064-multi-frontend-sdk-canonical-definition.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
{"type":"discussion","id":"DSC-0061","status":"open","ticket":"multi-frontend-sdk-canonical-definition","title":"Auditoria e centralizacao gradual da definicao canonica do SDK","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","sdk","stdlib","hostcalls","intrinsics","multi-frontend"],"agendas":[{"id":"AGD-0064","file":"AGD-0064-multi-frontend-sdk-canonical-definition.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
||||||
{"type":"discussion","id":"DSC-0060","status":"open","ticket":"multi-frontend-validation-boundaries","title":"Separar validacoes de linguagem e validacoes de plataforma","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","backend","validation","multi-frontend"],"agendas":[{"id":"AGD-0063","file":"AGD-0063-multi-frontend-validation-boundaries.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
{"type":"discussion","id":"DSC-0060","status":"open","ticket":"multi-frontend-validation-boundaries","title":"Separar validacoes de linguagem e validacoes de plataforma","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","backend","validation","multi-frontend"],"agendas":[{"id":"AGD-0063","file":"AGD-0063-multi-frontend-validation-boundaries.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
||||||
{"type":"discussion","id":"DSC-0059","status":"open","ticket":"multi-frontend-common-lifecycle","title":"Extrair lifecycle comum das responsabilidades do frontend PBS","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","lifecycle","backend","multi-frontend"],"agendas":[{"id":"AGD-0062","file":"AGD-0062-multi-frontend-common-lifecycle.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
{"type":"discussion","id":"DSC-0059","status":"open","ticket":"multi-frontend-common-lifecycle","title":"Extrair lifecycle comum das responsabilidades do frontend PBS","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","lifecycle","backend","multi-frontend"],"agendas":[{"id":"AGD-0062","file":"AGD-0062-multi-frontend-common-lifecycle.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]}
|
||||||
{"type":"discussion","id":"DSC-0058","status":"in_progress","ticket":"multi-frontend-serializable-ir","title":"Manter a IR comum serializavel por design","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","ir","backend","serialization","multi-frontend"],"agendas":[{"id":"AGD-0061","file":"AGD-0061-multi-frontend-serializable-ir.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0044","file":"DEC-0044-serializable-common-ir-boundary.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0061"}],"plans":[{"id":"PLN-0119","file":"PLN-0119-document-irbackend-serializability-invariants.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0120","file":"PLN-0120-audit-public-irbackend-contract-shape.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0121","file":"PLN-0121-add-serializable-irbackend-reflection-guardrails.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0122","file":"PLN-0122-prove-deterministic-irbackend-ordering.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0123","file":"PLN-0123-fix-concrete-irbackend-serialization-leaks.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]}],"lessons":[]}
|
{"type":"discussion","id":"DSC-0058","status":"in_progress","ticket":"multi-frontend-serializable-ir","title":"Manter a IR comum serializavel por design","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","ir","backend","serialization","multi-frontend"],"agendas":[{"id":"AGD-0061","file":"AGD-0061-multi-frontend-serializable-ir.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0044","file":"DEC-0044-serializable-common-ir-boundary.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0061"}],"plans":[{"id":"PLN-0119","file":"PLN-0119-document-irbackend-serializability-invariants.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0120","file":"PLN-0120-audit-public-irbackend-contract-shape.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0121","file":"PLN-0121-add-serializable-irbackend-reflection-guardrails.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0122","file":"PLN-0122-prove-deterministic-irbackend-ordering.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]},{"id":"PLN-0123","file":"PLN-0123-fix-concrete-irbackend-serialization-leaks.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0044"]}],"lessons":[]}
|
||||||
{"type":"discussion","id":"DSC-0057","status":"done","ticket":"multi-frontend-frontend-backend-contract","title":"Estabilizar contrato entre frontend e backend comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","ir","backend","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0059","file":"discussion/lessons/DSC-0057-multi-frontend-frontend-backend-contract/LSN-0059-common-irbackend-handoff-and-backend-guardrails.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
{"type":"discussion","id":"DSC-0057","status":"done","ticket":"multi-frontend-frontend-backend-contract","title":"Estabilizar contrato entre frontend e backend comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","ir","backend","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0059","file":"discussion/lessons/DSC-0057-multi-frontend-frontend-backend-contract/LSN-0059-common-irbackend-handoff-and-backend-guardrails.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
||||||
{"type":"discussion","id":"DSC-0056","status":"done","ticket":"multi-frontend-remove-pbs-branches","title":"Generalizar o contrato LSP/editorial para frontends","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","studio","frontend","coupling","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0058","file":"discussion/lessons/DSC-0056-multi-frontend-remove-pbs-branches/LSN-0058-generic-frontend-editorial-contract-for-lsp.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
{"type":"discussion","id":"DSC-0056","status":"done","ticket":"multi-frontend-remove-pbs-branches","title":"Generalizar o contrato LSP/editorial para frontends","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","studio","frontend","coupling","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0058","file":"discussion/lessons/DSC-0056-multi-frontend-remove-pbs-branches/LSN-0058-generic-frontend-editorial-contract-for-lsp.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
||||||
{"type":"discussion","id":"DSC-0055","status":"done","ticket":"multi-frontend-compiler-vs-language-services","title":"Separar compilacao de servicos editoriais de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","lsp","editor","frontend","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0056","file":"discussion/lessons/DSC-0055-multi-frontend-compiler-vs-language-services/LSN-0056-compile-first-frontends-with-optional-editorial-capabilities.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
{"type":"discussion","id":"DSC-0055","status":"done","ticket":"multi-frontend-compiler-vs-language-services","title":"Separar compilacao de servicos editoriais de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","lsp","editor","frontend","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0056","file":"discussion/lessons/DSC-0055-multi-frontend-compiler-vs-language-services/LSN-0056-compile-first-frontends-with-optional-editorial-capabilities.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
id: PLN-0120
|
id: PLN-0120
|
||||||
ticket: multi-frontend-serializable-ir
|
ticket: multi-frontend-serializable-ir
|
||||||
title: Audit public IRBackend contract shape
|
title: Audit public IRBackend contract shape
|
||||||
status: open
|
status: done
|
||||||
created: 2026-07-15
|
created: 2026-07-15
|
||||||
ref_decisions: [DEC-0044]
|
ref_decisions: [DEC-0044]
|
||||||
tags: [compiler, compiler-general, ir, backend, serialization, multi-frontend]
|
tags: [compiler, compiler-general, ir, backend, serialization, multi-frontend]
|
||||||
|
|||||||
@ -15,11 +15,26 @@ import java.lang.reflect.Modifier;
|
|||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
class IRBackendExecutableContractTest {
|
class IRBackendExecutableContractTest {
|
||||||
private static final String FORBIDDEN_PBS_PACKAGE = "p.studio.compiler.pbs";
|
private static final String FORBIDDEN_PBS_PACKAGE = "p.studio.compiler.pbs";
|
||||||
|
private static final Set<Class<?>> AUDITED_SUPPORT_TYPES = Set.of(
|
||||||
|
FileId.class,
|
||||||
|
ModuleId.class,
|
||||||
|
CallableId.class,
|
||||||
|
IntrinsicId.class,
|
||||||
|
Span.class,
|
||||||
|
ModuleReference.class,
|
||||||
|
CallableSignatureRef.class,
|
||||||
|
IntrinsicReference.class,
|
||||||
|
ReadOnlyList.class,
|
||||||
|
String.class,
|
||||||
|
Integer.class,
|
||||||
|
Long.class,
|
||||||
|
Boolean.class);
|
||||||
private static final List<Class<?>> PUBLIC_CONTRACT_TYPES = List.of(
|
private static final List<Class<?>> PUBLIC_CONTRACT_TYPES = List.of(
|
||||||
IRBackend.class,
|
IRBackend.class,
|
||||||
IRBackend.IRBackendAggregator.class,
|
IRBackend.IRBackendAggregator.class,
|
||||||
@ -45,6 +60,61 @@ class IRBackendExecutableContractTest {
|
|||||||
IRReservedMetadata.IntrinsicSurface.class,
|
IRReservedMetadata.IntrinsicSurface.class,
|
||||||
IRReservedMetadata.BuiltinConstSurface.class);
|
IRReservedMetadata.BuiltinConstSurface.class);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void publicIRBackendContractAuditMustCoverAllModelTypes() {
|
||||||
|
final var expectedTopLevelModelTypes = Set.of(
|
||||||
|
IRBackend.class,
|
||||||
|
IRBackendReader.class,
|
||||||
|
IRBackendFile.class,
|
||||||
|
IRBackendExecutableFunction.class,
|
||||||
|
IRFunction.class,
|
||||||
|
IRGlobal.class,
|
||||||
|
IRGlobalOrigin.class,
|
||||||
|
IRGlobalVisibility.class,
|
||||||
|
IRHiddenGlobalKind.class,
|
||||||
|
IRReservedMetadata.class,
|
||||||
|
IRSyntheticCallableKind.class,
|
||||||
|
IRSyntheticFunction.class,
|
||||||
|
IRSyntheticOrigin.class);
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
PUBLIC_CONTRACT_TYPES.containsAll(expectedTopLevelModelTypes),
|
||||||
|
"public IRBackend contract audit must cover every top-level handoff model type");
|
||||||
|
assertTrue(
|
||||||
|
PUBLIC_CONTRACT_TYPES.contains(IRBackendExecutableFunction.Instruction.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRBackendExecutableFunction.HostCallMetadata.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRBackendExecutableFunction.IntrinsicCallMetadata.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRReservedMetadata.HostMethodBinding.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRReservedMetadata.BuiltinTypeSurface.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRReservedMetadata.BuiltinFieldSurface.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRReservedMetadata.IntrinsicSurface.class)
|
||||||
|
&& PUBLIC_CONTRACT_TYPES.contains(IRReservedMetadata.BuiltinConstSurface.class),
|
||||||
|
"public IRBackend contract audit must cover nested handoff value types");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void publicIRBackendContractAuditMustClassifyAllowedSupportTypes() {
|
||||||
|
assertTrue(
|
||||||
|
AUDITED_SUPPORT_TYPES.containsAll(Set.of(
|
||||||
|
FileId.class,
|
||||||
|
ModuleId.class,
|
||||||
|
CallableId.class,
|
||||||
|
IntrinsicId.class)),
|
||||||
|
"table-scoped ids are audited as explicit handoff identifiers");
|
||||||
|
assertTrue(
|
||||||
|
AUDITED_SUPPORT_TYPES.contains(Span.class),
|
||||||
|
"Span is audited as source attribution data");
|
||||||
|
assertTrue(
|
||||||
|
AUDITED_SUPPORT_TYPES.containsAll(Set.of(
|
||||||
|
ModuleReference.class,
|
||||||
|
CallableSignatureRef.class,
|
||||||
|
IntrinsicReference.class)),
|
||||||
|
"source table references are audited as ordered table values");
|
||||||
|
assertTrue(
|
||||||
|
AUDITED_SUPPORT_TYPES.contains(ReadOnlyList.class),
|
||||||
|
"ReadOnlyList is audited as the ordered collection contract");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void publicIRBackendContractMustNotExposePbsTypes() {
|
void publicIRBackendContractMustNotExposePbsTypes() {
|
||||||
final var violations = new ArrayList<String>();
|
final var violations = new ArrayList<String>();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user