@revturbine/sdk 0.10.5 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/dist/headless.js +1 -1
- package/dist/headless.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -47,6 +47,103 @@ also require a changelog entry.
|
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
50
|
+
## 0.10.7
|
|
51
|
+
|
|
52
|
+
### The Python and Rust ports stop filtering payloads on `status` (BL-0151)
|
|
53
|
+
|
|
54
|
+
**What changed.** Payload `status` is no longer a runtime predicate in any port.
|
|
55
|
+
Python and Rust required `status == "active"` on a placement payload before it
|
|
56
|
+
could become a candidate, and read a `status` off each content-linked studio
|
|
57
|
+
payload before overlaying its copy. Both now ignore it, matching the TypeScript
|
|
58
|
+
port, which never gated on it.
|
|
59
|
+
|
|
60
|
+
| | Before | After |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| Placement payload candidacy (Python, Rust) | required `status == "active"` | every payload, status ignored |
|
|
63
|
+
| Content-linked copy overlay (Python, Rust) | required the studio payload's `status` to read `active` | always overlaid |
|
|
64
|
+
| TypeScript | already ignored `status` | unchanged |
|
|
65
|
+
|
|
66
|
+
**Why it mattered.** `status` is not a field of the exported Playbook.
|
|
67
|
+
`RevTurbineConfigStudioPayload` and `RevTurbineConfigPlacementPayloadItem` carry
|
|
68
|
+
no `status` key, unknown keys are stripped on parse, and the published JSON
|
|
69
|
+
Schema is `additionalProperties: false` — because runtime status is *derived*
|
|
70
|
+
control-plane side and the stored column was dropped. So `status == "active"` was
|
|
71
|
+
false for **every** payload of a real Playbook: the Python and Rust resolvers
|
|
72
|
+
indexed no candidates at all and returned `placement_not_found`, and their
|
|
73
|
+
content-lookup adapters dropped every content-linked payload, keeping the inline
|
|
74
|
+
copy where TypeScript overlaid the linked block. A config whose first payload
|
|
75
|
+
carried a stray authored `status` also decided differently across ports.
|
|
76
|
+
|
|
77
|
+
The cross-language parity gate could not see any of this: the only fixtures
|
|
78
|
+
reaching these paths hand-write `status` on each payload — a key the schema would
|
|
79
|
+
strip — so the ports were compared on a shape no Playbook has.
|
|
80
|
+
|
|
81
|
+
**Landed in.** 0.10.7 (`server-python`, `server-rust`). No `@revt-eng/core`
|
|
82
|
+
change rides with it: TypeScript was already correct, so there is no scaffold
|
|
83
|
+
release and no pin bump.
|
|
84
|
+
|
|
85
|
+
**Fail-closed in.** n/a — this release removes a fail-*closed* filter. Python and
|
|
86
|
+
Rust consumers on a real Playbook go from no decision to the decision
|
|
87
|
+
TypeScript has always returned.
|
|
88
|
+
|
|
89
|
+
**Proving test.** `tests/parity/fixtures/payload_status_filter.json` — two lanes:
|
|
90
|
+
a stray authored `status` that disagrees with drag order (payload 1 `draft`,
|
|
91
|
+
payload 2 `active`; payload 1 must still win), and the real wire shape with no
|
|
92
|
+
`status` anywhere plus a content-linked overlay. Mutation-checked by reinstating
|
|
93
|
+
the Python filter, which diverges on the first call. Plus
|
|
94
|
+
`server-python/tests/placements/test_local_resolver.py`,
|
|
95
|
+
`test_json_content_provider.py` and `server-rust/tests/static_resolver.rs`, each
|
|
96
|
+
covering both the stray-value and the no-key case.
|
|
97
|
+
|
|
98
|
+
**Who is affected.** Every `revturbine` (PyPI) and `revturbine` (crates.io)
|
|
99
|
+
consumer resolving placements from a schema-valid exported Playbook — that is,
|
|
100
|
+
one produced by the control plane rather than hand-written with a `status` field.
|
|
101
|
+
Those integrations were receiving no placement decisions at all.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 0.10.6
|
|
106
|
+
|
|
107
|
+
### The trial-status PlanProvider overlay ships in the Rust crate (BL-0153)
|
|
108
|
+
|
|
109
|
+
**What changed.** `revturbine::overlay_trial_status_on_plan_provider` is a new
|
|
110
|
+
public function on the Rust crate: it maps a runtime `UserTrialStatus` onto the
|
|
111
|
+
`trial_*` fields of a resolved PlanProviderState, the fields the placement
|
|
112
|
+
resolver's `trial_progress` / `trial_ending` / `trial_ended` /
|
|
113
|
+
`trial_converted` gates and milestone supersession read. Python has always done
|
|
114
|
+
this inside its shipped package
|
|
115
|
+
(`revturbine.sdk._overlay_trial_status_on_plan_provider`); on Rust the mapping
|
|
116
|
+
existed only as a private helper the facade used, so a host that assembles its
|
|
117
|
+
own provider context — including this repo's own parity runner — had to
|
|
118
|
+
re-implement it. Additive: no existing signature changed.
|
|
119
|
+
|
|
120
|
+
Porting Python's mapping faithfully corrected two Rust-only divergences in the
|
|
121
|
+
overlay the facade applies:
|
|
122
|
+
|
|
123
|
+
| `UserTrialStatus` field | Rust before | Rust now (= TS/Python) |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `day_number` + `days_remaining` | not derived | `trial_days_total = day_number + days_remaining`, only when both are present |
|
|
126
|
+
| `day_number` | written to `trial_day_number` | not written — no provider-state field reads it |
|
|
127
|
+
| `usage_entitlement_handle` | dropped | `trial_usage_entitlement_handle` |
|
|
128
|
+
|
|
129
|
+
`trial_days_total` is the input to the time-mode progress fallback in
|
|
130
|
+
`placements::trial_gating`, so before this the fallback could never fire on the
|
|
131
|
+
Rust port.
|
|
132
|
+
|
|
133
|
+
**Landed in.** `0.10.6`.
|
|
134
|
+
|
|
135
|
+
**Fail-closed in.** `0.10.6` — the parity facade-presence gate
|
|
136
|
+
(`tests/parity/facade-surface.json`) no longer allow-lists a runner-local
|
|
137
|
+
overlay, so a future re-implementation harness-side fails the gate.
|
|
138
|
+
|
|
139
|
+
**Proving test.** `server-rust/src/sdk.rs` `overlay_maps_every_canonical_trial_field`,
|
|
140
|
+
`trial_days_total_requires_both_halves`, `overlay_does_not_clobber_base_state_with_null`
|
|
141
|
+
(mirroring `server-python/tests/test_trial_overlay_upsert.py`), plus the
|
|
142
|
+
`trial_ending_days_before_end`, `trial_ended_post_expiry` and
|
|
143
|
+
`trial_progress_milestone_supersession` parity fixtures.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
50
147
|
## 0.10.5
|
|
51
148
|
|
|
52
149
|
### Trial-only local integrations get provider context (BL-0120)
|