Changelog

Notable changes to the j17 platform.

0.5.7

April 15, 2026

Fixed

  • Improved resilience of projection materialization under adverse conditions

0.5.6

April 14, 2026

Changed

  • Spec and projection deployment is now upload-only — inline text editors removed from dashboard
  • Uploads expect the same JSON format as the API
  • Spec diff buttons now toggle on/off

Fixed

  • Projection deploy docs corrected to show actual headnode endpoint and wrapper format
  • Admin API reference now includes all projection endpoints (deploy, list, delete)

0.5.5

April 14, 2026

Added

  • $.id template path now available everywhere — extracts aggregate ID from key
  • $.metadata.* now available in saga templates (actor, target, timestamp)
  • Upload JSON file for spec deployment on the dashboard
  • Scope descriptions on the API key creation form

Improved

  • API key environment now defaults to the currently selected environment
  • Template paths unified across handlers, implications, and sagas — single reference in JSONPath docs
  • Removed non-functional Admin scope from API key form (admin actions use JWT, not API keys)

0.5.4

April 13, 2026

Fixed

  • Saga race condition: response events arriving before a step transitions to "awaiting" are no longer lost
  • Projection cross-source resolution no longer breaks when source names sort alphabetically before their dependencies
  • Projections now resolve data for all aggregate types, not just those with caching enabled
  • Projection definitions are now visible on workers immediately after deploy (was up to 5 minutes)
  • Projection JSON-by-ID endpoint now computes on demand instead of returning null on cache miss
  • ProjectionUpdater no longer crashes on empty Redis pipeline for new projections
  • JSON parse errors from the engine are now human-readable

Improved

  • Saga timeout checks guard against overwriting concurrent inline advances
  • Projection materialization failures are now visible in logs

0.5.3

April 13, 2026

Fixed

  • Saga @.* and $.state.* templates now work — trigger aggregate state was captured but never persisted
  • Optional template suffix ? is now supported in saga emit data (e.g., $.data.field? omits the key when absent instead of emitting null)
  • Saga await resolution is now near-instant instead of taking 2+ seconds per step
  • Schema validation errors now show expected vs. actual types
  • Saga step errors are now structured with type, detail, and path fields

Improved

  • Saga troubleshooting guide added to documentation

0.5.2

April 9, 2026

Fixed

  • Dashboard data browser no longer errors when selecting back to the default option
  • Quick Start curl hint now shows the correct environment-specific URL

0.5.1

April 4, 2026

Fixed

  • @. paths now work correctly in implication emit targets and data templates
  • Implication conditions now have access to source aggregate state

0.5.0

April 4, 2026

Added

  • @. prefix for reading current aggregate state in tick handlers, implications, and sagas
  • Tick handler conditionals can now guard on aggregate state

Deprecated

  • $.state.* in implications and sagas — use @.* instead (removal at or before 1.0)

0.4.0

April 4, 2026

Changed

  • GET /:type now returns IDs by default; use ?resolve to hydrate to full aggregate objects
  • Resolved aggregates use batch cache reads with async fallback for cache misses
  • Projection auto-detection removed from listing endpoint — use dedicated projection endpoints

Added

  • Saga $.state.* templates: reference the trigger aggregate's state at saga creation time
  • Predicate shorthand for array matching — single-key objects desugar to equality checks
  • support on GET /:type?resolve to skip cache

Fixed

  • Saga state snapshots used wrong key format (always returned empty state)
  • Docker container conflicts during test instance provisioning
  • Internal rate limiting no longer applies to headnode-to-worker requests

0.3.1

April 3, 2026

Fixed

  • Scheduled event cancellation now works correctly for specs that define schedule implications inline on events
  • Removed unused internal code path in spec caching

0.3.0

March 28, 2026

Added

  • Structured audit log with admin viewer
  • Webhook notifications with HMAC signing (Stripe-style) and replay protection
  • Health counters and engine performance metrics on Prometheus endpoint

Improved

  • 66x throughput improvement for authenticated requests under load
  • Metrics endpoint now requires internal authentication

Fixed

  • Saga depth tracking, stuck state detection, compensation, and race conditions
  • Saga emit deduplication
  • Billing settlement and concurrency bugs
  • GDPR tombstones no longer interfere with optimistic concurrency control
  • Numeric bounds checking in the engine for integer and float values
  • Instance names can now be reused after deletion
  • Dashboard write operations properly gated by user role
  • Consistent error responses across all API endpoints

Security

  • SQLite ATTACH/DETACH blocked at the database driver level (defense in depth for customer SQL queries)

0.2.0

March 22, 2026

Added

  • Organization-owned instances with billing, access control, and transfer
  • Push-based spec cache invalidation (specs update on workers immediately after deploy)
  • Aggregate listing endpoint: GET /:aggregate_type returns full data with cursor pagination
  • Projection CSV export: GET /_projections/:name/export.csv
  • Customer SQL queries against projections: POST /_projections/query

Changed

  • All dashboard UI consolidated to the control plane; worker nodes are now pure data APIs
  • Sagas validated at deploy time (OCC settings, template paths)
  • Checkpoints renamed to anchors

Fixed

  • API key scope enforcement
  • Health polling reliability
  • Usage accounting and display

0.1.0

March 11, 2026

Initial alpha release.

Core Engine

  • Event validation, optimistic concurrency control, and aggregate computation
  • JSON Schema Draft 2020-12 validation (99.9% official test suite)
  • Declarative tick handlers: set, merge, append, remove, increment, decrement
  • Conditional operations, array operations, variable bindings
  • Implications: reactive cross-aggregate event generation with cycle detection

Platform

  • Multi-tenant event sourcing with per-instance isolation
  • JWT auth for operators, API key auth for data operations
  • Instance environments (prod / staging / test) with scoped API keys
  • Scheduled events with cancel conditions and dead-letter handling
  • Sagas with compensation and rollback
  • JSON projections with background refresh
  • WASM escape hatch for custom handlers
  • Idempotency keys with 24h TTL
  • Cryptographic audit trail: hash chains, Merkle proofs, signed anchors
  • GDPR tombstoning with transitive cascade

Control Plane

  • Identity, billing, node registry, and health monitoring
  • Tiered plans with daily accrual / monthly settlement billing