@reventlessdev/reventless-spec 3.0.0-alpha.121 → 3.0.0-alpha.122
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
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 3.0.0-alpha.122 (2026-08-22)
|
|
7
|
+
|
|
8
|
+
* feat(core)!: a slice that has given up says so ([f5559ab](https://github.com/ReventlessDev/reventless-core/commit/f5559abede3a9cf2c9a48aadc69a666c46cc75bf))
|
|
9
|
+
|
|
10
|
+
### BREAKING CHANGES
|
|
11
|
+
|
|
12
|
+
* `onExhausted` is required on the Translation and Automation
|
|
13
|
+
module types. ReScript has no optional module-type fields, so the alternative
|
|
14
|
+
was a PPX-injected default — and defaulting this one to silence is the bug.
|
|
15
|
+
A slice now states what abandonment means for its domain, `None` included.
|
|
16
|
+
GeocodeCustomerAddress answers with MarkAddressUnresolvable; the others say
|
|
17
|
+
nothing, on purpose.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
6
21
|
# 3.0.0-alpha.121 (2026-08-21)
|
|
7
22
|
|
|
8
23
|
### Bug Fixes
|
package/package.json
CHANGED
|
@@ -153,6 +153,22 @@ module type Automation = {
|
|
|
153
153
|
*/
|
|
154
154
|
let process: (string, Spec.todoItem) => option<(string, Spec.command)>
|
|
155
155
|
|
|
156
|
+
/**
|
|
157
|
+
The retry budget is spent: this item will never be processed again.
|
|
158
|
+
|
|
159
|
+
Return `Some((targetId, command))` to tell the domain, or `None` to say nothing.
|
|
160
|
+
|
|
161
|
+
Abandonment is an outcome, not the absence of one, and the framework cannot
|
|
162
|
+
publish it on a slice's behalf: the command would have to name a target, and
|
|
163
|
+
which target is exactly what this module knows and the framework does not. So
|
|
164
|
+
the choice is declared here even when the answer is `None` — a slice that stays
|
|
165
|
+
silent says so on purpose.
|
|
166
|
+
|
|
167
|
+
The row is marked `Abandoned` either way; this decides only whether anything
|
|
168
|
+
downstream hears about it.
|
|
169
|
+
*/
|
|
170
|
+
let onExhausted: (string, Spec.todoItem) => option<(string, Spec.command)>
|
|
171
|
+
|
|
156
172
|
/** File URL of this Automation module (`import.meta.url`). */
|
|
157
173
|
let moduleUrl: string
|
|
158
174
|
|
|
@@ -147,6 +147,25 @@ module type Translation = {
|
|
|
147
147
|
result<option<(string, Spec.inboundCommand)>, string>,
|
|
148
148
|
>
|
|
149
149
|
|
|
150
|
+
/**
|
|
151
|
+
The retry budget is spent: this item will never be attempted again.
|
|
152
|
+
|
|
153
|
+
Return `Some((targetId, cmd))` to tell the domain, or `None` to say nothing.
|
|
154
|
+
`~lastError` is the failure that ended it.
|
|
155
|
+
|
|
156
|
+
Abandonment is an outcome, not the absence of one, and the framework cannot
|
|
157
|
+
publish it on a slice's behalf: the event would need a home in some aggregate's
|
|
158
|
+
log, and which aggregate is exactly what this module knows and the framework
|
|
159
|
+
does not. So the choice is declared here even when the answer is `None` —
|
|
160
|
+
a slice that stays silent says so on purpose.
|
|
161
|
+
|
|
162
|
+
The row is marked `Abandoned` either way; this decides only whether anything
|
|
163
|
+
downstream hears about it.
|
|
164
|
+
*/
|
|
165
|
+
let onExhausted: (string, Spec.outboundItem, ~lastError: option<string>) => option<
|
|
166
|
+
(string, Spec.inboundCommand),
|
|
167
|
+
>
|
|
168
|
+
|
|
150
169
|
/** File URL of this Translation module (`import.meta.url`). */
|
|
151
170
|
let moduleUrl: string
|
|
152
171
|
}
|