@planu/cli 5.3.5 → 5.3.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/config/runtime-policy.json +1 -0
  3. package/dist/engine/convention-scanner/codebase-scanner.js +1 -1
  4. package/dist/engine/hooks/handlers/on-impl-change.d.ts +17 -4
  5. package/dist/engine/hooks/handlers/on-impl-change.js +43 -44
  6. package/dist/engine/living-spec-analyzer.d.ts +5 -2
  7. package/dist/engine/living-spec-analyzer.js +5 -2
  8. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  9. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  10. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  11. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  12. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  13. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  14. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  15. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  16. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  17. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  18. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  19. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  20. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  21. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  22. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  23. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  24. package/dist/engine/runtime-policy.js +7 -0
  25. package/dist/engine/scope-boundaries/contradiction-checker.js +28 -20
  26. package/dist/engine/spec-format/acceptance-criteria.js +5 -2
  27. package/dist/engine/spec-migrator/filesystem-import.js +113 -73
  28. package/dist/engine/spec-migrator/frontmatter-parser.js +15 -13
  29. package/dist/tools/auto-reconcile.js +1 -1
  30. package/dist/tools/challenge-spec/challenge-report.js +1 -1
  31. package/dist/tools/init-project/portable-index-reconciler.js +2 -1
  32. package/dist/tools/reconcile-spec.js +3 -1
  33. package/dist/tools/safe-handler.js +0 -2
  34. package/dist/tools/start-hooks/engine.d.ts +2 -3
  35. package/dist/tools/start-hooks/engine.js +50 -33
  36. package/dist/tools/start-hooks.d.ts +1 -1
  37. package/dist/tools/start-hooks.js +1 -2
  38. package/dist/tools/tool-registry/group-infra.js +36 -0
  39. package/dist/tools/update-status/transition-guard.js +17 -4
  40. package/dist/tools/validate-assurance.js +1 -1
  41. package/dist/tools/validate-lint.js +1 -1
  42. package/dist/tools/validate.d.ts +1 -0
  43. package/dist/tools/validate.js +21 -2
  44. package/dist/types/file-hooks.d.ts +4 -6
  45. package/dist/types/index.d.ts +0 -1
  46. package/dist/types/index.js +0 -1
  47. package/dist/types/mcp.d.ts +0 -19
  48. package/dist/types/runtime-policy.d.ts +1 -0
  49. package/dist/types/spec/core.d.ts +5 -0
  50. package/dist/types/spec/inputs.d.ts +16 -0
  51. package/package.json +9 -9
  52. package/planu-native.json +1 -1
  53. package/planu-plugin.json +1 -1
  54. package/dist/engine/hooks/agent-hook-migrator.d.ts +0 -9
  55. package/dist/engine/hooks/agent-hook-migrator.js +0 -140
  56. package/dist/types/hook-status-update.d.ts +0 -10
  57. package/dist/types/hook-status-update.js +0 -3
