Changelog

What we changed in each release of SISL Time Machine — no rounded marketing phrases, just file names, class names, SQL columns and endpoints.

current version
v0.8.1
releases shipped
14
since
May 13, 2026
next
v0.8.1
Multi-entity complete: customers, addresses, orders, stock
May 23, 2026 current
  • NEW Customer + address audit (capture + rollback). Email, group (B2B/wholesale pricing), data, addresses. A silent group change re-prices a whole B2B account — now recorded and reversible.
  • NEW Order audit (audit-only — no rollback). Trail of "who set this order to canceled at 14:32". Orders are quasi-fiscal — the legal path is a correction document, not a rollback. RollbackAction returns a clear error if asked.
  • NEW Stock audit (audit-only). qty / is_in_stock / backorders — forensic trail for overselling disputes. Two noise controls: tight ignore list (drops "use config" toggles) + cron-reindex guard (indexers re-save stock without origData → no flood).
  • SECURITY password_hash, rp_token, confirmation and login-throttle counters are hard-blacklisted in DeltaExtractor — customer audit must never become a credential leak.
  • INTERNAL 4 new observers on the EventContextResolver trait; DeltaExtractor stays the single diff engine (any AbstractModel); Rollbacker reuses resolveTargetFields/buildPlan across product/category/customer/address. Verified e2e on the testbed.
v0.8.0
Category audit + operational surface (Prometheus / JSON logs / deep health)
May 23, 2026 stable
  • NEW Category audit — until now we only captured products. The catalog_category_save_after observer now records name / status / parent / url_key / position changes. This is where expensive mistakes hide: someone disables a category or reparents the tree and the shop silently loses a whole navigation section.
  • NEW Category rollback via CategoryRepository->save() — full plugin chain + audit-of-audit (the revert itself is recorded as a rollback-sourced event).
  • NEW /metrics endpoint in Prometheus/OpenMetrics format: events_ingested_total{entity_type,source}, rollbacks/replays/timelines, build_info, uptime. Zero extra dependencies — the service stays a single self-contained binary.
  • NEW /health/deep endpoint — full write→read→verify→delete transaction + partition count. Green = "this instance can actually ingest", not just "PG answers SELECT 1". Kubernetes/Swarm pulls a half-broken instance instead of silently dropping events.
  • NEW JSON logs (LOG_FORMAT=json) — single-line, ready for ELK / Splunk / Loki. Human-readable format stays the default for dev.
  • INTERNAL EventContextResolver trait — shared who/where-from logic for product + category observers (ProductSaveAfter slimmed from ~200 to ~75 lines). .NET test suite: 274 green (+17 for MetricsCollector, incl. hostile-label sanitisation and a 1000-thread losslessness test).
v0.7.7
License check fix: correct endpoint + double-decrypt of the key
May 22, 2026 older
  • FIX Plugin called the wrong license URL. The endpoint is license.sisl.pl/check (Traefik adds the prefix → backend /api/licenses/check). The old default sisl.pl/api/licenses/check plus the /api/licenses/check path double-prefixed to a 404. Aligned with Optima Connector.
  • FIX License key was decrypted twice. The field is obscure (Encrypted backend) — Magento decrypts it on read, but the Helper called decrypt() again, turning the key into binary garbage (json_encode crash: “Malformed UTF-8”). Removed — we now read the value directly, like Sisl_Optima.
  • FIX License server default changed to https://license.sisl.pl (config.xml + Helper). Verified e2e against the live server: valid:true, Ed25519 verified:true.
v0.7.6
UX writer pass: consistent Polish labels across the admin UI
May 19, 2026 older
  • NEW Full review of every visible label in 3 admin views (timeline, analytics dashboard, Lite grid) + menu + system config. The PL/EN mix is unified — mostly Polish, with technical terms (rollback, HMAC, REST API, Tenant ID, base64, event) kept because Magento admins expect them.
  • NEW Buttons + messages: “Rollback to before this event” → “Cofnij do stanu sprzed tego eventu”. Modal: “Potwierdź cofnięcie”, “Nota audytowa” (instead of Audit-of-audit), errors like “Operacja rollback nie powiodła się: …”.
  • NEW Source badges: admin_ui → “Panel admina”, cli → “CLI / skrypt”, cron → “Zadanie cykliczne (cron)”, unknown → “Nieznane”.
  • NEW Admin menu: “Time Machine” → “SISL Time Machine” (root), “Lookup entity history” → “Historia encji”, “Operational analytics” → “Analityka operacyjna”.
  • NEW system.xml: numbered subgroups (“1. Ogólne”, “2. Połączenie z usługą”, “3. Zakres przechwytywania”), all field labels + comments in Polish. “coming soon” → “dostępne wkrótce”.
  • NEW Sisl_ChangeLogLite grid: table headers “Kiedy / SKU / Kto / Źródło / Zmiany”, filter “Filtruj” / “Wyczyść”, pager “Poprzednia” / “Następna”, upsell “Potrzebujesz czegoś więcej?” with “nasza komercyjna PRO”.
  • INTERNAL UX writer consultation with Gemini 2.5 Pro over the full label catalogue (~80 points A1-I1). Rules locked in: “rollback” stays an EN noun, the verb is “cofnąć/cofnięcie”; “event” kept (Magento devs know it); “encja” kept (Magento native); “now” badge on the diff stays EN.
