v0.21.0
What's Changed
- Reserved
protowire.prefix rejected in@sensitive(class)values (#125) — RFC-001 §6.7 classification parameter, rule 1 (protowire#111/protowire#163): class names beginning withprotowire.are reserved for future spec-defined classes, mirroring the §7 violation-code reservation. The B3 use-arg validation pass now rejects a string-literalclassargument (named or positional) that is exactly"protowire"or any dotted extension of it, keyed on the resolved FQNprotowire.schema.v1.sensitive— user annotations that happen to be namedsensitiveare unaffected, as are lookalike prefixes (protowirex.pii), bare@sensitive, andclass = "". Closes the v0.19.0/v0.20.0 corpus-ahead-of-toolchain gap: MUST-NOT-COMPILE fixtureinvalid/reserved_sensitive_class.protonow fails with exactly the expected diagnostic (#123). TypeDecl.base_type_fqnnow emitted fully qualified (#126) — the carrier contract pins the field as the FQN of the base type, but the lowering recorded the base as written in source, so bare in-package references stayed bare (type CompanyEmail = Email→"Email"). The IR now resolves each alias's base in a quietresolveTypeAliasBasespass and the newir.TypeAlias.BaseTypeFQN()accessor feeds the FDP carrier; primitives keep their predeclared name, chained aliases record their immediate base fully qualified, and unresolved bases fall back to the as-written text (#121). Corpus fixtures02_composition,06_cross_file_lib, and14_refinement_kindsnow produce exactly the fixture-pinned FQNs (e.g.SettledStatus → fixtures.refine.OrderStatus,DisplayName → google.protobuf.StringValue).
Release gate: ci-local-full verified on this tag — generate/lint/test clean, checkspecdrift matches the protowire checkout, benchmarks pass.
Full Changelog: v0.20.0...v0.21.0