Changelog

Co dokładnie zmienialiśmy w każdej wersji SISL Time Machine — bez marketingowych okrągłych zdań, z konkretnymi nazwami plików, klas, kolumn SQL i endpointów.

aktualna wersja
v0.8.1
wydanych wersji
14
od
13 maja 2026
następna
v0.8.1
Multi-entity komplet: klienci, adresy, zamówienia, stany magazynowe
23 maja 2026 current
  • NEW Audyt klientów + adresów (capture + rollback). E-mail, grupa cenowa (B2B/hurt), dane, adresy. Ciche przepięcie grupy potrafi przecenić całe konto B2B — teraz to jest zapisane i odwracalne.
  • NEW Audyt zamówień (tylko audyt — bez rollbacku). Ślad „kto ustawił zamówienie na anulowane o 14:32". Zamówienia to dokumenty quasi-fiskalne — ścieżką prawną jest korekta, nie cofnięcie. RollbackAction zwraca jasny błąd jeśli ktoś spróbuje.
  • NEW Audyt stanów magazynowych (tylko audyt). qty / is_in_stock / backorders — ślad forensyczny przy sporach o nadsprzedaż. Dwa filtry szumu: ciasna lista ignorowanych pól (toggle „use config" odpadają) + guard na reindex z crona (indeksery zapisują stock bez origData → bez floodu).
  • SECURITY password_hash, rp_token, confirmation i liczniki prób logowania twardo zablokowane w DeltaExtractor — audyt klientów nigdy nie może stać się wyciekiem poświadczeń.
  • INTERNAL 4 nowe observery na traicie EventContextResolver; DeltaExtractor zostaje jednym silnikiem diff (dowolny AbstractModel); Rollbacker reużywa resolveTargetFields/buildPlan dla product/category/customer/address. Zweryfikowane e2e na testbedzie.
v0.8.0
Audyt kategorii + warstwa operacyjna (Prometheus / JSON logi / deep health)
23 maja 2026 stable
  • NEW Audyt kategorii — do tej pory łapaliśmy tylko produkty. Teraz observer catalog_category_save_after rejestruje zmiany nazwy, statusu, rodzica, url_key, pozycji. Tu chowają się drogie pomyłki: ktoś wyłącza kategorię albo przepina drzewo i sklep cicho traci całą sekcję nawigacji.
  • NEW Rollback kategorii przez CategoryRepository->save() — pełny plugin chain + audit-of-audit (samo cofnięcie też się zapisuje jako event ze źródłem rollback).
  • NEW Endpoint /metrics w formacie Prometheus/OpenMetrics: events_ingested_total{entity_type,source}, rollbacks/replays/timelines, build_info, uptime. Zero dodatkowych zależności — service zostaje jednym samodzielnym binarnym plikiem.
  • NEW Endpoint /health/deep — pełna transakcja write→read→verify→delete + liczba partycji. Zielony = „ta instancja realnie przyjmie event", nie tylko „PG odpowiada SELECT 1". Kubernetes/Swarm wypchnie półmartwą instancję zamiast cicho gubić eventy.
  • NEW Logi JSON (LOG_FORMAT=json) — jednoliniowe, gotowe do ELK / Splunk / Loki. Domyślnie zostaje czytelny format dla dev.
  • INTERNAL Trait EventContextResolver — wspólna logika who/where-from dla observerów produktu i kategorii (ProductSaveAfter schudł z ~200 do ~75 linii). Suite testów .NET: 274 zielone (+17 dla MetricsCollector, w tym sanityzacja wrogich labeli i 1000-wątkowy test bezstratności).
v0.7.7
Fix weryfikacji licencji: poprawny endpoint + podwójne odszyfrowanie klucza
22 maja 2026 older
  • FIX Plugin pytał o licencję pod złym adresem. Endpoint to license.sisl.pl/check (Traefik dokleja prefix → backend /api/licenses/check). Poprzedni default sisl.pl/api/licenses/check + ścieżka /api/licenses/check dawały podwójny prefix i 404. Ujednolicone z Optima Connector.
  • FIX Klucz licencji był odszyfrowywany dwa razy. Pole jest typu obscure (backend Encrypted) — Magento odszyfrowuje je samo przy odczycie, a Helper wołał decrypt() drugi raz, zamieniając klucz w binarny śmieć (crash json_encode: „Malformed UTF-8”). Usunięte — czytamy wartość wprost, jak Sisl_Optima.
  • FIX Default serwera licencyjnego zmieniony na https://license.sisl.pl (config.xml + Helper). Zweryfikowane e2e na żywym serwerze: valid:true, Ed25519 verified:true.
v0.7.6
UX writer pass: spójne polskie labelki w całym admin UI
19 maja 2026 older
  • NEW Pełny review każdej widocznej etykiety w 3 widokach admina (timeline, dashboard analityki, Lite grid) + menu + system config. Mieszanka PL/EN ujednolicona — głównie polski, techniczne terminy (rollback, HMAC, REST API, Tenant ID, base64, event) zachowane bo admin Magento ich oczekuje.
  • NEW Przyciski + komunikaty: „Rollback to before this event” → „Cofnij do stanu sprzed tego eventu”. Modal: „Potwierdź cofnięcie”, „Nota audytowa” (zamiast Audit-of-audit), error messages typu „Operacja rollback nie powiodła się: …”.
  • NEW Source badge'e: admin_ui → „Panel admina”, cli → „CLI / skrypt”, cron → „Zadanie cykliczne (cron)”, unknown → „Nieznane”.
  • NEW Menu admina: „Time Machine” → „SISL Time Machine” (root), „Lookup entity history” → „Historia encji”, „Operational analytics” → „Analityka operacyjna”.
  • NEW system.xml: numerowane podgrupy („1. Ogólne”, „2. Połączenie z usługą”, „3. Zakres przechwytywania”), wszystkie field labele + commenty po polsku. „coming soon” → „dostępne wkrótce”.
  • NEW Sisl_ChangeLogLite grid: nagłówki tabeli „Kiedy / SKU / Kto / Źródło / Zmiany”, filtr „Filtruj” / „Wyczyść”, paginacja „Poprzednia” / „Następna”, upsell „Potrzebujesz czegoś więcej?” z „nasza komercyjna PRO”.
  • INTERNAL Konsultacja UX writer brief z Gemini 2.5 Pro nad pełnym katalogiem stringów (~80 punktów A1-I1). Zasady utrwalone: „rollback” rzeczownik EN, czasownik = cofnąć/cofnięcie; „event” zachowany (Magento devs znają); „encja” zachowana (Magento native); „now” badge przy diff'ie zostaje EN.
v0.7.5
Pulpit analityki operacyjnej + darmowy moduł Lite na Magento Marketplace
17 maja 2026 older
  • NEW Nowy pulpit System → Time Machine → Operational analytics. KPI strip (łącznie zmian / cofnięć / rollback ratio %), wykres aktywności godzinowej 24h, top 10 edytowanych encji, top 10 najaktywniejszych userów, breakdown po źródle, sparkline eventów dziennie. Okno czasowe przełączalne: 7 / 30 / 90 / 180 / 365 dni.
  • NEW Endpoint GET /api/v1/analytics/overview?tenant=X&days=30&topN=10 w .NET service. Pięć SQL aggregations w jednym round-tripie — istniejące indeksy (events_entity_lookup, events_actor_recent, events_source_recent) pokrywają wszystkie zapytania.
  • NEW Sisl_ChangeLogLite — osobny darmowy moduł na Magento Marketplace + GitHub (MIT license). Loguje per-product zmiany lokalnie do sisl_changelog_lite w MySQL, bez microservice'u, bez rollbacku. Wbudowany upgrade CTA → Time Machine PRO. Top-of-funnel lead generation.
  • INTERNAL License gate na PHP-side analytics controller — bez ważnej licencji dashboard pokazuje banner zamiast danych (analytics to PRO-tier feature w pricing matrix). Tier discrimination beyond active/inactive zostawione na v0.10 gdy tier claims wpiszą się w licence verdict.
v0.7.3
Platforma licencyjna: Ed25519 subscription gate
16 maja 2026 older
  • NEW Klucz licencji aktywuje plugin. Format SISL-TMC-XXXX-XXXX-XXXX-XXXX. Bez waznego klucza eventy nie sa wysylane do .NET service'u, a rollback jest zablokowany.
  • NEW Sekcja 0. Licencja w Stores → Configuration → SISL → Time Machine z polem klucza, URL serwera i przyciskiem Sprawdz licencje (natychmiastowa weryfikacja, bez czekania na cron).
  • NEW Codzienny cron sisl_timemachine_check_license o 03:00 odnawia werdykt — inline <schedule> w crontab.xml, dziala na fresh install bez interwencji admina.
  • SECURITY Single trust root z Sisl Optima Connector — ten sam klucz Ed25519 podpisuje werdykty dla obu produktow. Pluginy embedduja tylko klucz publiczny — cracked install nie moze sfalszowac waznej odpowiedzi bez zlamania Ed25519.
  • SECURITY Per-request nonce (32 hex) wewnatrz podpisanego payloadu — odpowiedz nie moze byc replayowana ze sniffniecego ruchu. Manifest hash (SHA256 z 9 plikow modulu) wysylany przy kazdym checku — server loguje tamper signals.
  • NEW Offline grace 7 dni: jesli sisl.pl jest unreachable AND mamy poprzednio zweryfikowana waznosc → plugin dziala dalej. Po 7 dniach assume worst i wylacza capture/rollback. Revoked / expired / host mismatch nigdy nie dostaja grace.
  • INTERNAL Gate semantyka: EventSender::send robi silent skip + log warning (capture w spokoju czeka na reaktywacje), Rollbacker::rollbackProduct rzuca RollbackException nawet dla dry-run — admin UI dostaje HTTP 409 z czytelnym komunikatem.
v0.7.2
Staging rollbacku: modal z tabelą zmian zamiast natywnego confirm()
15 maja 2026 older
  • NEW Klik „Rollback to before this event” otwiera teraz wystylizowany modal z tabelą diff [Pole · Aktualnie · Po cofnięciu] — operator widzi dokładnie co zostanie zmienione zanim potwierdzi.
  • NEW Header modala pokazuje SKU produktu, target timestamp (czytelny YYYY-MM-DD HH:MM:SS UTC) oraz liczbę eventów które złożyły rekonstruowany stan.
  • NEW Audit-of-audit reminder w stopce modala: ta operacja zarejestruje nowy event ze źródłem rollback, sam rollback też można cofnąć w przyszłości.
  • NEW No-op case (live state już = target) renderowany jako bursztynowy banner zamiast pustego dialogu „czy na pewno”. Confirm button ukryty — nie ma czego potwierdzać.
  • NEW Loading states: per-row button pokazuje „Przygotowuję preview…” podczas dry-run, modal confirm pokazuje „Cofam…” podczas apply. Esc / klik w backdrop anulują.
  • INTERNAL Backend bez zmian — RollbackAction.php zwraca już pełny plan (sku, as_of, events_replayed, changes_planned). To wyłącznie warstwa prezentacji w timeline.phtml.
v0.7.1
UI: aktualna wartość obok każdej zmiany
15 maja 2026 older
  • NEW Przy każdym polu w timeline pokazujemy też aktualną wartość live obok historycznego from → to. Zielony badge now = ta zmiana wciąż obowiązuje, bursztynowy = została później nadpisana.
  • NEW Banner ostrzegawczy gdy produkt został usunięty z katalogu — kolumna „now” znika, timeline pozostaje jako jedyne źródło historii.
  • INTERNAL Controller Timeline.php ładuje produkt raz, mapuje pola, przekazuje do bloku jako current_values. Brak per-event repository call.
v0.7
Change-origin tracking: kto, skąd, dlaczego
15 maja 2026 older
  • NEW Kolumna events.source w PG: admin_ui / rest_api / rollback / cron / cli / unknown. Migracja 002 idempotentna — auto-load w docker-entrypoint-initdb.
  • NEW Kolorowe badge'e w timeline UI ze źródłem zmiany. Rollback wyróżnia się fioletem (audit-of-audit), admin niebieskim, API szarym.
  • NEW Czytelne dane użytkownika: username + email + IP + request path w metadata eventu. Koniec z gołym admin:42.
  • NEW RollbackContext singleton — Rollbacker oznacza swoje save'y żeby observer wiedział, że to nie zwykła edycja w panelu.
  • INTERNAL Heurystyka source: RollbackContext > area code crontab > URL /rest/|/soap/|/graphql > admin session > PHP_SAPI cli > unknown. Resolution order matters — rollback always happens inside an admin session.
v0.6
Self-host packaging — jedno docker compose up
13 maja 2026 older
  • NEW Dockerfile multi-stage dla .NET service (Alpine runtime, non-root). Image sisl/timemachine-service:0.5.0.
  • NEW Katalog deploy/ dla klienta: docker-compose.yml, .env.example, migrations/, INSTALL.md. cp .env.example .env && docker compose up -d i działa.
  • NEW INSTALL.md pokrywa Linux Docker, Windows Server (Docker Desktop) i natywny Windows (Windows Service + EDB PostgreSQL).
  • SECURITY Brak baked-in HMAC defaults. Customer musi wygenerować własny klucz (openssl rand -base64 32) lub compose odmówi startu.
  • SECURITY PG i .NET service domyślnie bind 127.0.0.1 — nigdy nie wystawione na LAN/WAN bez explicit override w .env.
v0.5
Admin UI: timeline + rollback z poziomu Magento
13 maja 2026 older
  • NEW Strona /admin/sisl_timemachine/product/timeline z renderowaną historią eventów per produkt + AJAX rollback flow z dry-run preview.
  • NEW Menu System → Time Machine → Lookup entity history oraz osobne ACL Sisl_TimeMachine::timemachine_admin.
  • NEW Button Time Machine obok Save / Save & Close na product edit toolbar — jednym klikiem do timeline edytowanego produktu.
  • NEW Kolorowy diff from → to per pole, status pill per event, JS confirmation flow przed apply.
v0.4
Rollback engine — apply past state przez Magento
13 maja 2026 older
  • NEW PHP Rollbacker rekonstruuje stan encji o czasie T (przez .NET replay), aplikuje przez ProductRepository->save() — odpalają się wszystkie pluginy / walidacje / observery.
  • NEW Dry-run mode zwraca plan bez commitu — admin UI używa do confirm dialog.
  • NEW Pre-history fallback: rollback przed pierwszym eventem rekonstruuje stan z from values pierwszego diffu.
  • NEW Audit-of-audit: rollback sam emituje nowy event w timeline. Łańcuch jest niezniszczalny.
v0.3
Replay engine + timeline endpoint
13 maja 2026 older
  • NEW GET /api/v1/replay/{type}/{id}?at=ISO — pure replay, applies events in order, zwraca rekonstruowany stan pól o danym czasie.
  • NEW GET /api/v1/timeline/{type}/{id} — raw event list newest-first, z paginacją.
  • SECURITY HMAC required na READ-ach (nie tylko POST). Audit log content jest sensitive — anyone z URL musi mieć shared secret.
v0.1
Initial scaffold — capture-only, single-entity
13 maja 2026 first
  • NEW Magento module skeleton (registration, module.xml, events.xml, ACL, system.xml, config UI).
  • NEW Observer catalog_product_save_after + DeltaExtractor (per-attribute diff, blacklist internal fields, skip from: null dla istniejących encji).
  • NEW .NET 8 microservice z /health + POST /api/v1/events. HMAC-SHA256 middleware (constant-time MAC + ±60s clock skew).
  • NEW PostgreSQL events table z monthly partitions, GIN index na JSONB delta, dedup table dla idempotency.
  • FIX Idempotency przeniesiona do osobnej tabeli event_ids — partitioned UNIQUE musiałoby zawierać partition key (psuje dedup). Claim przez CTE INSERT … ON CONFLICT DO NOTHING.

Co dalej w Time Machine?

Roadmap pokazuje co planujemy w v0.8 (multi-entity capture), v0.9 (snapshots + bulk rollback) i v1.0 (publiczna premiera Q3 2026). Każde major-version upgrade jest w cenie subskrypcji.