Changelog
Features
- 31acae3: feat(bulkhead): return structured BulkheadError on rejection (§2.5) (@sanskarpan)
- 6d3e9e7: feat(bulkhead): structured BulkheadError with saturation snapshot (§2.5) (@sanskarpan)
- 0c1d8f2: feat(circuitbreaker): circuitbreaker.go — pluggable half-open probe strategies (§1.11) (@sanskarpan)
- 85c415d: feat(circuitbreaker): config.go — pluggable half-open probe strategies (§1.11) (@sanskarpan)
- a7d6ad5: feat(circuitbreaker): halfopen.go — pluggable half-open probe strategies (§1.11) (@sanskarpan)
- f2bfb9f: feat(circuitbreaker): structured CircuitError accessors + predicates (§2.5) (@sanskarpan)
- c9c6874: feat(circuitbreaker): zero-value Config defaults doc + test (§2.7) (@sanskarpan)
- 1b73e1a: feat(debounce): debounce.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- adb9e03: feat(debounce): debounce_test.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- 2ab098f: feat(debounce): doc.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- 5a5f489: feat(debounce): example_test.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- b268d1a: feat(debounce): throttle.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- 1456f2f: feat(debounce): throttle_test.go — debounce/throttle primitives (§1.9) (@sanskarpan)
- 5f54f14: feat(eventstream): generic pub/sub broker (§4.7) (@sanskarpan)
- b74f901: feat(frontend): Vercel config + deploy/preview-env docs (§10.4) (@sanskarpan)
- ec13901: feat(frontend): accessibility pass — landmarks, aria-live, labels, focus, SVG a11y (§10.1) (@sanskarpan)
- e2ab033: feat(frontend): accessible forms + labelled controls across pages (§10.1) (@sanskarpan)
- e3bc7c8: feat(frontend): recharts allow/deny ratio, latency histogram, CB state timeline (§10.2) (@sanskarpan)
- d9a34c0: feat(logging): slog structured-logging hooks (§4.4) (@sanskarpan)
- a342483: feat(pipeline): per-attempt deadline budgeting — RetryBudgeted (§1.12) (@sanskarpan)
- 66fa375: feat(ratelimit): read-only Peeker/Observer interfaces (§2.6) (@sanskarpan)
- 48ca28c: feat(release): Homebrew tap brews block + install docs (§9.5) (@sanskarpan)
- e2286fa: feat(resilience): unified fluent builder + generic Execute[T] (§2.2) (@sanskarpan)
- 5e45e13: feat(resiliencex): doc.go — generic Execute[T] helpers (§2.3) (@sanskarpan)
- ff42891: feat(resiliencex): execute.go — generic Execute[T] helpers (§2.3) (@sanskarpan)
- d89e232: feat(resiliencex): execute_test.go — generic Execute[T] helpers (§2.3) (@sanskarpan)
- 53b5695: feat(server): make the demo server its own nested module (§10.3) (@sanskarpan)
- cc0d7b1: feat(server): wire self-protection + body caps + timeouts (§7.4) (@sanskarpan)
- bd3e4aa: feat(stores): Memcached + DynamoDB store backends in a nested module (§5.2) (@sanskarpan)
- 64d9733: feat: v1.0.0 — stable public API, promote clock package, pre-release polish (@sanskarpan)
Bug fixes
- 0aac0d0: fix(ci): gofmt, deprecated-symbol, and ScriptID type fixes for v1.0.0 (@sanskarpan)
- 350fe80: fix(docs): mkdocs --strict — nav deploy-frontend + tolerate cross-boundary repo-root links (@sanskarpan)
- 082785b: fix(release): disable Homebrew formula upload until tap repo is created (@sanskarpan)
- 8186323: fix(release): skip Homebrew tap publish when HOMEBREW_TAP_GITHUB_TOKEN is unset (@sanskarpan)
- c37c379: fix(store): update integration tests to use typed ScriptID vars (@sanskarpan)
Performance
- 020e8f5: perf(circuitbreaker): single-lock time-window record+trip on closed path (§3.4) (@sanskarpan)
Others
- c6b056c: build(release): build+test the server module (goreleaser dir, Dockerfile, CI, Makefile) (§10.3) (@sanskarpan)
- b7b7b6e: build(release): enable Homebrew tap formula publish (@sanskarpan)
- 78b3173: chore(ci): bump the github-actions group with 10 updates (@sanskarpan)
- ef4d857: chore(ci): bump the github-actions group with 10 updates (@dependabot[bot])
- e848f14: chore(ci): pin mkdocs-material to 9.5.x for stable strict-mode build (@sanskarpan)
- 112472b: chore(ci): test-stores + stores CI job + mutation targets (@sanskarpan)
- 73351b9: chore(deps): bump the go-dependencies group across 1 directory with 2 updates (@dependabot[bot])
- 3560b21: chore(deps): bump the go-dependencies group across 1 directory with 2 updates (@sanskarpan)
- 349da3a: chore(deps): bump the npm-production group in /frontend with 5 updates (@sanskarpan)
- ddf148b: chore(deps): bump the npm-production group in /frontend with 5 updates (@dependabot[bot])
- afbb1a9: chore(deps): drop gorilla/websocket from root module (moved to server module) (§10.3) (@sanskarpan)
- 5976eed: chore(deps): tidy contrib and stores modules after go-redis and grpc bumps (@sanskarpan)
- d3ed2d4: chore(deps): tidy integration module after go-redis and grpc bumps (@sanskarpan)
- a0631d1: chore(deps): tidy server module after go-redis and grpc bumps (@sanskarpan)
- 2b7bea8: chore(deps-dev): bump jsdom (@dependabot[bot])
- f427f04: chore(deps-dev): bump jsdom from 25.0.1 to 29.1.1 in /frontend (@sanskarpan)
- 0a31610: chore(frontend): add Vitest + RTL + jest-axe test infra (§10.5) (@sanskarpan)
- ee40915: chore(make): fuzz-server target (§7.5) (@sanskarpan)
- 5457686: chore(verify-deps): guard debounce/tiered/resiliencex as zero-dep core (@sanskarpan)
- 73dd47f: chore(verify-deps): guard logging/eventstream as zero-dep core (@sanskarpan)
- 6f80601: ci(release): pass HOMEBREW_TAP_GITHUB_TOKEN to goreleaser step (@sanskarpan)
- 88724b4: docs(adr): add architecture decision records (§8.6) (@sanskarpan)
- 8770f1c: docs(blog): technical articles + talk outline (§11.3) (@sanskarpan)
- ca68660: docs(changelog): seed CHANGELOG + commits→changelog flow (§9.4) (@sanskarpan)
- ac09ae3: docs(examples): resilience-stack/tiered/debounce runnable examples + catalog (§11.4) (@sanskarpan)
- 8ad5c2e: docs(ratelimit/adaptive): document intentional node-local scope (§1.8) (@sanskarpan)
- a21ce64: docs(ratelimit/store): escape-analysis findings on Eval arg path (§3.3) (@sanskarpan)
- 3ec85fd: docs(readme): library-vs-alternatives comparison table (§11.1) (@sanskarpan)
- 311f1b0: docs(security): GitHub Security Advisories reporting flow (§7.3) (@sanskarpan)
- 928459e: feat(contrib/chimw): CircuitBreaker adapter (re-export core net/http middleware) (@sanskarpan)
- 0df265c: feat(contrib/connectmw): connect CircuitBreaker interceptor with server-fault predicate (@sanskarpan)
- 79cb0d1: feat(contrib/echomw): native echo CircuitBreaker middleware (@sanskarpan)
- 703f738: feat(contrib/fibermw): native fiber CircuitBreaker middleware (@sanskarpan)
- 517d8f3: feat(contrib/ginmw): native gin CircuitBreaker middleware (@sanskarpan)
- 798ce8e: feat(deploy/prometheus): README.md — recording/alert rules (§9.6) (@sanskarpan)
- cded073: feat(deploy/prometheus): alerts.yml — recording/alert rules (§9.6) (@sanskarpan)
- cbb5943: feat(deploy/prometheus): prometheus.yml — recording/alert rules (§9.6) (@sanskarpan)
- 12b1e1a: feat(deploy/prometheus): rules.yml — recording/alert rules (§9.6) (@sanskarpan)
- 29e296f: feat(internal/simulation): deterministic sim harness + fault injection (§6.7) (@sanskarpan)
- 9b5d58a: feat(metric/prometheus): native histograms + trace exemplars (§4.5) (@sanskarpan)
- fc90e9d: feat(ratelimit/internal/shardmap): sharded per-key map (§3.1) (@sanskarpan)
- c10dd2f: feat(ratelimit/leakybucket): leakybucket.go — priority-aware Wait (§1.7) (@sanskarpan)
- 3293f2b: feat(ratelimit/leakybucket): priority.go — priority-aware Wait (§1.7) (@sanskarpan)
- 322858f: feat(ratelimit/leakybucket): store-backed NewDistributed, fail-open (§1.8) (@sanskarpan)
- 2cc6705: feat(ratelimit/ratelimitctx): context cost/priority helpers (§2.8) (@sanskarpan)
- f6c543b: feat(ratelimit/store): LeakyBucketScript Lua + in-memory emulation (§1.8) (@sanskarpan)
- 569d6b0: feat(ratelimit/store): PrecisionBoundNs + documented 256ns guarantee (§5.4) (@sanskarpan)
- c888a75: feat(ratelimit/tiered): doc.go — hierarchical/tiered limits (§1.6) (@sanskarpan)
- 0ba584b: feat(ratelimit/tiered): tiered.go — hierarchical/tiered limits (§1.6) (@sanskarpan)
- 6b31468: feat(ratelimit/tiered): tiered_test.go — hierarchical/tiered limits (§1.6) (@sanskarpan)
- ea1155d: feat(server/api): dogfooded per-IP rate limit + concurrency guard (§7.4) (@sanskarpan)
- daf5d79: feat(server/config): self-protection config fields + defaults (§7.4) (@sanskarpan)
- 5a8a0ef: fix(server/version): make Version/Name vars so -ldflags -X actually applies (§10.3) (@sanskarpan)
- b4ad753: perf(ratelimit/fixedwindow): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- 36df307: perf(ratelimit/gcra): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- c7a18ff: perf(ratelimit/leakybucket): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- ae2a197: perf(ratelimit/slidingwindow): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- ab7d1b8: perf(ratelimit/slidingwindow): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- d66a4d0: perf(ratelimit/tokenbucket): shard per-key map to cut lock contention (§3.1) (@sanskarpan)
- db90706: style: gofmt tiered/resiliencex test files (@sanskarpan)
- 2258cab: test(bulkhead): BulkheadError taxonomy tests (§2.5) (@sanskarpan)
- 79ad6c2: test(bulkhead): benchmarks (§3.5) (@sanskarpan)
- 47f3396: test(bulkhead): use errors.Is for wrapped ErrBulkheadFull (@sanskarpan)
- fe54527: test(circuitbreaker): error taxonomy tests (§2.5) (@sanskarpan)
- 838f3a2: test(circuitbreaker): half-open ramp probe strategy tests (§1.11) (@sanskarpan)
- 73c6657: test(circuitbreaker): time-based bench + concurrent threshold-hammer tests (§3.4) (@sanskarpan)
- 3cf4d54: test(concurrency): benchmarks (§3.5) (@sanskarpan)
- 28a3b8a: test(contrib/chimw): e2e circuit-breaker open/success coverage (@sanskarpan)
- bcb38ba: test(contrib/connectmw): e2e breaker open/client-error-no-trip/success coverage (@sanskarpan)
- 3076d02: test(contrib/echomw): e2e circuit-breaker open/handler-error/success coverage (@sanskarpan)
- 5158605: test(contrib/fibermw): e2e circuit-breaker open/success coverage (@sanskarpan)
- 86b71eb: test(contrib/ginmw): e2e circuit-breaker open/success/skip coverage (@sanskarpan)
- 188b2bd: test(frontend): Vitest component/hook/store unit tests (§10.5) (@sanskarpan)
- cfc2853: test(integration): testcontainers Redis integration module (§6.3) (@sanskarpan)
- b9af518: test(loadshed): benchmarks (§3.5) (@sanskarpan)
- 8e964f2: test(pipeline): benchmarks (§3.5) (@sanskarpan)
- 23f3f83: test(pipeline): per-attempt deadline budgeting tests (§1.12) (@sanskarpan)
- e2fd06b: test(ratelimit): Peeker/Observer compile-time assertions (§2.6) (@sanskarpan)
- 8c660c2: test(ratelimit): distributed leaky bucket + Redis parity (§1.8) (@sanskarpan)
- 3d6e90f: test(ratelimit): many-key parallel contention benchmarks (§3.1) (@sanskarpan)
- 1059900: test(ratelimit/adaptive): benchmarks (§3.5) (@sanskarpan)
- 82d571a: test(ratelimit/adaptive): fuzz targets (§6.2) (@sanskarpan)
- 003e0c4: test(ratelimit/composite): benchmarks (§3.5) (@sanskarpan)
- b094c7f: test(ratelimit/composite): fuzz targets (§6.2) (@sanskarpan)
- 483013a: test(ratelimit/leakybucket): fuzz targets (§6.2) (@sanskarpan)
- 12873d1: test(ratelimit/leakybucket): priority Wait ordering + cancellation (§1.7) (@sanskarpan)
- 81bb46c: test(ratelimit/middleware): benchmarks (§3.5) (@sanskarpan)
- afd308a: test(ratelimit/slidingwindow): fuzz targets (§6.2) (@sanskarpan)
- 018e089: test(ratelimit/store): fuzz targets (§6.2) (@sanskarpan)
- 45ff233: test(retry): benchmarks (§3.5) (@sanskarpan)
- a67582c: test(server): server-local internal/testutil (internal/ not importable across module split) (§10.3) (@sanskarpan)
- 28f82cf: test(server/api): fuzz JSON decoders + simulator (§7.5) (@sanskarpan)
- 089d1c6: test(server/api): self-protection tests (§7.4) (@sanskarpan)