IceIce
Home
  • Getting Started

    • Quick Start
    • Core Concepts
    • Architecture
  • SDK Guide

    • Java SDK
    • Go SDK
    • Python SDK
  • Reference

    • Node Types
    • Roam API
    • Mock
    • Server Config
    • Client Config
Download
Playground
FAQ
  • Changelog
  • Upgrade Guide
Sponsor
Community
GitHub
  • English
  • 简体中文
Home
  • Getting Started

    • Quick Start
    • Core Concepts
    • Architecture
  • SDK Guide

    • Java SDK
    • Go SDK
    • Python SDK
  • Reference

    • Node Types
    • Roam API
    • Mock
    • Server Config
    • Client Config
Download
Playground
FAQ
  • Changelog
  • Upgrade Guide
Sponsor
Community
GitHub
  • English
  • 简体中文

Ice Rule Engine Changelog

Recording feature updates, performance optimizations and bug fixes for each version of Ice rule engine

4.0.11 (2026-03)

Dark Mode Fix & Change List Improvement

  • Web UI: Fix comparison views dark mode compatibility, use antd theme tokens instead of hardcoded colors
  • Web UI: Show node type name (e.g. AND) for relation nodes in change list

Version Info

ComponentVersion
ice-server4.0.11

4.0.10 (2026-03)

Change Comparison Feature

  • Server: Added change comparison API (/conf/changes) to retrieve single-node or all pending node changes (active vs update)
  • Server: Detail API (/conf/detail) now supports activeOnly parameter to fetch the pure released tree for dual-tree comparison
  • Web UI: Added compare button to node toolbar — click to view single-node property comparison (property table + JSON diff dual tabs)
  • Web UI: Apply/Clean confirm dialog now displays the list of changed nodes, each with a "View" button to see comparison details
  • Web UI: Added full-screen dual-tree comparison view (released tree vs current editing tree), changed nodes highlighted, click to view diff details
  • Web UI: Fixed NONE relation node (type=0) unable to be added as child/forward node
  • Web UI: Fixed newly added leaf nodes showing JSON editing mode instead of form mode when re-editing
  • Web UI: Comparison view filters default values (inverse=false, timeType=1, etc.) to avoid meaningless diffs

Version Info

ComponentVersion
ice-server4.0.10

4.0.9 (2026-03)

Roam Meta Extraction

  • SDK: Extracted Meta from Roam data map into a separate struct
  • SDK: Fixed incorrect log caller depth in Go and Python SDKs

Version Info

ComponentVersion
ice-server4.0.9

4.0.8 (2026-03)

Controlled Mode & Publish to Remote

  • Server: Added controlled mode (--mode controlled or ICE_MODE=controlled), prevents creating new Rules and nodes via UI, only allows import and referencing existing nodes — ideal for production environments to prevent accidental changes
  • Server: Added publish to remote feature (--publish-targets or ICE_PUBLISH_TARGETS), export modal can push data directly to configured remote Servers via server-side proxy to avoid CORS
  • Web UI: Renamed "Publish" button to "Apply" to free up the "publish" concept for remote publishing
  • Web UI: Controlled mode displays a "Controlled Mode" badge, hides creation buttons, node form shows reference input only
  • Web UI: Frontend request timeout changed from 10s to 120s

Version Info

ComponentVersion
ice-server4.0.8

4.0.7 (2026-03)

Bug Fix

  • Server: Fixed import not updating _base_id.txt / _conf_id.txt, which could cause ID conflicts when creating new nodes after import

4.0.6 (2026-03)

Logging System Overhaul

  • Go SDK: Replaced custom Logger interface with standard *slog.Logger — users integrate via ice.SetLogger(slog.New(myHandler))
  • Python SDK: Replaced custom Logger ABC with standard logging.getLogger("ice") — users configure via standard logging API
  • Java SDK: Removed redundant trace prefix from log messages, MDC-only approach
  • Server: Replaced all log.Printf with log/slog structured logging, JSON output by default
  • All components: TraceId is now a structured field instead of message prefix; unified log message style

4.0.5 (2026-03)

Roam API Simplification

  • Removed IceMeta class, metadata stored directly under _ice key as plain Map/dict
  • Removed Ice prefix from all Roam meta accessor methods:
    • getIceId() → getId() / GetId() / get_id()
    • getIceScene() → getScene() / GetScene() / get_scene()
    • getIceProcess() → getProcess() / GetProcess() / get_process()
    • Other methods follow the same pattern
  • Go SDK NewRoam() simplified to parameterless constructor
  • All three SDKs (Java/Go/Python) updated simultaneously

