Hand-written. ../harvested/type-system.md is what the documents say; this file is what the
implementation found, and it wins. Each entry names the harvested entry it answers by that
entry's stable key.
- Static typing stack: the design wins — RBS signatures under
sig/, gated byrbs validateandsteep check, and no Sorbet anywhere in this repository. Resolvestype-system/93dc79aa. The decisive fact is mechanical rather than aesthetic, and it is a library-versus-application one: Sorbet'ssigblocks are executed bysorbet-runtime, so# typed: strictwith runtime-checked signatures forcesadd_dependency "sorbet-runtime"into every gemspec that carries asig— includingdexpace-core, whose gemspec is asserted to contain zeroadd_dependencylines (SEAM-1,NFR-1). An application pays that dependency once; a zero-dependency core would be imposing it on every consumer, andNFR-11's "no constant outsideDexpace::and a fixed stdlib allowlist in any public signature" would be violated by theT::constants themselves. RBS is the opposite shape: signatures are data files,rbsandsteepare development-only, andsig/ships inside each gem so a consumer's ownsteep checksees it. What the SDK does instead: every public entity has an RBS signature (NFR-3);rbs validateplussteep checkare blocking gates; Steep adoption is target-by-target in theSteepfilerather than a blanket ignore, because Steep on metaprogramming-heavy code produces false positives; theNFR-4API lock is a diff ofsig/**/*.rbsagainst the previous release tag, paired with a runtime surface snapshot because RBS cannot seeData.define's generated readers. What is lost and is not replaced: Sorbet's runtimesigenforcement — RBS is static only — so the styleguide's assertion-density rule is met by explicitraisepreconditions in.buildand at the wire boundary instead. The# typed:sigil is not written in any file here, and theSorbet/StrictSigilcop is not part of this repository's cop set. The styleguide-amendment alternative (carving out zero-runtime-dependency gems to use RBS in place of Sorbet) was considered and not taken; this is recorded as an SDK deviation instead. review ·docs/work/mvp/2026-09-05-ruby-sdk-v1-roadmap-design.md· high · sha:manual-roadmap-conflict-6 - Closed domain sets are frozen
Datavalue types withparse/offactories over a frozen table, notT::Enum. Resolvestype-system/4a058b71. The rule was routed here by phase 0's design, which found it the one Sorbet-conditional typing rule with no replacement named.T::Enumis defined bysorbet-runtime, a third-party gem that would appear as anadd_dependencyindexpace-core.gemspec— whichSEAM-1/NFR-1forbid andrake gates:gemspec_auditmechanically rejects — so the premise is absent rather than overruled, exactly as../notes/type-system.md's first entry records for the wider Sorbet question. The rule's purpose is adopted in full and is load-bearing here:HTTP-9's idempotent set,HTTP-7's body-forbidden set andHTTP-33's protocol identifiers are closed sets, and none of them is a free-floatingSymbolorStringanywhere in this SDK. What the SDK does instead, perdocs/sdk-design-ruby/04-domain-model-construction.md: each closed set is aData.definetype —Dexpace::Method,Dexpace::Protocol,Dexpace::Status— withprivate_class_method :new, a validating.build, aparse/ofparse-constructor that is the only entry point taking raw input, and frozen constants for the recognised members (Method::GET,Protocol::HTTP_2,Status::OK). The boundary behaviourtype-system/fb4216caasks ofMyEnum.deserializeis what.parseprovides: it raises on an unrecognised identifier forProtocol(HTTP-33), and forStatusit deliberately does not, becauseHTTP-10requires construction to be total over the protocol's code range so a vendor code such as nginx's 499 or Cloudflare's 520–526 survives. Exhaustiveness, whichT::Enumwould have given the type checker, is instead an RBS union plussteep checkat each fold site, withcase/in'sNoMatchingPatternErroras the runtime backstop (design §5). The styleguide-amendment alternative (making chapter 3's closed-set rule read "a sealed value type,T::Enumwhere Sorbet is in use") was considered and not taken; this is recorded as an SDK deviation instead (phase 1). review ·docs/work/mvp/phase1/2026-09-05-phase1-core-http-domain-model-design.md· high · sha:manual-phase1-closed-sets