v0.7.5
Operational analytics dashboard + free Lite module on Magento Marketplace
May 17, 2026 older
  • NEW New System → Time Machine → Operational analytics page. KPI strip (total events / rollbacks / rollback ratio %), 24h hourly activity chart, top 10 edited entities, top 10 most active users, source breakdown, daily events sparkline. Time window switchable: 7 / 30 / 90 / 180 / 365 days.
  • NEW GET /api/v1/analytics/overview?tenant=X&days=30&topN=10 endpoint in the .NET service. Five SQL aggregations in one round-trip — existing indexes (events_entity_lookup, events_actor_recent, events_source_recent) cover every query.
  • NEW Sisl_ChangeLogLite — separate free module on Magento Marketplace + GitHub (MIT license). Logs per-product changes locally into sisl_changelog_lite in MySQL, no microservice, no rollback. Built-in upgrade CTA → Time Machine PRO. Top-of-funnel lead generation.
  • INTERNAL License gate on the PHP analytics controller — without a valid licence the dashboard shows a banner instead of data (analytics is a PRO-tier feature in the pricing matrix). Tier discrimination beyond active/inactive is deferred to v0.10 when tier claims land in the licence verdict.
v0.7.3
License platform: Ed25519 subscription gate
May 16, 2026 older
  • NEW A license key activates the plugin. Format SISL-TMC-XXXX-XXXX-XXXX-XXXX. Without a valid key, events are not sent to the .NET service and rollback is blocked.
  • NEW Dedicated 0. Licencja section in Stores → Configuration → SISL → Time Machine with key field, server URL and a Sprawdz licencje button (immediate verification, bypasses the 24h cron).
  • NEW Daily cron sisl_timemachine_check_license at 03:00 refreshes the verdict — inline <schedule> in crontab.xml so it registers on a fresh install with no admin intervention.
  • SECURITY Single trust root with SISL Optima Connector — the same Ed25519 keypair signs verdicts for both products. Plugins embed only the public key — a cracked install cannot forge a valid response without breaking Ed25519.
  • SECURITY Per-request nonce (32 hex) inside the signed payload — responses cannot be replayed from sniffed traffic. Manifest hash (SHA256 over 9 module files) sent on every check — server logs tamper signals.
  • NEW 7-day offline grace: if sisl.pl is unreachable AND we have a previously verified valid state → the plugin keeps working. After 7 days assume the worst and disable capture/rollback. Explicit revoked / expired / host-mismatch verdicts never get grace.
  • INTERNAL Gate semantics: EventSender::send does a silent skip + log warning (capture quietly waits for reactivation), Rollbacker::rollbackProduct throws RollbackException even for dry-run — the admin UI gets HTTP 409 with a readable message.
v0.7.2
Rollback staging: a styled diff modal replaces native confirm()
May 15, 2026 older
  • NEW Clicking “Rollback to before this event” now opens a styled modal with a diff table [Field · Now · After rollback] — the operator sees exactly what will change before confirming.
  • NEW Modal header shows the product SKU, the target timestamp (readable YYYY-MM-DD HH:MM:SS UTC) and how many events produced the reconstructed state.
  • NEW Audit-of-audit reminder in the modal footer: this operation will record a new event with source rollback, and the rollback itself can be reverted later just like any other change.
  • NEW No-op case (live state already matches target) renders as an amber banner instead of an empty “are you sure” prompt. Confirm button hidden — there's nothing to confirm.
  • NEW Loading states: per-row button shows “Przygotowuję preview…” during the dry-run, modal confirm shows “Cofam…” while applying. Esc / backdrop click cancel.
  • INTERNAL No backend changes — RollbackAction.php already returned the full plan (sku, as_of, events_replayed, changes_planned). This is purely the presentation layer in timeline.phtml.
