Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,29 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## v26.06.93 (2026-06-10)

### Added (rule engine completeness — parity initiative SP-13)

Brought the rule engine (the weakest subsystem, ~18% parity) to functional parity:

- **Rich operators**: added `between`, `contains`, `not_contains`, `starts_with`, `ends_with`, `exists`,
`is_null`, `is_empty` (all None-safe) on top of the existing comparison/logical set.
- **Fluent builder DSL** (`pyfly.rule_engine.builder`): `field(...).<op>()`, `all_of/any_of/not_`,
`set_action/increment_action/log_action`, and `rule(id)...build()` / `ruleset(...)...build()`.
- **Loading + validation**: `RuleSetLoader.from_json` (alongside YAML/dict) and a `RuleSetValidator` /
`validate_ruleset` / `RuleValidationError` that catches duplicate ids, unknown operators, missing action
targets, malformed `between`, empty `and`/`or`, and bad `not` arity.
- **Hexagonal port + service**: `RuleEnginePort` + `ActionHandler` SPI (`ports/outbound.py`) and a
`RuleEngineService` facade (`evaluate`, async `evaluate_by_name` over the repository, save/get/list) with
`pyfly_rule_*_total` metrics (evaluations/matched/actions-fired/errors) when a `MetricsRecorder` is present.
- **Pluggable action handlers**: `RuleEvaluator(action_handlers={...})` makes `call`/`calculate`/custom action
types pluggable without subclassing (built-in `set`/`increment`/`log` preserved, additive).
- **Evaluation modes**: `EvaluationMode.ALL` (default) and `FIRST_MATCH` on `RuleSetEvaluator`, wired via
`pyfly.rule-engine.mode`.
- End-to-end integration test + full `docs/modules/rule-engine.md` rewrite (operator reference, modes,
builder, validation, service, handlers, metrics). Stateful forward-chaining remains out of scope by design.

## v26.06.92 (2026-06-10)

### Added / Fixed (config server backends — parity initiative SP-12)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<a href="https://github.com/fireflyframework"><img src="https://img.shields.io/badge/Firefly_Framework-official-ff6600?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyeiIvPjwvc3ZnPg==" alt="Firefly Framework"></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.12%2B-blue?logo=python&logoColor=white" alt="Python 3.12+"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="License: Apache 2.0"></a>
<a href="#"><img src="https://img.shields.io/badge/version-26.06.92-brightgreen" alt="Version: 26.06.92"></a>
<a href="#"><img src="https://img.shields.io/badge/version-26.06.93-brightgreen" alt="Version: 26.06.93"></a>
<a href="#"><img src="https://img.shields.io/badge/type--checked-mypy%20strict-blue?logo=python&logoColor=white" alt="Type Checked: mypy strict"></a>
<a href="#"><img src="https://img.shields.io/badge/code%20style-ruff-purple?logo=ruff&logoColor=white" alt="Code Style: Ruff"></a>
<a href="#"><img src="https://img.shields.io/badge/async-first-brightgreen" alt="Async First"></a>
Expand Down
Loading
Loading