Version Info

ComponentVersion
ice-server4.0.5
ice-core (Java)4.0.5
ice SDK (Go)v1.2.3
ice-rules (Python)4.0.5

4.0.4 (2026-03)

Web UI Export Feature Completion

  • Added "Export" button in multi-select mode for batch exporting selected Rules
  • Added "Export" option in folder context menu to export all Rules under a folder
  • Exported JSON arrays can be directly batch-imported via the import feature

Version Info

ComponentVersion
ice-server4.0.4

4.0.3 (2026-03)

Web UI Fixes & Improvements

  • Fix NONE type child node create button being disabled (JS falsy 0 bug)
  • Fix Mock result selector fallback not persisting
  • Mock result ts/trace tags now support one-click copy
  • Breadcrumb nav Popover properly destroyed on hide

Version Info

ComponentVersion
ice-server4.0.3

4.0.1 (2026-03)

Go SDK RoamValue Type Conversion Enhancement

  • RoamValue type conversion now uses spf13/cast for broader type support (json.Number, uint variants, etc.)
  • Added error-returning variants: StringE(), IntE(), Int64E(), Float64E(), BoolE()

Version Info

ComponentVersion
Go SDKv1.2.1
ice-server4.0.1

4.0.0 (2026-03) 🚀

Ice Rule Engine 4.0.0 — Pack/Context Removal, API Unification, Mock Execution

4.0.0 is a major API simplification for Ice. The Pack and Context layers have been completely removed — all data flows through a single Roam; leaf node base classes are reduced from 9 to 3; multi-level key and reference syntax methods are all renamed; and Mock execution is added for remote rule debugging from the Web UI.

New Features

Pack/Context Fully Removed, Roam Unified Data Layer

Removed IcePack (Java) / Pack (Go) / Pack (Python) and the IceContext layer. All leaf node methods now receive only Roam as the data container. The previous two-tier Pack+Roam structure has been simplified to a single Roam.

// Old code (3.x)
public class ScoreFlow extends BaseLeafRoamFlow {
    @Override
    protected boolean doRoamFlow(IceRoam roam) {
        return roam.get("score") >= threshold;
    }
}

// New code (4.0.0)
public class ScoreFlow extends BaseLeafFlow {
    @Override
    protected boolean doFlow(IceRoam roam) {
        return roam.get("score") >= threshold;
    }
}

Leaf Node Base Class Simplification (9 → 3)

Removed Roam/Pack level base class variants, unified to a single base class per leaf node type with simplified method signatures:

Base class rename:

LanguageOld NameNew Name
JavaBaseLeafRoamFlow / BaseLeafPackFlowBaseLeafFlow
JavaBaseLeafRoamResult / BaseLeafPackResultBaseLeafResult
JavaBaseLeafRoamNone / BaseLeafPackNoneBaseLeafNone

Method rename:

LanguageOld MethodNew Method
JavadoRoamFlow / doPackFlowdoFlow
JavadoRoamResult / doPackResultdoResult
JavadoRoamNone / doPackNonedoNone
GoDoRoamFlow / DoPackFlowDoFlow
GoDoRoamResult / DoPackResultDoResult
GoDoRoamNone / DoPackNoneDoNone
Pythondo_roam_flow / do_pack_flowdo_flow
Pythondo_roam_result / do_pack_resultdo_result
Pythondo_roam_none / do_pack_nonedo_none

Roam API Rename

Multi-level key and reference syntax methods renamed for clearer semantics:

LanguageOld NameNew NameDescription
JavagetMulti / putMultigetDeep / putDeepMulti-level key read/write
JavagetUnionresolveReference syntax resolution
GoGetMulti / PutMultiGetDeep / PutDeepMulti-level key read/write
GoGetUnionResolveReference syntax resolution
GoValueMultiValueDeepMulti-level key fluent API
Pythonget_multi / put_multiget_deep / put_deepMulti-level key read/write
Pythonget_unionresolveReference syntax resolution

Mock Execution