v0.7.1
UI: live current value next to each historical change
May 15, 2026 older
  • NEW Every field in the timeline now also shows its live current value next to the historical from → to. Green now badge = this change is still in effect, amber = a later event overwrote the field.
  • NEW Warning banner when the product has been deleted from the catalogue — the „now” column is hidden, timeline survives as the only record.
  • INTERNAL Timeline.php controller loads the product once, snapshots values, hands them to the block as current_values. No per-event repository call.
v0.7
Change-origin tracking: who, where from, why
May 15, 2026 older
  • NEW events.source column in PG: admin_ui / rest_api / rollback / cron / cli / unknown. Migration 002 is idempotent and auto-loaded via docker-entrypoint-initdb.
  • NEW Coloured badges in the timeline UI for change source. Rollback stands out in violet (audit-of-audit), admin in blue, API in grey.
  • NEW Human-readable user details: username + email + IP + request path in event metadata. No more bare admin:42.
  • NEW RollbackContext singleton — Rollbacker tags its own saves so the observer knows it's not a regular admin edit.
  • INTERNAL Source resolution order: RollbackContext > area code crontab > URL /rest/|/soap/|/graphql > admin session > PHP_SAPI cli > unknown. Order matters — a rollback always happens inside an admin session.
v0.6
Self-host packaging — one docker compose up
May 13, 2026 older
  • NEW Multi-stage Dockerfile for the .NET service (Alpine runtime, non-root). Image sisl/timemachine-service:0.5.0.
  • NEW Customer-facing deploy/ directory: docker-compose.yml, .env.example, migrations/, INSTALL.md. cp .env.example .env && docker compose up -d and you're live.
  • NEW INSTALL.md covers Linux Docker, Windows Server (Docker Desktop) and native Windows (Windows Service + EDB PostgreSQL).
  • SECURITY No baked-in HMAC defaults. The customer must generate their own key (openssl rand -base64 32) or compose refuses to start.
  • SECURITY PG and .NET service default to 127.0.0.1 binding — never exposed to LAN/WAN without an explicit override in .env.
v0.5
Admin UI: timeline + rollback inside Magento
May 13, 2026 older
  • NEW /admin/sisl_timemachine/product/timeline page rendering per-product event history + AJAX rollback flow with dry-run preview.
  • NEW Menu System → Time Machine → Lookup entity history plus a dedicated ACL Sisl_TimeMachine::timemachine_admin.
  • NEW Time Machine button next to Save / Save & Close on the product edit toolbar — one click to the edited product's timeline.
  • NEW Coloured per-field from → to diff, status pill per event, JS confirmation flow before apply.
v0.4
Rollback engine — apply past state via Magento
May 13, 2026 older
  • NEW PHP Rollbacker reconstructs entity state at time T (via the .NET replay) and applies it through ProductRepository->save() — every plugin / validator / observer fires.
  • NEW Dry-run mode returns the plan without committing — the admin UI uses it for the confirm dialog.
  • NEW Pre-history fallback: rollback before the very first event rebuilds state from the from values of the first diff.
  • NEW Audit-of-audit: the rollback itself emits a new event into the timeline. The chain is unbreakable.
v0.3
Replay engine + timeline endpoint
May 13, 2026 older
  • NEW GET /api/v1/replay/{type}/{id}?at=ISO — pure replay, applies events in order, returns the reconstructed field state at the given moment.
  • NEW GET /api/v1/timeline/{type}/{id} — raw event list newest-first, with pagination.
  • SECURITY HMAC required on reads (not just POST). Audit log content is sensitive — anyone with the URL must hold the shared secret.
v0.1
Initial scaffold — capture-only, single-entity
May 13, 2026 first
  • NEW Magento module skeleton (registration, module.xml, events.xml, ACL, system.xml, admin config UI).
  • NEW catalog_product_save_after observer + DeltaExtractor (per-attribute diff, internal-field blacklist, from: null skip on existing entities).
  • NEW .NET 8 microservice with /health + POST /api/v1/events. HMAC-SHA256 middleware (constant-time MAC + ±60s clock skew).
  • NEW PostgreSQL events table with monthly partitions, GIN index over the JSONB delta, dedup table for idempotency.
  • FIX Idempotency moved to a separate event_ids table — a partitioned UNIQUE would have to include the partition key (which breaks dedup). Claim happens via a CTE INSERT … ON CONFLICT DO NOTHING.

What's next in Time Machine?

The roadmap shows what we're building in v0.8 (multi-entity capture), v0.9 (snapshots + bulk rollback) and v1.0 (public launch Q3 2026). Every major-version upgrade is included in the subscription.