@planu/cli 5.3.2 → 5.3.3

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/config/runtime-policy.json +9 -0
  3. package/dist/engine/autopilot/complete-loop.js +4 -1
  4. package/dist/engine/execution/outbox-worker.d.ts +8 -0
  5. package/dist/engine/execution/outbox-worker.js +102 -31
  6. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  7. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  8. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  9. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  10. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  11. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  12. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  13. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  14. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  15. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  16. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  17. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  18. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  19. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  20. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  21. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  22. package/dist/engine/runtime-policy.js +14 -0
  23. package/dist/index.js +3 -1
  24. package/dist/storage/runtime-db.d.ts +23 -1
  25. package/dist/storage/runtime-db.js +79 -9
  26. package/dist/tools/create-spec/post-creation.js +7 -2
  27. package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +2 -0
  28. package/dist/tools/create-spec/spec-created-outbox-consumer.js +94 -6
  29. package/dist/tools/create-spec-helpers.d.ts +2 -2
  30. package/dist/tools/create-spec-helpers.js +2 -2
  31. package/dist/tools/git/branch-ops.d.ts +7 -3
  32. package/dist/tools/git/branch-ops.js +68 -18
  33. package/dist/tools/update-status-actions.js +4 -2
  34. package/dist/types/git.d.ts +4 -0
  35. package/dist/types/outbox-worker.d.ts +2 -0
  36. package/dist/types/runtime-policy.d.ts +9 -0
  37. package/package.json +9 -9
  38. package/planu-native.json +1 -1
  39. package/planu-plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [5.3.3] - 2026-08-06
2
+
3
+ ### Bug Fixes
4
+ - fix(release): tolerate empty ff-behind mirror list under set -u
5
+ - fix(outbox): return a typed failure from delivery attempts for the reliability gate
6
+ - fix(git): close SPEC-1396 debate findings and record review evidence
7
+ - fix(git): never move the shared checkout from automatic paths (SPEC-1396)
8
+ - fix(outbox): address SPEC-1271 debate review findings
9
+ - fix(outbox): bounded fair durable spec.created recovery without blocking startup (SPEC-1271)
10
+
11
+ ### Chores
12
+ - chore(planu): file SPEC-1396 git-safety dogfood bug
13
+ - chore(planu): session checkpoint after SPEC-1271 cycle
14
+ - chore(planu): SPEC-1271 done with debate evidence, file SPEC-1395
15
+ - chore(planu): SPEC-1271 implementing with structured work plan, file SPEC-1394
16
+
17
+
1
18
  ## [5.3.2] - 2026-08-06
2
19
 
3
20
  ### Bug Fixes
@@ -51,5 +51,14 @@
51
51
  "leaseMultiplier": 3,
52
52
  "maximumRememberedTransitions": 1000,
53
53
  "minimumHeartbeatMs": 1000
54
+ },
55
+ "outbox": {
56
+ "sliceRecordBudget": 25,
57
+ "sliceTimeBudgetMs": 5000,
58
+ "backoffBaseMs": 30000,
59
+ "backoffCapMs": 1800000,
60
+ "maxAttempts": 3,
61
+ "diagnosticMaxLength": 500,
62
+ "continuationDelayMs": 250
54
63
  }
55
64
  }
