v3.3.1

danielmiessler/Fabricv3.3.1Apr 14, 2026by kichanyurd

AI Summary

This update enhances the SDK with explicit dependency modifiers and introduces event loop health monitoring. It refines the relational resolver with detailed tracking capabilities and fixes several issues regarding resolution propagation and SDK startup progress. Changes were also made to `RelationshipEntityKind` to support explicit tag dependency semantics.

Key Highlights

  • Added `AnyOf(tag)` and `AllOf(tag)` modifiers for explicit control over tag dependency semantics
  • Introduced event loop health monitoring at the `/healthz` endpoint with callback latency reporting
  • Added detailed resolution tracking to the relational resolver with `ResolutionKind` and `ResolutionDetails`
  • Fixed SDK startup appearing stuck at 100% by adding a progress bar for the metadata-writing phase
  • Fixed `Variable.get_value()` returning `None` when called from a retriever

Breaking Changes

  • Split `RelationshipEntityKind.TAG` into `TAG_ALL` and `TAG_ANY` to support explicit tag dependency semantics

New Features

  • Allow passing ToolId when attaching tools throughout the SDK
  • Added `AnyOf(tag)` and `AllOf(tag)` modifiers for explicit control over tag dependency semantics in `depend_on()`
  • Added `depend_on_any()` to `Guideline`, `Tag`, and `Journey` for OR dependency relationships
  • Add event loop health monitoring to `/healthz` endpoint
  • Add resolution tracking to the relational resolver

Full Release Notes

## [3.3.1] - 2026-04-14

### Added

- Allow passing ToolId when attaching tools throughout the SDK
- Add `AnyOf(tag)` and `AllOf(tag)` modifiers for explicit control over tag dependency semantics in `depend_on()` — `AnyOf` requires at least one tagged member to be active, `AllOf` requires all of them (bare `Tag` defaults to `AllOf`)
- Add `depend_on_any()` to `Guideline`, `Tag`, and `Journey` for OR dependency relationships — at least one target must be active. Multiple `depend_on_any()` calls create independent OR groups that are AND'd together
- Add event loop health monitoring to `/healthz` endpoint — measures callback latency and reports `healthy`, `degraded`, or `unhealthy` status with peak latency over a configurable window
- Add resolution tracking to the relational resolver — every entity that enters resolution gets a `Resolution` with a `ResolutionKind` (`NONE`, `DEPRIORITIZED`, `UNMET_DEPENDENCY_ALL`, `UNMET_DEPENDENCY_ANY`, `ENTAILED`) and structured `ResolutionDetails` (relationship ID, target IDs) explaining why

### Changed

- Split `RelationshipEntityKind.TAG` into `TAG_ALL` and `TAG_ANY` to support explicit tag dependency semantics at the core level (existing `TAG` entries treated as `TAG_ALL` for backwards compatibility)

### Fixed

- Fix priority and dependency relationships propagating through inactive intermediaries — only direct relationships now affect resolution, consistent with the reinstatement principle from argumentation theory
- Fix entailment recording only the highest-scoring source when multiple guidelines entail the same target — all entailing relationships are now recorded in resolution details
- Fix dep-failed guidelines not recovering when entailment satisfies their dependency target in a later iteration
- Fix SDK startup appearing stuck at 100% after evaluations — add "Applying evaluations" progress bar for the metadata-writing phase
- Fix `Variable.get_value()` returning `None` when called from a retriever, caused by retrievers starting before context variables were loaded
- Fix journey tool-state auto-advancing even when the tool did not run