Commit 628493b
feat(evaluation)!: add $flagd.timestamp and fix property naming per specification (#36)
## Description
The evaluator was missing `$flagd.timestamp` support and using
non-compliant property naming (`flagKey` instead of `$flagd.flagKey`).
Both properties must match the pattern
`^\\$flagd\\.((timestamp)|(flagKey))$` per `schemas/targeting.json`
lines 48-54.
**Changes:**
- Added `$flagd.timestamp` injection (unix seconds via `SystemTime`,
defaults to 0 if unavailable)
- Fixed `flagKey` → `$flagd.flagKey` to match specification
- Store as nested object `{"$flagd": {"flagKey": "...", "timestamp":
...}}` for JSON Logic dot notation
- Added 6 tests covering timestamp injection, flagKey matching, and
combined usage
- Documented context enrichment in README with time-based and
flag-specific examples
**Example:**
```json
{
"targeting": {
"if": [
{
"and": [
{"==": [{"var": "$flagd.flagKey"}, "myFlag"]},
{">": [{"var": "$flagd.timestamp"}, 1704067200]}
]
},
"enabled",
"disabled"
]
}
}
```
## Related Issue
<!-- Issue linking handled separately by system -->
## Type of Change
- [x] `feat`: New feature (minor version bump)
- [ ] `fix`: Bug fix (patch version bump)
- [ ] `docs`: Documentation only changes
- [ ] `chore`: Maintenance tasks, dependency updates
- [ ] `refactor`: Code refactoring without functional changes
- [ ] `test`: Adding or updating tests
- [ ] `ci`: CI/CD changes
- [ ] `perf`: Performance improvements
- [ ] `build`: Build system changes
- [ ] `style`: Code style/formatting changes
## PR Title Format
Title follows Conventional Commits format with breaking change indicator
(`!`).
## Testing
- [x] Unit tests added/updated
- [x] Integration tests added/updated
- [x] Manual testing performed
- [x] All tests pass (`cargo test`) - 319 tests
- [x] Code is formatted (`cargo fmt`)
- [x] Clippy checks pass (`cargo clippy -- -D warnings`)
- [x] WASM builds successfully (if applicable)
## Breaking Changes
- [x] This PR includes breaking changes
- [x] Documentation has been updated to reflect breaking changes
- [ ] Migration guide included (if needed)
**Breaking:** `flagKey` renamed to `$flagd.flagKey`. Targeting rules
using `{"var": "flagKey"}` must change to `{"var": "$flagd.flagKey"}`.
Previous implementation was non-compliant with specification.
## Additional Notes
- Used `u64` for timestamp to avoid overflow
- `targetingKey` unchanged (not part of `$flagd` namespace)
- CodeQL: 0 alerts
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
>
> ----
>
> *This section details on the original issue you should resolve*
>
> <issue_title>Support for `$flagd.timestamp` is missing based on
provider specification</issue_title>
> <issue_description>## Problem
>
> According to the provider specification
(`docs/reference/specifications/providers.md`), in-process flagd
providers should inject `$flagd.timestamp` (a unix timestamp in seconds
of the time of evaluation) into the JsonLogic evaluation context.
However, it appears that support for this property is missing in current
implementations.
>
> ### Specification reference:
> > | Property | Description |
> > | ------------------ |
------------------------------------------------------- |
> > | `$flagd.flagKey` | the identifier for the flag being evaluated |
> > | `$flagd.timestamp` | a unix timestamp (in seconds) of the time of
evaluation |
>
> ## Expected Behavior
> - `$flagd. timestamp` should be injected into the JsonLogic evaluation
context, as described in the provider specification.
>
> ## Observed Behavior
> - Providers do not currently inject `$flagd.timestamp`, which may
cause targeting rules relying on this property to fail or behave
incorrectly.
>
> ## Steps to Reproduce
> 1. Implement a custom targeting rule in JsonLogic that references
`$flagd.timestamp`.
> 2. Observe that the property is missing during flag evaluation.
>
> ## Additional context
> - Provider specification file:
[`docs/reference/specifications/providers.md`](https://github.
com/open-feature/flagd/blob/main/docs/reference/specifications/providers.md)
>
> Please add support for `$flagd.timestamp` in all relevant provider
implementations.</issue_description>
>
> ## Comments on the Issue (you are @copilot in this section)
>
> <comments>
> </comments>
>
</details>
<!-- START COPILOT CODING AGENT SUFFIX -->
- Fixes #35
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: aepfli <9987394+aepfli@users.noreply.github.com>1 parent 38299dc commit 628493b
3 files changed
Lines changed: 265 additions & 11 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
379 | 379 | | |
380 | 380 | | |
381 | 381 | | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
382 | 437 | | |
383 | 438 | | |
384 | 439 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
180 | 180 | | |
181 | 181 | | |
182 | 182 | | |
183 | | - | |
| 183 | + | |
| 184 | + | |
184 | 185 | | |
185 | 186 | | |
186 | 187 | | |
187 | | - | |
188 | | - | |
| 188 | + | |
| 189 | + | |
189 | 190 | | |
190 | 191 | | |
191 | 192 | | |
192 | 193 | | |
193 | 194 | | |
194 | 195 | | |
195 | | - | |
| 196 | + | |
196 | 197 | | |
197 | 198 | | |
198 | 199 | | |
199 | 200 | | |
200 | 201 | | |
201 | 202 | | |
202 | 203 | | |
203 | | - | |
204 | | - | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
205 | 221 | | |
206 | 222 | | |
207 | 223 | | |
| |||
644 | 660 | | |
645 | 661 | | |
646 | 662 | | |
647 | | - | |
| 663 | + | |
648 | 664 | | |
649 | 665 | | |
650 | 666 | | |
651 | 667 | | |
652 | 668 | | |
653 | | - | |
| 669 | + | |
654 | 670 | | |
655 | 671 | | |
656 | 672 | | |
| |||
690 | 706 | | |
691 | 707 | | |
692 | 708 | | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
693 | 795 | | |
694 | 796 | | |
695 | 797 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1610 | 1610 | | |
1611 | 1611 | | |
1612 | 1612 | | |
1613 | | - | |
| 1613 | + | |
1614 | 1614 | | |
1615 | 1615 | | |
1616 | 1616 | | |
| |||
1622 | 1622 | | |
1623 | 1623 | | |
1624 | 1624 | | |
1625 | | - | |
| 1625 | + | |
1626 | 1626 | | |
1627 | 1627 | | |
1628 | 1628 | | |
| |||
1646 | 1646 | | |
1647 | 1647 | | |
1648 | 1648 | | |
1649 | | - | |
| 1649 | + | |
1650 | 1650 | | |
1651 | 1651 | | |
1652 | 1652 | | |
| |||
1732 | 1732 | | |
1733 | 1733 | | |
1734 | 1734 | | |
| 1735 | + | |
| 1736 | + | |
| 1737 | + | |
| 1738 | + | |
| 1739 | + | |
| 1740 | + | |
| 1741 | + | |
| 1742 | + | |
| 1743 | + | |
| 1744 | + | |
| 1745 | + | |
| 1746 | + | |
| 1747 | + | |
| 1748 | + | |
| 1749 | + | |
| 1750 | + | |
| 1751 | + | |
| 1752 | + | |
| 1753 | + | |
| 1754 | + | |
| 1755 | + | |
| 1756 | + | |
| 1757 | + | |
| 1758 | + | |
| 1759 | + | |
| 1760 | + | |
| 1761 | + | |
| 1762 | + | |
| 1763 | + | |
| 1764 | + | |
| 1765 | + | |
| 1766 | + | |
| 1767 | + | |
| 1768 | + | |
| 1769 | + | |
| 1770 | + | |
| 1771 | + | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
| 1779 | + | |
| 1780 | + | |
| 1781 | + | |
| 1782 | + | |
| 1783 | + | |
| 1784 | + | |
| 1785 | + | |
| 1786 | + | |
| 1787 | + | |
| 1788 | + | |
| 1789 | + | |
| 1790 | + | |
| 1791 | + | |
| 1792 | + | |
| 1793 | + | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
| 1797 | + | |
| 1798 | + | |
| 1799 | + | |
| 1800 | + | |
| 1801 | + | |
| 1802 | + | |
| 1803 | + | |
| 1804 | + | |
| 1805 | + | |
| 1806 | + | |
| 1807 | + | |
| 1808 | + | |
| 1809 | + | |
| 1810 | + | |
| 1811 | + | |
| 1812 | + | |
| 1813 | + | |
| 1814 | + | |
| 1815 | + | |
| 1816 | + | |
| 1817 | + | |
| 1818 | + | |
| 1819 | + | |
| 1820 | + | |
| 1821 | + | |
| 1822 | + | |
| 1823 | + | |
| 1824 | + | |
| 1825 | + | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + | |
| 1830 | + | |
| 1831 | + | |
1735 | 1832 | | |
1736 | 1833 | | |
1737 | 1834 | | |
| |||
0 commit comments