@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-spec",
3
- "version": "3.0.0-alpha.121",
3
+ "version": "3.0.0-alpha.122",
4
4
  "description": "Specifications for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -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
  }