Changelog
Notable changes to the j17 platform.
0.5.7
April 15, 2026Fixed
- Improved resilience of projection materialization under adverse conditions
0.5.6
April 14, 2026Changed
- 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, 2026Added
-
$.idtemplate 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, 2026Fixed
- 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, 2026Fixed
- 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, 2026Fixed
- 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, 2026Fixed
-
@.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, 2026Added
-
@.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, 2026Changed
-
GET /:typenow returns IDs by default; use?resolveto 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 onGET /:type?resolveto 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, 2026Fixed
- 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, 2026Added
- 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, 2026Added
- 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_typereturns 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, 2026Initial 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