Repository navigation
Description
Tracks spec v0.9.0 compliance.
-
Supply the bound domain to provider initialization #297 Domain in provider init (feat: pass the bound domain to provider init and support domain-scoped providers #345, fix: release init waiters on replacement and same-thread re-entry #348)
-
Isolated API instances (1.8) (feat: isolated API instances #354)
-
Wire telemetry helper into eval path; verify Appendix D alignmentThe SDK helper already matches Appendix D; the remaining gaps are in the OTel hook, tracked in OTel hooks: align error attributes and exception recording with spec Appendix D ruby-sdk-contrib#268 -
Multi-provider (optional)Deferred to Multi-Provider in the SDK (spec Appendix A) #344 -
Init + pin
specsubmodule to v0.9.0 (chore: pin spec submodule to v0.9.0 #335) -
Provider lifecycle event ownership (race-condition fix) (feat: let providers own their lifecycle events #353): add opt-in marker so providers emit their own
PROVIDER_READY/PROVIDER_ERROR; SDK derives status from the provider event stream and keeps + deprecates the legacy synthetic path; update first-party providers (spec 5.3.5, provider status 2.8, Appendix E)
Found in the v0.9.0 audit:
- Replaced or shut-down providers are detached, and their events are dropped (1.1.2.3, 1.6.2, 2.5.2) (fix: detach replaced and shut-down providers #341)
- Client calls return the default instead of raising (1.4.10, 1.4.11) (fix: return defaults instead of raising from client calls #346, fix: catch NotImplementedError in track and the hook lifecycle #349)
- Provider error codes carried through hooks (2.2.7) (fix: carry provider error codes through hooks #339)
-
PROVIDER_RECONCILINGandPROVIDER_CONTEXT_CHANGEDevents (5.1.1) (feat: add PROVIDER_RECONCILING and PROVIDER_CONTEXT_CHANGED events #338) - Gherkin runs on the SDK's in-memory provider (Appendix A) (feat: support variant flags in InMemoryProvider #340)
- Ordered event delivery; client handlers can emit events and add or remove handlers (5.1.2, 5.2.7, 5.3.3, 5.3.5) (Reentrant provider events reach client callbacks out of order #332, fixed in fix: deliver provider events in order, outside handler locks #351)
- Clients resolve their provider by domain on every call (1.1.3, 1.1.5, 1.7.1) (fix!: resolve a client's provider by domain on every call #352)
- Immutable hook inputs (4.1.3, 4.1.4.1, 4.2.2.1–4.2.2.3) (fix!: make hook inputs immutable #357)
- Community spec fixes: fix: use provider object as hash key in ProviderStateRegistry #270, fix: align NoOpProvider reason and ProviderInitializationError default error code with spec #271, fix: freeze ClientMetadata to satisfy spec req 4.2.2.1 #273 (fix: key provider state by identity, default the NoOp reason, freeze client metadata #355), fix: do not mutate provider's ResolutionDetails on type mismatch #272 (fix: do not mutate the provider's ResolutionDetails #358)
Then:
- Compliance pass: every v0.9.0 MUST is met or marked n/a (fixes fix: close the spec v0.9.0 gaps the compliance audit found #361, tests test: cover spec v0.9.0 requirements the audit found untested #360)
- Specification badge moves to v0.9.0 (docs: claim spec v0.9.0 #362)
Activity
josecolella commentedon Oct 22, 2026
Progress update and a few scope changes after an audit against v0.9.0:
Telemetry.create_evaluation_eventalready matches the v0.9.0 attributes. The remaining gaps (error.type,error.message, recording exceptions in the error stage) are in contrib's OTel hook, so I'm moving that item there.ThreadError(5.1.2, 5.2.7).josecolella commentedon Oct 22, 2026
Progress update:
Still open for v0.9.0
init. feat(core): pass bound domain to provider init and enforce domain-scoped binding #298 is a draft with merge conflicts.APIis still a singleton.init.main.deadlock; recursive locking. The SDK logs the error, so callers never see it (5.1.2, 5.2.7). Reproduced onmain.error.type,error.message, recording exceptions) still needs an issue in ruby-sdk-contrib.Related: #270–#273 are open spec fixes that aren't on this list yet.
The specification badge stays at v0.8.0 until the items above land.
josecolella commentedon Oct 23, 2026
Taking over the remaining items. New PRs and issues:
initand supports domain-scoped providers. It takes over feat(core): pass bound domain to provider init and enforce domain-scoped binding #298 and keeps Jonathan's commits. Closes Supply the bound domain to provider initialization #297.Next up, stacked on #345:
After those: read-only hook inputs (after #273), a compliance pass, and the v0.9.0 badge. Everything ships together as 0.7.0.
josecolella commentedon Oct 23, 2026
Closed by #362. Every box above is done, and the README now claims spec v0.9.0.
Releases: this work shipped across 0.6.6, 0.6.7, 0.7.0, 0.7.1 and 0.8.0. The first release with the compliance fixes (#361), the added tests (#360) and the badge (#362) is 0.8.1, which is still pending in #363.
Compliance: an audit checked every requirement in sections 1–6 and Appendix A against spec v0.9.0, reading each test's body rather than its label. #362's description has the summary:
finally;ArgumentError;StandardErrorandNotImplementedErrorpropagate.Not met, at SHOULD level only:
EventEmitter.Deferred:
ProviderMetadata, so hooks don't copy it on every evaluation. There's no issue for this yet.Thanks to Cristian Marta (#270–#273, carried in #355 and #358), Jonathan Norris (#298, carried in #345) and Leo Romanovsky (#332, fixed in #351). Each is credited as co-author on the merged commits.