package/CHANGELOG.md CHANGED
@@ -1,3 +1,53 @@
1
+ ## [5.3.7] - 2026-08-08
2
+
3
+ ### Bug Fixes
4
+ - fix(scope-boundaries): split sentences regardless of next-sentence casing
5
+ - fix(validate): fail lint on timeout and bound unbounded validate gates
6
+ - fix(spec-1450): anchor scope-contradiction substring checks to word boundaries
7
+
8
+ ### Chores
9
+ - chore(spec-1453): redact local home path from reproducer
10
+ - chore(planu): record SPEC-1449 and SPEC-1450 done transitions
11
+ - chore(spec-1450): integrate scope-contradiction matching after arbitrated review
12
+ - chore(spec-1449): integrate validate gate timeouts after dual-provider approve
13
+ - chore(specs): cut speculative scope from the skills backlog
14
+ - chore(spec-1449): approve after 6-round independent review + Discovery evidence
15
+ - chore(deps): override nanoid to >=3.3.17 for GHSA-2v37-7h3g-55p8
16
+ - chore(planu): sync session state after SPEC-1449/1450 review cycle
17
+
18
+
19
+ ## [5.3.6] - 2026-08-07
20
+
21
+ ### Bug Fixes
22
+ - fix(spec-1404): make filesystem hook watcher observation-only
23
+ - fix(spec-1427): recognize exposed/exposes as affirmative scope drift
24
+ - fix(spec-1427): stop scope-contradiction check from flagging boundary-preserving criteria
25
+ - fix(spec-1415): arbitrate independent Codex review, harden fence and marker matching
26
+ - fix(spec-1415): heal 35 truncated spec.md bodies with a one-shot script
27
+ - fix(spec-migrator): preserve actionable estimation during portable spec import
28
+ - fix(spec-1429): cover the two untested acceptance criteria and correct stale claims
29
+ - fix(tests): match CLAUDE.md's current canonical release gate commands
30
+ - fix(spec-format): stop discarding BDD criteria mixed with checklist bullets
31
+ - fix(challenge-spec): count the challenge gate requirement against distinct scenario names
32
+
33
+ ### Refactoring
34
+ - refactor(spec-migrator): extract importSpecEntry to satisfy max-lines-per-function
35
+
36
+ ### Chores
37
+ - chore(planu): redact absolute home path from public spec reproducers
38
+ - chore(planu): sync session state after SPEC-1403/1404 closure
39
+ - chore(spec-1404): mark done after independent implementation review
40
+ - chore(planu): move SPEC-1449/1450 to review with challenge resolution evidence
41
+ - chore(planu): file SPEC-1449/1450 dogfood bugs, sync session state
42
+ - chore(spec-1427): mark spec done and drop duplicate test ownership entry
43
+ - chore(spec-1415): reconcile Files scope for done gate, file SPEC-1447 dogfood bug
44
+ - chore(planu): approve SPEC-1415 after challenge/grounding gate fixes
45
+ - chore(planu): sync SDD lifecycle state for SPEC-1404/1415/1427, file SPEC-1445/1446
46
+ - chore(planu): mark SPEC-1429 and SPEC-1431 done, file SPEC-1443/1444
47
+ - chore(planu): sync session-context checkpoint
48
+ - chore(planu): close 8 verified-stale backlog specs
49
+
50
+
1
51
  ## [5.3.5] - 2026-08-06
2
52
 
3
53
  ### Bug Fixes