New mock execution feature — send mock requests from the Server Web UI, have a designated Client execute the rules locally, and return the full result.

  • File System Communication: Consistent with existing config sync, communicates via shared storage directory, no additional network connections needed
  • All SDKs Supported: Java, Go, Python Client SDKs all have built-in mock polling, no extra configuration needed
  • Web UI: New Mock button on detail page, supporting form/JSON input modes for Roam parameters
  • Execution Result Visualization: Returns process execution flow and roam result data, executed nodes highlighted in yellow on tree graph
  • Target Selection: Supports specifying client address (address:xxx), swimlane (lane:xxx), or automatic selection (all)

Roam Key Static Scanning

Multi-language static analysis tools that automatically extract roam key access metadata from leaf node methods, powering the Mock form auto-generation:

  • Java: ASM bytecode analysis, automatically available after compilation
  • Go: go/ast analysis, via ice-scan CLI tool for code generation
  • Python: ast module analysis, scans automatically at runtime

IceMeta Execution Metadata

Execution metadata stored under the reserved _ice key in Roam (_ice must not be used for business data):

FieldDescription
idRule ID
sceneScene identifier
nidConfiguration ID
tsTimestamp
traceTrace identifier
typeRequest type
debugDebug flag
processExecution process log

Client File Format Split

Single client JSON file split into two independent files, reducing high-frequency heartbeat I/O contention with metadata:

FileContentWrite Frequency
m_{addr}.jsonMetadata (registered classes, roam key scan results)On startup + on change
b_{addr}.jsonHeartbeat (timestamp)Every 10 seconds

getDeep/putDeep List Index Traversal

e.g. getDeep("items.0.name"), supports accessing list elements via numeric index (read-only traversal; putDeep does not create lists).

Optimization

  • Default poll interval changed: From 5s to 2s, faster config change response
  • Default heartbeat interval changed: From 30s to 10s, more responsive client status detection
  • Default client timeout changed: From 60s to 30s, faster offline detection
  • Import API enhanced: Supports JSON array batch import for multiple rules

Breaking Changes

  1. Pack/Context removed: IcePack, IceContext and their Go/Python counterparts are removed. If your code uses Pack (e.g. BaseLeafPackFlow, doPackFlow), migrate all Pack-related code to use Roam
  2. Leaf node base class simplification: BaseLeafPack* and BaseLeafRoam* hierarchy fully removed, unified to BaseLeafFlow / BaseLeafResult / BaseLeafNone, method names simplified (e.g. doRoamFlow → doFlow)
  3. Roam API renamed: getMulti→getDeep, putMulti→putDeep, getUnion→resolve, requires global replacement
  4. priority field removed: Nodes no longer support priority ordering, remove if used
  5. _ice is a reserved Roam key: Must not be used for business data storage

Version Info

ComponentVersion
Java SDK4.0.0
Go SDKv1.2.0
Python SDK4.0.0
ice-server4.0.0

3.0.2 (2026-03)

Ice Rule Engine 3.0.2 - Client Address Optimization & Starter Removal

🔧 Optimization

  • Client Address Simplified: Address format shortened from IP/app/xxxxxxxxxxx to IP_xxxxx
  • IP Detection Unified: Java/Python/Go SDK unified to use network interface iteration for non-loopback IPv4

📦 Starter Removed

  • Removed ice-spring-boot-starter-2x and ice-spring-boot-starter-3x: Use ice-core directly for all Java projects
  • Spring Integration: For Spring/SpringBoot projects, use IceBeanUtils.setFactory() to enable bean injection

3.0.1 (2026-03)

Ice Rule Engine 3.0.1 - Server Optimization

🔧 Optimization

  • Server Code Restructured: Reorganized server code into sub-packages for better maintainability
  • Folder Operations: Added folder operation support
  • Dirty Checking: Added dirty checking mechanism with unsaved changes prompt
  • UI Optimization: Multiple interface interaction and display improvements

3.0.0 (2026-03) 🚀

Ice Rule Engine 3.0.0 - Server Rewritten in Go

🎯 Core Changes

Server completely rewritten from Java (Spring Boot) to Go. Single binary deployment, no JDK required.

🔧 Server Rewrite

  • ✅ Go Rewrite: Server rewritten in Go for better performance and simpler deployment
  • ✅ Single Binary: Frontend embedded via Go embed, no additional web server needed
  • ✅ Multi-platform Binaries: Pre-built binaries for Linux/macOS/Windows (amd64/arm64)
  • ✅ Docker Image Unchanged: waitmoon/ice-server:3.0.0, fully compatible

📦 SDK Version Bump

  • Java SDK: 3.0.0 (no functional changes, version bump only)
  • Go SDK: v1.1.0
  • Python SDK: 3.0.0