@@ -47,7 +47,10 @@ async function runWithProgress(projectPath, projectId, specId, action, fn) {
47
47
  */
48
48
  async function doAutoCreateBranch(projectId, specId) {
49
49
  const { handleCreateBranch } = await import('../../tools/git/branch-ops.js');
50
- const result = await handleCreateBranch(projectId, specId);
50
+ // SPEC-1396: cascade side effect — create the ref, never move the shared checkout.
51
+ const result = await handleCreateBranch(projectId, specId, undefined, undefined, {
52
+ mutateCheckout: false,
53
+ });
51
54
  if (result.isError === true) {
52
55
  /* v8 ignore next */
53
56
  const msg = result.content[0]?.type === 'text' ? result.content[0].text : 'branch creation failed';
@@ -18,12 +18,20 @@ export declare class TransactionalOutboxWorker {
18
18
  readonly clock?: () => Date;
19
19
  readonly limit?: number;
20
20
  readonly topics?: readonly string[];
21
+ readonly timeBudgetMs?: number;
21
22
  }): Promise<{
22
23
  readonly delivered: number;
24
+ readonly failed: number;
23
25
  readonly skipped: number;
26
+ readonly ineligible: number;
27
+ /** True when no eligible pending record remains in this scope right now. */
28
+ readonly exhausted: boolean;
24
29
  }>;
30
+ private attemptDelivery;
25
31
  private claim;
26
32
  private fail;
33
+ /** Deterministic exponential backoff with a validated cap; no random jitter. */
34
+ private computeNextAttemptAt;
27
35
  private complete;
28
36
  private deliveryKey;
29
37
  private fenceKey;
@@ -1,20 +1,32 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { BoundaryFailure } from '../../errors/error-taxonomy.js';
3
+ import { getRuntimePolicy } from '../runtime-policy.js';
3
4
  function parseFence(value) {
4
5
  if (!value || typeof value !== 'object') {
5
6
  return undefined;
6
7
  }
7
8
  const fence = value;
9
+ const nextAttemptAtValid = fence.nextAttemptAt === undefined ||
10
+ (typeof fence.nextAttemptAt === 'string' && Number.isFinite(Date.parse(fence.nextAttemptAt)));
8
11
  if (fence.schemaVersion !== 1 ||
9
12
  typeof fence.workerId !== 'string' ||
10
13
  !Number.isSafeInteger(fence.fencingToken) ||
11
14
  typeof fence.leaseExpiresAt !== 'string' ||
12
15
  typeof fence.state !== 'string' ||
13
- !['leased', 'failed', 'dead-letter', 'delivered'].includes(fence.state)) {
16
+ !['leased', 'failed', 'dead-letter', 'delivered'].includes(fence.state) ||
17
+ !nextAttemptAtValid) {
14
18
  throw new BoundaryFailure('Corrupt', 'outbox fence read', 'Quarantine the invalid fence record before retrying delivery.');
15
19
  }
16
20
  return fence;
17
21
  }
22
+ /**
23
+ * Upper bound on how many rows a single internal page fetch may request while
24
+ * paging past ineligible head records (foreign lease, delivered self-heal) that
25
+ * consume no record budget. 1000 is the existing hard ceiling `listOutbox`
26
+ * already enforces, so this reuses that ceiling rather than introducing a new
27
+ * tunable.
28
+ */
29
+ const OUTBOX_PAGE_FETCH_LIMIT = 1_000;
18
30
  /**
19
31
  * Durable outbox dispatcher. The sink must deduplicate `deliveryKey`; this stable key closes the
20
32
  * unavoidable crash window between an external acknowledgement and the local delivered marker.
@@ -26,7 +38,7 @@ export class TransactionalOutboxWorker {
26
38
  workerId;
27
39
  leaseMs;
28
40
  maxAttempts;
29
- constructor(database, projectId, workspaceId, workerId, leaseMs = 30_000, maxAttempts = 3) {
41
+ constructor(database, projectId, workspaceId, workerId, leaseMs = 30_000, maxAttempts = getRuntimePolicy().outbox.maxAttempts) {
30
42
  this.database = database;
31
43
  this.projectId = projectId;
32
44
  this.workspaceId = workspaceId;
@@ -46,38 +58,83 @@ export class TransactionalOutboxWorker {
46
58
  async drain(deliver, options = {}) {
47
59
  const clock = options.clock ?? (() => new Date());
48
60
  const now = currentIso(clock, options.now);
61
+ const policy = getRuntimePolicy().outbox;
62
+ const timeBudgetMs = options.timeBudgetMs ?? policy.sliceTimeBudgetMs;
63
+ const startedAtMs = clock().getTime();
64
+ let recordBudget = options.limit ?? policy.sliceRecordBudget;
49
65
  let delivered = 0;
50
- let skipped = 0;
51
- const pending = this.database.listOutbox(this.projectId, this.workspaceId, {
52
- pendingOnly: true,
53
- limit: options.limit,
54
- topics: options.topics,
55
- });
56
- for (const message of pending) {
57
- const fence = this.claim(message, now);
58
- if (!fence) {
59
- skipped += 1;
60
- continue;
61
- }
62
- try {
63
- await deliver({
64
- deliveryKey: this.deliveryKey(message),
65
- fencingToken: fence.fencingToken,
66
- topic: message.topic,
67
- payload: message.payload,
68
- });
69
- }
70
- catch {
71
- const failure = new BoundaryFailure('DependencyUnavailable', 'outbox delivery', 'Retry with the stable delivery key after the dependency recovers.');
72
- this.fail(message, fence, failure, currentIso(clock, options.now));
73
- throw failure;
66
+ let failed = 0;
67
+ let ineligible = 0;
68
+ let cursorId = 0;
69
+ let timedOut = false;
70
+ while (recordBudget > 0 && !timedOut) {
71
+ const batch = this.database.listOutbox(this.projectId, this.workspaceId, {
72
+ pendingOnly: true,
73
+ limit: OUTBOX_PAGE_FETCH_LIMIT,
74
+ topics: options.topics,
75
+ eligibleAt: now,
76
+ afterId: cursorId,
77
+ });
78
+ if (batch.length === 0) {
79
+ break;
74
80
  }
75
- if (!this.complete(message, fence, currentIso(clock, options.now))) {
76
- throw new BoundaryFailure('Conflict', 'outbox delivery commit', 'Another worker owns the lease; retry with the stable delivery key.');
81
+ for (const message of batch) {
82
+ // Admission check between deliveries: never aborts an in-flight delivery.
83
+ if (clock().getTime() - startedAtMs > timeBudgetMs) {
84
+ timedOut = true;
85
+ break;
86
+ }
87
+ cursorId = message.id;
88
+ const fence = this.claim(message, now);
89
+ if (!fence) {
90
+ // Ineligible for a reason SQL cannot pre-filter (foreign unexpired lease,
91
+ // self-healed delivered fence): consumes no record budget and does not
92
+ // stop the worker from advancing to the next record in this same call.
93
+ ineligible += 1;
94
+ continue;
95
+ }
96
+ recordBudget -= 1;
97
+ const outcome = await this.attemptDelivery(message, fence, deliver, clock, options.now);
98
+ if (outcome.status === 'failed') {
99
+ // Isolate the failure: continue offering remaining eligible records
100
+ // instead of aborting the whole slice.
101
+ failed += 1;
102
+ }
103
+ else {
104
+ delivered += 1;
105
+ }
106
+ if (recordBudget === 0) {
107
+ break;
108
+ }
77
109
  }
78
- delivered += 1;
79
110
  }
80
- return { delivered, skipped };
111
+ // Exact count of eligible work left unattempted (budget or time cutoff), not
112
+ // an estimate — this is what a further slice would find eligible right now.
113
+ const skipped = this.database.countEligibleOutbox(this.projectId, this.workspaceId, {
114
+ topics: options.topics,
115
+ eligibleAt: now,
116
+ afterId: cursorId,
117
+ });
118
+ return { delivered, failed, skipped, ineligible, exhausted: skipped === 0 };
119
+ }
120
+ async attemptDelivery(message, fence, deliver, clock, now) {
121
+ try {
122
+ await deliver({
123
+ deliveryKey: this.deliveryKey(message),
124
+ fencingToken: fence.fencingToken,
125
+ topic: message.topic,
126
+ payload: message.payload,
127
+ });
128
+ }
129
+ catch {
130
+ const failure = new BoundaryFailure('DependencyUnavailable', 'outbox delivery', 'Retry with the stable delivery key after the dependency recovers.');
131
+ this.fail(message, fence, failure, currentIso(clock, now));
132
+ return { status: 'failed' };
133
+ }
134
+ if (!this.complete(message, fence, currentIso(clock, now))) {
135
+ throw new BoundaryFailure('Conflict', 'outbox delivery commit', 'Another worker owns the lease; retry with the stable delivery key.');
136
+ }
137
+ return { status: 'delivered' };
81
138
  }
82
139
  claim(message, now) {
83
140
  return this.database.transaction(() => {
@@ -93,6 +150,12 @@ export class TransactionalOutboxWorker {
93
150
  if (existing?.state === 'leased' && existing.leaseExpiresAt > now) {
94
151
  return undefined;
95
152
  }
153
+ if (existing?.state === 'failed' &&
154
+ existing.nextAttemptAt !== undefined &&
155
+ existing.nextAttemptAt > now) {
156
+ // Durable retry deadline not yet reached: not eligible, attempts unchanged.
157
+ return undefined;
158
+ }
96
159
  const fence = {
97
160
  schemaVersion: 1,
98
161
  workerId: this.workerId,
@@ -126,6 +189,7 @@ export class TransactionalOutboxWorker {
126
189
  return false;
127
190
  }
128
191
  const attempts = current.attempts ?? 1;
192
+ const deadLettered = attempts >= this.maxAttempts;
129
193
  this.database.putRecord({
130
194
  projectId: this.projectId,
131
195
  workspaceId: this.workspaceId,
@@ -133,8 +197,9 @@ export class TransactionalOutboxWorker {
133
197
  key,
134
198
  value: {
135
199
  ...current,
136
- state: attempts >= this.maxAttempts ? 'dead-letter' : 'failed',
200
+ state: deadLettered ? 'dead-letter' : 'failed',
137
201
  leaseExpiresAt: now,
202
+ ...(deadLettered ? {} : { nextAttemptAt: this.computeNextAttemptAt(now, attempts) }),
138
203
  lastError: error instanceof BoundaryFailure
139
204
  ? error.message
140
205
  : new BoundaryFailure('Internal', 'outbox failure recording', 'Inspect local diagnostics and retry safely.').message,
@@ -144,6 +209,12 @@ export class TransactionalOutboxWorker {
144
209
  return true;
145
210
  });
146
211
  }
212
+ /** Deterministic exponential backoff with a validated cap; no random jitter. */
213
+ computeNextAttemptAt(now, attempts) {
214
+ const policy = getRuntimePolicy().outbox;
215
+ const delayMs = Math.min(policy.backoffBaseMs * 2 ** (attempts - 1), policy.backoffCapMs);
216
+ return new Date(Date.parse(now) + delayMs).toISOString();
217
+ }
147
218
  complete(message, fence, now) {
148
219
  return this.database.transaction(() => {
149
220
  const key = this.fenceKey(message.id);
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-aarch64-apple-darwin",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -17,15 +17,15 @@
17
17
  "platform": "darwin",
18
18
  "arch": "arm64",
19
19
  "libc": null,
20
- "artifactSha256": "d871c6912f7857fedb31608d895a4e80fbf550c18875d307cf068fa966412cb7",
20
+ "artifactSha256": "936cf103c37c5622595eba08d503131657a4718d37b84d9355fe3dd8b63f313a",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "93613e9e650a12618265c467fd3007c96ad6c261dcf373ff321d70210c1fdf90"
24
+ "sha256": "a3350e8b345415b6b7881cd0ed7b1fa09a86e21530f790e08f93e74c0bfc4384"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
28
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
29
29
  "sourceTreeDirty": false,
30
30
  "sourceDateEpoch": 1,
31
31
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -34,6 +34,6 @@
34
34
  "signature": {
35
35
  "algorithm": "Ed25519",
36
36
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
37
- "value": "5A14AujfQn9F0F6V4dCbHhSlzyWfH43wAF+8tSzLXg0t7+yELQKNNH8XqNGSqL9qGHPVxSYeTu1nh/3qQECxBQ=="
37
+ "value": "bk6W0MZRvTB3XJtJPw0Oe9Brcs8vOa0ZyWNyx81gBZHTp1qRjQjyT+bWVWjMRl9ULBE8+Iu5Sd02wR0ZGZ3MCQ=="
38
38
  }
39
39
  }
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.2",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.3",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.2",
10
+ "version": "5.3.3",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "d871c6912f7857fedb31608d895a4e80fbf550c18875d307cf068fa966412cb7"
14
+ "content": "936cf103c37c5622595eba08d503131657a4718d37b84d9355fe3dd8b63f313a"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.2",
1109
+ "ref": "pkg:cargo/planu-core@5.3.3",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-x86_64-apple-darwin",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -17,15 +17,15 @@
17
17
  "platform": "darwin",
18
18
  "arch": "x64",
19
19
  "libc": null,
20
- "artifactSha256": "2e160dbfb5616b778ea6bc1b85b6663ae9618c664824498e0089a3b82353923e",
20
+ "artifactSha256": "a00b4de15350f55e6b2dfbff7d172fe9c731f857b517ca903a3ef2faab5c9b2a",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "b4aa09e9d3bc3d5f4d0d80953f4d32389aa40fafabcac6895ebd296c4a2f6873"
24
+ "sha256": "7e25d45c059cf37c0f32d13526d9857d8b33e20e1326428d2ce6f6bf2684029b"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
28
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
29
29
  "sourceTreeDirty": false,
30
30
  "sourceDateEpoch": 1,
31
31
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -34,6 +34,6 @@
34
34
  "signature": {
35
35
  "algorithm": "Ed25519",
36
36
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
37
- "value": "xN3AVrLnDNmagcrLzUS+voWOuOHZhY4+i+nfep/66x39IdztoQEqh/jF1H/P5qxnIwGFuSztuCS3cG0pAsRqCw=="
37
+ "value": "JFfOtvnI+70+fijN8e5fJF4XqkwdZyAR8tOUxm+gdnM1okUI0EFUtqnb2nzPFzG4RnFZGSYgnoYJQpfd5zmnDw=="
38
38
  }
39
39
  }
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.2",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.3",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.2",
10
+ "version": "5.3.3",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "2e160dbfb5616b778ea6bc1b85b6663ae9618c664824498e0089a3b82353923e"
14
+ "content": "a00b4de15350f55e6b2dfbff7d172fe9c731f857b517ca903a3ef2faab5c9b2a"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.2",
1109
+ "ref": "pkg:cargo/planu-core@5.3.3",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-aarch64-unknown-linux-gnu",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "linux",
17
17
  "arch": "arm64",
18
18
  "libc": "glibc",
19
- "artifactSha256": "c688e223eaed377810f13b4fb59b95269c6ac386e9e22122012322aa20b4119f",
19
+ "artifactSha256": "83c55f2f9e0f2bc32bca52de4d5ed248b09217d1893d2e05ce7880394e25a884",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "05e6cde28bdf46282c2024bec9491908e67cf0875a1043a879533fe26e2acf6c"
23
+ "sha256": "39ddcdd6a6c9fae71bbb1f6f1716a1352ee37bf81196b24eef318d4abb0b4b1d"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
27
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
28
28
  "sourceTreeDirty": false,
29
29
  "sourceDateEpoch": 1,
30
30
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -33,6 +33,6 @@
33
33
  "signature": {
34
34
  "algorithm": "Ed25519",
35
35
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
36
- "value": "evvZQIYp2VmYUaaLu8nK5yLjTSms9hMRYoF4zM3qsCHwLLKRThOR+KrFgZ9ySZk6WRWx9CE8F/c+pKFRi/7nBg=="
36
+ "value": "P1xQ4p3pp++gck7GGKW/Ue9/MdpedjnqGeuyl/76jzqFN5VmtA+L/5jlHvBc+qDPGkNT6wiXY8R3J5CHkjk5Cg=="
37
37
  }
38
38
  }
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.2",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.3",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.2",
10
+ "version": "5.3.3",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "c688e223eaed377810f13b4fb59b95269c6ac386e9e22122012322aa20b4119f"
14
+ "content": "83c55f2f9e0f2bc32bca52de4d5ed248b09217d1893d2e05ce7880394e25a884"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.2",
1109
+ "ref": "pkg:cargo/planu-core@5.3.3",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-aarch64-unknown-linux-musl",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "linux",
17
17
  "arch": "arm64",
18
18
  "libc": "musl",
19
- "artifactSha256": "ffe6b8382aded44408171166a385d31d25fa6a95919c14ec73ca5197351da8ac",
19
+ "artifactSha256": "6f31cf91ea1ae1bde34191ab4a7b7c2d6a58dcdb7206f18dcefcc1dfb42b349b",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "6612f0831ad90d8d69aa88bbc53658d5dc55d5ff3e337e4253cb8943c7471aa5"
23
+ "sha256": "c90938e79cf8fb28eb448b50b683c624c65ddfd34ee50515b3b999465d55cc83"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
27
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
28
28
  "sourceTreeDirty": false,
29
29
  "sourceDateEpoch": 1,
30
30
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -33,6 +33,6 @@
33
33
  "signature": {
34
34
  "algorithm": "Ed25519",
35
35
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
36
- "value": "3AhxDy080JazcjbYv9SH3w6tpj4iKKLlhI95pAy1/VQ8c9iDEDLmTfFaQv4R1FXjEAUSqZ/hYZEAQ0A3XpQPCA=="
36
+ "value": "uvmtUXDibJr1Kf/Y1D1IiFea7pMuBcx2UWIonJHde2OweiQqQ1++KkoPMLGAIxfsSTncVTdXpU7nGiGpIm3jAQ=="
37
37
  }
38
38
  }
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.2",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.3",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.2",
10
+ "version": "5.3.3",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "ffe6b8382aded44408171166a385d31d25fa6a95919c14ec73ca5197351da8ac"
14
+ "content": "6f31cf91ea1ae1bde34191ab4a7b7c2d6a58dcdb7206f18dcefcc1dfb42b349b"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.2",
1109
+ "ref": "pkg:cargo/planu-core@5.3.3",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-x86_64-unknown-linux-gnu",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "linux",
17
17
  "arch": "x64",
18
18
  "libc": "glibc",
19
- "artifactSha256": "c1aeb15763bf3ee0b2d37ac694340fe65cfc106f95f6813c2e188c099c826013",
19
+ "artifactSha256": "125329171f49f6a9d37b2503c64e74238c1b4ad4f22a56177a58e64f5297ea8c",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "cd651b3c7af8a03fb3725d6342ee679dfef8272b65bc28e9f523dbfb88fa0ed8"
23
+ "sha256": "edb71690879e6a06c47b15db5d2ecd5c45d0d96f574dfb025e4ede5201925ca8"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
27
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
28
28
  "sourceTreeDirty": false,
29
29
  "sourceDateEpoch": 1,
30
30
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -33,6 +33,6 @@
33
33
  "signature": {
34
34
  "algorithm": "Ed25519",
35
35
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
36
- "value": "T9ypzN3DZ+ks4rQIjeuMKqxHHxGc7Qm/ep9zyVEsU6BvzVjOaiZijDkJXsiaNS8AqfrZkmnr6I/HtWNCqiqjCw=="
36
+ "value": "8E8ysYR9C83WqDmoU9pE+Qz8skx8fRTDRQY58Cz3CWkvU0Ul5FqTVqsMmOCGMtbQnKloSTpqejDr4wfieZcOBw=="
37
37
  }
38
38
  }
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.2",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.3",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.2",
10
+ "version": "5.3.3",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "c1aeb15763bf3ee0b2d37ac694340fe65cfc106f95f6813c2e188c099c826013"
14
+ "content": "125329171f49f6a9d37b2503c64e74238c1b4ad4f22a56177a58e64f5297ea8c"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.2",
1109
+ "ref": "pkg:cargo/planu-core@5.3.3",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.2",
4
- "engineVersion": "5.3.2",
5
- "buildId": "1-5.3.2-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.3",
4
+ "engineVersion": "5.3.3",
5
+ "buildId": "1-5.3.3-x86_64-unknown-linux-musl",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "linux",
17
17
  "arch": "x64",