@@ -29,6 +29,7 @@
29
29
  "validation": {
30
30
  "defaultDeadlineMs": 1800000,
31
31
  "durableLintTimeoutMs": 150000,
32
+ "perGateTimeoutMs": 180000,
32
33
  "complianceCommandTimeoutMs": 900000,
33
34
  "noProgressTimeoutMs": 960000,
34
35
  "submissionLockWaitMs": 180,
@@ -7,7 +7,7 @@ const MAX_VIOLATIONS_PER_CATEGORY = 50;
7
7
  // ── helpers ───────────────────────────────────────────────────────────────────
8
8
  function execSafe(cmd, cwd) {
9
9
  try {
10
- return execSync(cmd, { cwd, stdio: ['pipe', 'pipe', 'pipe'] }).toString();
10
+ return execSync(cmd, { cwd, timeout: 5_000, stdio: ['pipe', 'pipe', 'pipe'] }).toString();
11
11
  }
12
12
  catch {
13
13
  return '';
@@ -13,6 +13,18 @@ export declare function recordAnalysisTimestamp(specId: string, nowMs?: number,
13
13
  * Clear all rate limit timestamps (for testing).
14
14
  */
15
15
  export declare function clearRateLimitTimestamps(): void;
16
+ /**
17
+ * Get the cached result from the last on-impl-change analysis.
18
+ * If projectPath is omitted, returns the most recently set result across all projects.
19
+ */
20
+ export declare function getLastImplChangeResult(projectPath?: string): ImplChangeAnalysisResult | null;
21
+ /**
22
+ * Reset the on-impl-change diagnostic cache.
23
+ * If projectPath is provided, clears only that project's cache.
24
+ * If omitted, clears all projects.
25
+ * Useful for testing.
26
+ */
27
+ export declare function resetImplChangeCache(projectPath?: string): void;
16
28
  /**
17
29
  * Returns true for src/**\/*.ts files, excluding test files.
18
30
  * Test files are identified by the .test.ts or .spec.ts suffix.
@@ -26,9 +38,10 @@ export declare function findRelatedSpecs(filePath: string, specs: MinimalAnalyza
26
38
  /**
27
39
  * Handle an implementation file change event.
28
40
  * Fire-and-forget — all errors are caught internally.
29
- * When specs array and analyzeSpec function are provided, analyzes related specs.
30
- * When autoMarkDone is true (default), specs reaching 100% are automatically
31
- * transitioned to 'done' status via the spec store.
41
+ * When specs array and analyzeSpec function are provided, analyzes related specs
42
+ * and records the result as a diagnostic (see getLastImplChangeResult). It never
43
+ * transitions spec lifecycle status or writes spec.md — that requires an explicit
44
+ * reconcile_spec / update_status call by the user (SPEC-1404).
32
45
  */
33
- export declare function handleOnImplChange(event: WatcherEvent, projectPath: string, specs?: MinimalAnalyzableSpec[], analyzeSpec?: AnalyzeSpecFn, autoMarkDone?: boolean): Promise<ImplChangeAnalysisResult | undefined>;
46
+ export declare function handleOnImplChange(event: WatcherEvent, projectPath: string, specs?: MinimalAnalyzableSpec[], analyzeSpec?: AnalyzeSpecFn): Promise<ImplChangeAnalysisResult | undefined>;
34
47
  //# sourceMappingURL=on-impl-change.d.ts.map
@@ -1,8 +1,7 @@
1
1
  // engine/hooks/handlers/on-impl-change.ts — on-impl-change hook handler (SPEC-137)
2
2
  // Triggered when source implementation files (src/**/*.ts) change.
3
- // Analyzes related specs, updates completion percentage, auto-reconciles if all criteria met.
4
- import { hashProjectPath } from '../../../storage/base-store.js';
5
- const UPDATE_STATUS_MODULE = '../../../tools/update-status/index.js';
3
+ // Analyzes related specs and reports completion percentage as a diagnostic
4
+ // it never mutates spec lifecycle state (SPEC-1404).
6
5
  // ---------------------------------------------------------------------------
7
6
  // Rate limiter (per spec, 5 min cooldown)
8
7
  // ---------------------------------------------------------------------------
@@ -40,6 +39,38 @@ export function clearRateLimitTimestamps() {
40
39
  lastAnalysisTimestamps.clear();
41
40
  }
42
41
  // ---------------------------------------------------------------------------
42
+ // Diagnostic cache (per-project, mirrors on-push-check.ts's cache pattern)
43
+ // ---------------------------------------------------------------------------
44
+ const lastImplChangeResultMap = new Map();
45
+ /**
46
+ * Get the cached result from the last on-impl-change analysis.
47
+ * If projectPath is omitted, returns the most recently set result across all projects.
48
+ */
49
+ export function getLastImplChangeResult(projectPath) {
50
+ if (projectPath !== undefined) {
51
+ return lastImplChangeResultMap.get(projectPath) ?? null;
52
+ }
53
+ let last = null;
54
+ for (const v of lastImplChangeResultMap.values()) {
55
+ last = v;
56
+ }
57
+ return last;
58
+ }
59
+ /**
60
+ * Reset the on-impl-change diagnostic cache.
61
+ * If projectPath is provided, clears only that project's cache.
62
+ * If omitted, clears all projects.
63
+ * Useful for testing.
64
+ */
65
+ export function resetImplChangeCache(projectPath) {
66
+ if (projectPath !== undefined) {
67
+ lastImplChangeResultMap.delete(projectPath);
68
+ }
69
+ else {
70
+ lastImplChangeResultMap.clear();
71
+ }
72
+ }
73
+ // ---------------------------------------------------------------------------
43
74
  // Pattern matching
44
75
  // ---------------------------------------------------------------------------
45
76
  /**
@@ -98,11 +129,12 @@ export function findRelatedSpecs(filePath, specs) {
98
129
  /**
99
130
  * Handle an implementation file change event.
100
131
  * Fire-and-forget — all errors are caught internally.
101
- * When specs array and analyzeSpec function are provided, analyzes related specs.
102
- * When autoMarkDone is true (default), specs reaching 100% are automatically
103
- * transitioned to 'done' status via the spec store.
132
+ * When specs array and analyzeSpec function are provided, analyzes related specs
133
+ * and records the result as a diagnostic (see getLastImplChangeResult). It never
134
+ * transitions spec lifecycle status or writes spec.md — that requires an explicit
135
+ * reconcile_spec / update_status call by the user (SPEC-1404).
104
136
  */
105
- export async function handleOnImplChange(event, projectPath, specs, analyzeSpec, autoMarkDone = true) {
137
+ export async function handleOnImplChange(event, projectPath, specs, analyzeSpec) {
106
138
  try {
107
139
  if (!isSourceFile(event.path)) {
108
140
  return;
@@ -133,53 +165,20 @@ export async function handleOnImplChange(event, projectPath, specs, analyzeSpec,
133
165
  });
134
166
  if (result.completionPct === 100) {
135
167
  autoReconciled = true;
136
- console.warn(`[hooks] Auto-reconcile triggered for ${spec.id} (100% completion)`);
137
- if (autoMarkDone) {
138
- await markSpecDone(spec.id, projectPath);
139
- }
168
+ console.warn(`[hooks] Spec ${spec.id} reached 100% completion (diagnostic only)`);
140
169
  }
141
170
  }
142
- return {
171
+ const analysisResult = {
143
172
  changedFile: event.path,
144
173
  specsAnalyzed: results,
145
174
  autoReconciled,
146
175
  };
176
+ lastImplChangeResultMap.set(projectPath, analysisResult);
177
+ return analysisResult;
147
178
  }
148
179
  catch (err) {
149
180
  console.warn(`[hooks] on-impl-change error for ${event.path}:`, err);
150
181
  return undefined;
151
182
  }
152
183
  }
153
- // ---------------------------------------------------------------------------
154
- // Auto-done helper
155
- // ---------------------------------------------------------------------------
156
- /**
157
- * Mark a spec as 'done' in the spec store.
158
- * Errors are logged but not re-thrown so the hook pipeline continues.
159
- */
160
- async function markSpecDone(specId, projectPath) {
161
- try {
162
- const projectId = hashProjectPath(projectPath);
163
- // SPEC-720: Route through handleUpdateStatus so all gates (DoD/validate/QA) run.
164
- const updateStatusModule = (await import(UPDATE_STATUS_MODULE));
165
- const result = await updateStatusModule.handleUpdateStatus({
166
- specId,
167
- status: 'done',
168
- projectId,
169
- projectPath,
170
- trigger: 'fs-hook',
171
- actor: 'system',
172
- });
173
- if (result.isError) {
174
- const reason = result.content[0]?.type === 'text' ? result.content[0].text : 'gate blocked';
175
- console.warn(`[hooks] Auto-done blocked for ${specId} (gates): ${reason}`);
176
- }
177
- else {
178
- console.warn(`[hooks] Auto-done: spec ${specId} marked as 'done' via update_status gates`);
179
- }
180
- }
181
- catch (err) {
182
- console.warn(`[hooks] Auto-done failed for ${specId}:`, err);
183
- }
184
- }
185
184
  //# sourceMappingURL=on-impl-change.js.map
@@ -1,7 +1,10 @@
1
- import type { Spec, LivingSpecReport } from '../types/index.js';
1
+ import type { Spec, LivingSpecReport, AnalyzeLivingSpecOptions } from '../types/index.js';
2
2
  /**
3
3
  * Analyze a spec's acceptance criteria against the codebase.
4
4
  * Returns a per-criterion assessment and overall completion percentage.
5
+ * Does not write ## Progress into spec.md unless options.writeProgress is true —
6
+ * callers that document a Progress write (reconcile_spec, auto-reconcile) opt in
7
+ * explicitly (SPEC-1404).
5
8
  */
6
- export declare function analyzeLivingSpec(spec: Spec, projectPath: string): Promise<LivingSpecReport>;
9
+ export declare function analyzeLivingSpec(spec: Spec, projectPath: string, options?: AnalyzeLivingSpecOptions): Promise<LivingSpecReport>;
7
10
  //# sourceMappingURL=living-spec-analyzer.d.ts.map
@@ -12,8 +12,11 @@ const MAX_FILES_TO_SCAN = 80;
12
12
  /**
13
13
  * Analyze a spec's acceptance criteria against the codebase.
14
14
  * Returns a per-criterion assessment and overall completion percentage.
15
+ * Does not write ## Progress into spec.md unless options.writeProgress is true —
16
+ * callers that document a Progress write (reconcile_spec, auto-reconcile) opt in
17
+ * explicitly (SPEC-1404).
15
18
  */
16
- export async function analyzeLivingSpec(spec, projectPath) {
19
+ export async function analyzeLivingSpec(spec, projectPath, options = {}) {
17
20
  const criteria = await extractCriteria(spec);
18
21
  const assessments = [];
19
22
  // Pre-load file index for the project (cached for all criteria)
@@ -30,7 +33,7 @@ export async function analyzeLivingSpec(spec, projectPath) {
30
33
  // SPEC-1010 PR-C: Write living spec analysis into the unified spec.md
31
34
  // ## Progress section instead of a standalone progress.md file.
32
35
  let progressUpdated = false;
33
- if (spec.specPath) {
36
+ if (options.writeProgress === true && spec.specPath) {
34
37
  progressUpdated = await updateProgressInSpec(spec.specPath, assessments, completionPercent);
35
38
  }
36
39
  else if (spec.progressPath) {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "27b347bd91597ca547e26cf2eb25f4e7d7d7ec83ed405511bf8b80a52075b6a5",
20
+ "artifactSha256": "5969aa547241ec63357a76a7019c62ff3daa81a8396f650e1f795cc7f1e81158",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "cdacedfbf96f09a8815ea3b5b293d4d688d0a1216d5ac8e309c3031703144b76"
24
+ "sha256": "757ec9b87c1e0f2cbcd96194fa9d0c97f728b6c42789ea547f303d920e6bb542"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
28
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "V5w31e1ARajB+tq5/Zuqn/I6AS9upApk4U+3MQudZRJNXMsp+LynzSTuHb8Eg9G6AiXJxt88ZRtqJbAo2b0DAg=="
37
+ "value": "Ia+76Z663Ktv2bkf8x7TjdNXGsA/l8pCasDiSYsJmCbJ01jVxqO+qcRZ7ayNq6wrZ7/vD/OR4YyDhAv5bQvqBg=="
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.5",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.7",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.5",
10
+ "version": "5.3.7",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "27b347bd91597ca547e26cf2eb25f4e7d7d7ec83ed405511bf8b80a52075b6a5"
14
+ "content": "5969aa547241ec63357a76a7019c62ff3daa81a8396f650e1f795cc7f1e81158"
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.5",
1109
+ "ref": "pkg:cargo/planu-core@5.3.7",
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.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "7993a3dc2ff7947eb227812e88b329e870fd0e8b7b3ad152796bef8d77387745",
20
+ "artifactSha256": "53ce7d511df238b0fd1831ad04bc707b49595aeec2cf17cb010e292bdd0783db",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "cc3be430ad14a4bb6f233e60c7fccb055079b3f3aa0208c6e6f8eca9ee47e7a3"
24
+ "sha256": "fb6e23c6c74daed13132788a88c1d02b348d392baabeeda70d14d2f291830b29"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
28
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "lL4RDYXTj5JyMi4aPH4Dq9r7u45cD/onxAOOGeQJglIrLryYfLTgvUw0bCxLIExD4LghbskIpbMO5RoxilsTCA=="
37
+ "value": "qk6XvA4l7UGWmK2xYdpnkdSp6FizRrviTgz8bXsKMohnF+X5epsXZKADWMOQuMOaD956mzmkAj35D+oJFsDxDw=="
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.5",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.7",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.5",
10
+ "version": "5.3.7",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "7993a3dc2ff7947eb227812e88b329e870fd0e8b7b3ad152796bef8d77387745"
14
+ "content": "53ce7d511df238b0fd1831ad04bc707b49595aeec2cf17cb010e292bdd0783db"
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.5",
1109
+ "ref": "pkg:cargo/planu-core@5.3.7",
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.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "58667d7bf48d685e0a68845bf986ab76d7669909994649fed71b76b5e19c0fd9",
19
+ "artifactSha256": "e028b42de742bd6fa24701f16fd98d1612c99910dd65b17c48397f7203ac9a67",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "e167309ef0c22da6bbb804b6e59c64a2777aba539a718cd9225f2a5ffe16253f"
23
+ "sha256": "d832a0f7e5270482b8d9dc7aed5d5d8343ab692b35f9844c464cb211b0336c89"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
27
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "jPABgCINF4cuTxCuWa2h5suwGdPzU0lXP7oL45TvpMv8A1YP/Q5Lt4w/DIqRYYjlWzsqk228wu0O5f5V+S+kDw=="
36
+ "value": "T/tkZC0rxSANsXzAc7BPR/XuGXyF2Q80FlgZmlxOptgLFHNzPvMajWoryBvAPLo5M5/hgd1vfQrGdQUo4VwwAw=="
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.5",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.7",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.5",
10
+ "version": "5.3.7",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "58667d7bf48d685e0a68845bf986ab76d7669909994649fed71b76b5e19c0fd9"
14
+ "content": "e028b42de742bd6fa24701f16fd98d1612c99910dd65b17c48397f7203ac9a67"
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.5",
1109
+ "ref": "pkg:cargo/planu-core@5.3.7",
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.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "948e76211c8b7a4770c9f79e172184baf13fa7208a06cc149b6cd168ef5c1cf6",
19
+ "artifactSha256": "8088eca500977faa73bd856bfe230255496cadc0e6dedbe507b12f2a785bb842",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "fe1febc4c73090f46d5513ac83d98fa5fcc69b50b82aea2a9eb9bfc9943d9f58"
23
+ "sha256": "a9da9e9d6fe66aeb38d3b2a171070e5cff569165c338cfaf8dc7e9f9cc2111d5"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
27
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "W8DaJ4zBO7CgzNQ8Ygt3Fsq76sLt2AZgzRzfZLN2cxvOEsTK/aS+KgM/JpSfKbuv45c7wBgM5jUvLSPIh/qTAw=="
36
+ "value": "jg+UY6UJf0S/RDF81RiKUxgsa3ujNuBu7K2bUIsxpuP/rnKXmZrCPZX30BmSZoyYSVYspF9VVlfwlfDb6mZcAQ=="
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.5",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.7",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.5",
10
+ "version": "5.3.7",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "948e76211c8b7a4770c9f79e172184baf13fa7208a06cc149b6cd168ef5c1cf6"
14
+ "content": "8088eca500977faa73bd856bfe230255496cadc0e6dedbe507b12f2a785bb842"
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.5",
1109
+ "ref": "pkg:cargo/planu-core@5.3.7",
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.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "c1df1defdec7ecf99a65391798bb1452a0677193fc49778ebb621adf8f984da7",
19
+ "artifactSha256": "69b3f0f7054729ddda1c16481de50cd2371fc297bf2ca9bffd03291c596a853f",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "1fa7db3a02d7cd799a500eb378a41dacde4eb5f694916b49ad651658c24f3a9d"
23
+ "sha256": "105e157699e6e089c740c37c50e666d0feef8b01939466e97e92c5fc3676b919"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
27
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "vtEQHO2zRWFl2vbnBxSjwxwT+VTgwuPDVxcYAoQaIBFNt3JSOeh/NwXfEmn43xQ66vvRW1wsu5mj5nIvz7B5DQ=="
36
+ "value": "ovSb2fxdlhx8Shy5vQUS6mDePdVnSMfMAfhyW/ukSKrPS8BCA7sNYdq5JQ+1d24qtLLhR0Y+Wi89ShHz61VHAA=="
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.5",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.7",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.5",
10
+ "version": "5.3.7",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "c1df1defdec7ecf99a65391798bb1452a0677193fc49778ebb621adf8f984da7"
14
+ "content": "69b3f0f7054729ddda1c16481de50cd2371fc297bf2ca9bffd03291c596a853f"
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.5",
1109
+ "ref": "pkg:cargo/planu-core@5.3.7",
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.5",
4
- "engineVersion": "5.3.5",
5
- "buildId": "1-5.3.5-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.7",
4
+ "engineVersion": "5.3.7",
5
+ "buildId": "1-5.3.7-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": "0116080409d8d34a70bcd11545d83ef0055475bac5338e1390eb2694296f64e1",
19
+ "artifactSha256": "bf270b2b6a40ba2211487f2da514183717cdc24b28cbee53f8d62af0462317bd",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "26de786cbe886f27871dba4af38506dbbefd7823503a3af1ec91e506b10efd41"
23
+ "sha256": "6630878e3b9ae9e9a552a1d26d57e61575bd0507ef62270d375a4f47e5c3134d"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "1ebfd1609a251513993d8635170963f6dab1420e",
27
+ "sourceCommit": "2ec2f2db1b564d710e56bee0b7637b49c540ca32",
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": "UVlIbDnlrHlchfrOyYRZu/Rj8qQQkbiaPKNf8ei7B1+rXkHdryVRUiC06/UP3aaydkDVXhdkLOQmvLw1JbnyDA=="
36
+ "value": "jd3TfnFE+uJqatv0qIhNiO1Pd/c0GxogpwD0Mp30gzgO/65Dv8McDE2YtA3aVSKfQDLtj8hKhZqKCcDgC4FFAw=="
37
37
  }
38
38
  }