⚠️ Upgrade Notes

  • No SDK Code Changes: Version bump only, drop-in replacement
  • Server Deployment Change: Manual deployment now uses Go binary instead of jar, with multi-platform downloads
  • Docker Users: No changes needed, same image name and usage
  • Full Data Compatibility: File storage format unchanged, no data migration needed

📋 Version Info

ComponentVersion
Java SDK3.0.0
Go SDKv1.1.0
Python SDK3.0.0
ice-server3.0.0

2.1.3 (2026-03)

Ice Rule Engine 2.1.3 - Forward Node Display Enhancement

🎨 Enhancement

  • Forward node visual improvement: Forward nodes now use purple (#722ed1) with ◀ arrow prefix, clearly distinguished from editing nodes (orange dashed border)
  • Color scheme optimization: Unified node status colors — forward nodes purple, editing nodes orange dashed, unregistered nodes gray

2.1.2 (2026-03)

Ice Rule Engine 2.1.2 - node-meta API optimization

🔧 Optimization

  • Reduce redundant data: Remove classes field from ClientInfo, no longer returns full registered class names for each client when switching lanes/addresses

2.1.0 (2026-03)

Ice Rule Engine 2.1.0 - Editor UX and Node Metadata Enhancements

✨ New Features

  • Node metadata: new node-meta API for trunk/lane/client discovery and leaf class metadata
  • Editing experience: more accurate change detection (A→B→A treated as no-op) and clearer unregistered-node styling
  • Batch utilities: batch export and base creation improvements

🐞 Fixes

  • Fix lane _latest.json accidental deletion

2.0.6 (2026-03) 🏊

Ice Rule Engine 2.0.6 - Swimlane Support

✨ New Features

🏊 Swimlane Isolation

Clients can now register under a swimlane. Different swimlanes have isolated node info, preventing node metadata conflicts across development branches.

Client configuration:

ice:
  app: 1
  storage:
    path: ./ice-data
  lane: feature-xxx  # Swimlane name, omit for main trunk

Directory structure:

clients/{app}/              ← Main trunk clients (unchanged)
clients/{app}/lane/{name}/  ← Swimlane clients (new)

Server UI: A swimlane selector in the detail page toolbar lets you view leaf nodes from the main trunk or a specific swimlane (merged, swimlane overrides main trunk).

All SDKs: Java, Go, and Python SDKs all support the swimlane parameter.

🔧 Improvements

  • 🔍 Node search fix - Fixed leaf node search not working in the dropdown
  • 🧹 Auto-cleanup - Empty swimlane directories are automatically removed when all clients expire

📋 Version Info

ComponentVersion
Java SDK2.0.6
Go SDKv1.0.6
Python SDK2.0.6
ice-server2.0.6

2.0.1 (2025-12) ✨

Ice Rule Engine 2.0.1 - Multi-language SDK Official Release

🌐 Multi-language SDK

This version officially releases Go and Python SDKs with full feature parity to Java SDK:

# Go
go get github.com/zjn-zjn/ice/sdks/go

# Python
pip install ice-rules

✨ New Features

📝 Field Description Enhancement

All three languages support field descriptions for friendly UI display:

LanguageMethodExample
Java@IceField annotation@IceField(name="Score", desc="Threshold") double score;
Goice struct tagScore float64 \ice:"name:Score,desc:Threshold"``
PythonAnnotated + IceFieldscore: Annotated[float, IceField(name="Score")]

🏷️ Leaf Node Alias

Support multi-language compatible configuration with class name mapping:

// Java
@IceNode(alias = {"score_flow"})
public class ScoreFlow extends BaseLeafFlow { }
// Go
ice.RegisterLeaf("com.example.ScoreFlow",
    &ice.LeafMeta{Alias: []string{"score_flow"}},
    func() any { return &ScoreFlow{} })
# Python
@ice.leaf("com.example.ScoreFlow", alias=["score_flow"])
class ScoreFlow: ...

🚫 Field Ignore

Fields that should not be configurable can be ignored:

LanguageMethod
Java@IceIgnore
Gojson:"-" or ice:"-"
Python_ prefix or Annotated[..., IceIgnore()]

🔧 Optimizations

  • 📦 Monorepo Project Structure: Unified management of Java/Go/Python SDKs
  • ⚡ Hot-reload Optimization: More stable incremental updates
  • 🐛 Bug Fixes: Fixed multiple edge cases

📋 Version Info

ComponentVersion
Java SDK2.0.1
Go SDKv1.0.3
Python SDK2.0.1
ice-server2.0.1

2.0.0 (2025-12) 🚀

Ice Rule Engine 2.0 Major Architecture Upgrade - Zero Dependencies, Containerized, Lighter

🎯 Core Changes

Version 2.0.0 brings a revolutionary architecture overhaul to Ice, removing dependencies on MySQL database and NIO communication in favor of a fully file-system-based storage solution with native Docker containerization support.

💾 Storage Architecture Revolution

  • ✨ File System Storage: Removed MySQL dependency, using local file system to store all configuration data
  • 📁 JSON File Format: All configurations stored as JSON files for easy version control and manual review
  • 🔄 Incremental Version Updates: Support for incremental configuration updates, clients poll version files for latest configurations
  • 🗂️ Clear Directory Structure:
    • apps/ - Application configurations
    • {app}/bases/ - Base rule configurations
    • {app}/confs/ - Conf node configurations
    • {app}/versions/ - Version incremental update files
    • clients/ - Client registration information

🔗 Communication Architecture Simplification

  • 🚫 Removed NIO Communication: No longer requires Server-Client NIO long connections
  • 🚫 Removed ZooKeeper HA: No longer depends on ZooKeeper for high availability
  • 📡 File Polling Sync: Clients poll file system for configuration updates
  • 💓 Heartbeat Mechanism: Clients periodically write heartbeat files, Server can detect client status

🐳 Native Docker Support

  • 📦 Official Docker Image: waitmoon/ice-server:2.0.0
  • 🏗️ Multi-Architecture Support: Supports linux/amd64 and linux/arm64
  • 📝 Docker Compose: Provides ready-to-use docker-compose.yml
  • 🔧 Environment Variable Configuration: Supports flexible configuration via environment variables
  • ♻️ CI/CD Integration: GitHub Actions auto-build and publish images

📋 Detailed Changes

Configuration Changes

  • Removed spring.datasource database configuration
  • Removed ice.port NIO port configuration
  • Removed ice.ha high availability configuration
  • Added ice.storage.path file storage path configuration
  • Added ice.client-timeout client timeout configuration
  • Added ice.version-retention version file retention count configuration
  • Client added ice.poll-interval polling interval configuration
  • Client added ice.heartbeat-interval heartbeat interval configuration

⚠️ Upgrade Notes

  1. Data Migration: Upgrading from 1.x requires manually exporting MySQL configuration data to JSON files
  2. Configuration Update: Need to update application.yml, remove database config, add file storage config
  3. Dependency Changes: Can remove MySQL driver and MyBatis related dependencies
  4. Deployment Method: Docker deployment recommended for simplified operations

🚀 Quick Start

Docker One-Click Deployment:

docker run -d --name ice-server \
  -p 8121:8121 \
  -v ./ice-data:/app/ice-data \
  waitmoon/ice-server:2.0.0

Using Docker Compose:

docker-compose up -d

1.5.0 (2025-02-20) 🎉

Major Ice rule engine version update

Features

  • ✨ Brand new visual tree structure for more intuitive rule orchestration
  • 🚀 Support for SpringBoot 3.x and JDK 17+
  • 📦 Starter split into 2x/3x versions for different SpringBoot versions

1.3.1 (2023-06-02)

Features

  • Add node recycling functionality
  • #17 Compatible with spring-boot-devtools

1.3.0 (2023-06-02)

Features

  • Various improvements and fixes

1.2.0 (2023-04-10)

Features

  • New configuration interface: New configuration page supporting configuration descriptions, drag-and-drop node orchestration, etc. (close #16)

1.1.0 (2022-07-30)

Features

  • ice-server high availability: Default support for using ZooKeeper for ice-server high availability (close #13)

1.0.4 (2022-07-30)

Features

  • Client offline optimization: Optimize client offline processing logic (close #12)

1.0.3 (2022-07-26)

Features

  • none node support: Add none-type nodes (close #11)
  • forward nodes: Support forward nodes (close #9)

1.0.2 (2022-02-13)

Features

  • Node inversion: Nodes support inversion (close #6)

1.0.1 (2022-01-29)

Features

  • ice-server: NIO communication between ice-server and ice-client for better performance (close #3)
Edit this page on GitHub
Last Updated: 3/29/26, 12:49 PM
Contributors: waitmoon, Claude, Claude Opus 4.6