18
18
  "libc": "musl",
19
- "artifactSha256": "d44f03ecaed34427ca6ed682ce695f432d25eac3366fc5e779cfa78fe39d504b",
19
+ "artifactSha256": "0e4804010d87a4089e8fd59af5d0b61ba6a572ff20f9f55b1caa904af861f030",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "86d8219cdb5f5205d458cfa205ef619f68997f7a414f04a3a30f53704650b488"
23
+ "sha256": "b90757ad531f433d3152e0e90a090afe261e5463f88accb49abd5b19f909a326"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
27
+ "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
28
28
  "sourceTreeDirty": false,
29
29
  "sourceDateEpoch": 1,
30
30
  "rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
@@ -33,6 +33,6 @@
33
33
  "signature": {
34
34
  "algorithm": "Ed25519",
35
35
  "keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
36
- "value": "O6Ay8rgviCK8bLJJbkQAsX9msRJoCxB2jkgpY6+v+7oyVohsZ3hKly1kFnQ35WRbibF4l2TBchxZI7IlKbAgCg=="
36
+ "value": "cff322qqiXm/iOOexje+zv117NOLslTpYswuxD7tgzZ86aQL30/W+bGQ2W6Qe2VVhhoG60WDXpMbwiyQndvFBg=="
37
37
  }
38
38
  }