@planu/cli 5.3.12 → 5.3.14

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 (28) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/engine/evidence-index/index-builder.js +28 -3
  3. package/dist/engine/handoff-packager.d.ts +2 -2
  4. package/dist/engine/handoff-packager.js +5 -4
  5. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  6. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +8 -8
  7. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  8. package/dist/engine/planu-core.darwin-x64.node.sbom.json +8 -8
  9. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  10. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +8 -8
  11. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  12. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +8 -8
  13. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  14. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +8 -8
  15. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  16. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +8 -8
  17. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  18. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +8 -8
  19. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  20. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +8 -8
  21. package/dist/engine/spec-quality/generic-output-gate.js +18 -2
  22. package/dist/engine/validation/validation-source-policy.js +1 -0
  23. package/dist/tools/create-spec.js +16 -4
  24. package/dist/tools/update-status/evidence-gate.js +6 -2
  25. package/dist/types/spec-quality.d.ts +3 -0
  26. package/package.json +9 -9
  27. package/planu-native.json +1 -1
  28. package/planu-plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,39 @@
1
+ ## [5.3.14] - 2026-08-10
2
+
3
+ ### Bug Fixes
4
+ - fix(spec-1481): bound trapped fixture life per implementation-review arbitration
5
+ - fix(spec-1481): harden stdio abort test vs load and de-vacuize pid asserts
6
+ - fix(spec-1466): apply implementation-review arbitration fixes
7
+ - fix(spec-1467): require positive integer pid in waitForPid per review arbitration
8
+ - fix(spec-1466): legalize test-evidence overlap in ownership gate and handoff agreement
9
+ - fix(spec-1467): harden timing-sensitive receipt and process-runner tests
10
+
11
+ ### Chores
12
+ - chore(specs): file SPEC-1484 durable heartbeat flaky test dogfood bug
13
+ - chore(specs): file SPEC-1483 stale native artifacts after release abort
14
+ - chore(specs): record SPEC-1481 done transition and file SPEC-1482 lint-gate bug
15
+ - chore(specs): file SPEC-1481 flaky stdio lifecycle test under full-suite load
16
+ - chore(specs): record done transitions for SPEC-1466/1467 and file SPEC-1480 debt spec
17
+ - chore(specs): record implementing transitions for SPEC-1466/1467 with handoff evidence
18
+ - chore(specs): approve SPEC-1466/1467 after round 2; file SPEC-1479
19
+
20
+
21
+ ## [5.3.13] - 2026-08-10
22
+
23
+ ### Bug Fixes
24
+ - fix(spec-1468): word-boundary guard on evidence marker truncation
25
+ - fix(lifecycle): evidence-only rebind + planu digest exclusion (SPEC-1468)
26
+ - fix(spec-1469): close path-echo exemption bypass found in implementation review
27
+ - fix(spec-quality): path-token guard in restatement check + actionable gate rejection (SPEC-1469)
28
+
29
+ ### Chores
30
+ - chore(spec-1468): record done transition lifecycle state
31
+ - chore(spec-1469): record done transition lifecycle state
32
+ - chore(planu): capture auto-generated session context
33
+ - chore(specs): move SPEC-1468/1469 to implementing
34
+ - chore(specs): approve SPEC-1468/1469 after round-2 dual review + arbitration
35
+
36
+
1
37
  ## [5.3.12] - 2026-08-10
2
38
 
3
39
  ### Bug Fixes
@@ -4,13 +4,38 @@ import { createCriterionIdentity, criterionIdentitiesMatch } from '../criterion-
4
4
  export function criterionKey(criterion) {
5
5
  return createCriterionIdentity(criterion).stableKey;
6
6
  }
7
+ const EVIDENCE_MARKER = /\b(?:FILES|FUNCTIONS|TEST):/;
8
+ function truncateAtEvidenceMarker(value) {
9
+ const markerIndex = value.search(EVIDENCE_MARKER);
10
+ return markerIndex === -1 ? value : value.slice(0, markerIndex);
11
+ }
7
12
  export async function buildSpecEvidenceIndex(args) {
8
13
  const diagnostics = [...args.artifacts.invalidArtifacts];
9
14
  const matrixRows = args.artifacts.traceabilityMatrix?.rows ?? [];
10
15
  const contractValidations = args.artifacts.contractValidations;
11
- const entries = await Promise.all(args.criteria.map(async (criterion, criterionIndex) => {
12
- const identity = createCriterionIdentity(criterion, { index: criterionIndex });
13
- const rows = matrixRows.filter((row, rowIndex) => criterionIdentitiesMatch(createCriterionIdentity(row.acceptanceCriterion, { index: rowIndex }), identity));
16
+ const criterionEntries = args.criteria.map((criterion, index) => ({
17
+ criterion,
18
+ identity: createCriterionIdentity(criterion, { index }),
19
+ truncatedIdentity: createCriterionIdentity(truncateAtEvidenceMarker(criterion), { index }),
20
+ }));
21
+ const rowCriterionIndexes = matrixRows.map((row, rowIndex) => {
22
+ const rowIdentity = createCriterionIdentity(row.acceptanceCriterion, { index: rowIndex });
23
+ const exactMatches = criterionEntries
24
+ .map((entry, criterionIndex) => criterionIdentitiesMatch(rowIdentity, entry.identity) ? criterionIndex : -1)
25
+ .filter((criterionIndex) => criterionIndex !== -1);
26
+ if (exactMatches.length > 0) {
27
+ return exactMatches;
28
+ }
29
+ const truncatedRowIdentity = createCriterionIdentity(truncateAtEvidenceMarker(row.acceptanceCriterion), { index: rowIndex });
30
+ const truncatedMatches = criterionEntries
31
+ .map((entry, criterionIndex) => criterionIdentitiesMatch(truncatedRowIdentity, entry.truncatedIdentity)
32
+ ? criterionIndex
33
+ : -1)
34
+ .filter((criterionIndex) => criterionIndex !== -1);
35
+ return truncatedMatches.length === 1 ? truncatedMatches : [];
36
+ });
37
+ const entries = await Promise.all(criterionEntries.map(async ({ criterion, identity }, criterionIndex) => {
38
+ const rows = matrixRows.filter((_, rowIndex) => (rowCriterionIndexes[rowIndex] ?? []).includes(criterionIndex));
14
39
  const evidence = await collectEvidence({
15
40
  rows,
16
41
  contractValidations,
@@ -16,8 +16,8 @@ export declare function extractCanonicalFileOwnership(content: string): {
16
16
  toModify: string[];
17
17
  toCreate: string[];
18
18
  toTest: string[];
19
- /** Test paths as declared, before conflict filteringused to exclude conflicted
20
- * paths from other categories even though they no longer appear in `toTest`. */
19
+ /** Test paths as declared, before conflict strippingfeeds the package-level
20
+ * test filter and the ownership-agreement exclusion. */
21
21
  toTestDeclared: string[];
22
22
  blockers: string[];
23
23
  };
@@ -213,7 +213,7 @@ export function extractCanonicalFileOwnership(content) {
213
213
  const toCreate = parseSection('Create');
214
214
  const toModify = parseSection('Modify');
215
215
  const toTest = parseSection('Test');
216
- const conflicts = [...new Set([...toCreate, ...toModify, ...toTest])].filter((path) => [toCreate, toModify, toTest].filter((paths) => paths.includes(path)).length > 1);
216
+ const conflicts = toCreate.filter((path) => toModify.includes(path));
217
217
  for (const path of conflicts) {
218
218
  addBlocker(`CONFLICTING_FILE_OWNERSHIP: ${path}`);
219
219
  }
@@ -411,10 +411,11 @@ function extractFileLevelWorkPlanOwnership(content) {
411
411
  blockers: [...new Set(state.blockers)].sort(),
412
412
  };
413
413
  }
414
- function validateOwnershipAgreement(canonical, workPlan) {
414
+ function validateOwnershipAgreement(canonical, workPlan, testDeclaredPaths) {
415
415
  if (!canonical.present || !workPlan.present) {
416
416
  return [];
417
417
  }
418
+ const testDeclared = new Set(testDeclaredPaths);
418
419
  const classification = (ownership, path) => ownership.toCreate.includes(path)
419
420
  ? 'Create'
420
421
  : ownership.toModify.includes(path)
@@ -425,7 +426,7 @@ function validateOwnershipAgreement(canonical, workPlan) {
425
426
  ...canonical.toModify,
426
427
  ...workPlan.toCreate,
427
428
  ...workPlan.toModify,
428
- ]);
429
+ ].filter((path) => !testDeclared.has(path)));
429
430
  return [...paths].sort().flatMap((path) => {
430
431
  const canonicalClass = classification(canonical, path);
431
432
  const workPlanClass = classification(workPlan, path);
@@ -598,7 +599,7 @@ export async function packageHandoff(spec, knowledge) {
598
599
  ...canonicalFiles.blockers,
599
600
  ...canonicalOwnership.blockers,
600
601
  ...workPlanOwnership.blockers,
601
- ...validateOwnershipAgreement(canonicalOwnership, workPlanOwnership),
602
+ ...validateOwnershipAgreement(canonicalOwnership, workPlanOwnership, canonicalFiles.toTestDeclared),
602
603
  ...(!['draft', 'review', 'approved', 'implementing', 'done', 'discarded'].includes(spec.status)
603
604
  ? [`UNSUPPORTED_LIFECYCLE_STATUS: ${spec.status}`]
604
605
  : []),
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "ff523b8deecdeea84449f8fcaf402893b744a5e6a9bb11c1ddee1e194d1f50cd",
20
+ "artifactSha256": "4c174c7bc2bf7e440d3295feb2d8039ae905dc1c588007ae50bb74b0c6b7fd26",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "1992527c0ba21e2dfb259b3a7e4601d5df1cd7a1e7004822c8a071fbdfe0ee72"
24
+ "sha256": "e00b7cad12d3665a3ffa98b91f795bd81d23128775a5574b801bf70c8adc7afb"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
28
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "HTUvjAMhd8bhrAiu15H3hIo2wU0GP6IfEyDNJm5kINJEuCbxWLtdVim45RF3P+ygGZo1SPLuNxnPl9mFliQ7AQ=="
37
+ "value": "rOWsQsW8oC6kfbEGi+9Ez3Z3MUyXiyyBakI+adPC6o5DECM+mdC++CQ04n0lMuTidLK+PGXq1ZjkkRA45iKfDg=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "ff523b8deecdeea84449f8fcaf402893b744a5e6a9bb11c1ddee1e194d1f50cd"
14
+ "content": "4c174c7bc2bf7e440d3295feb2d8039ae905dc1c588007ae50bb74b0c6b7fd26"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "f8c82cf85a4a23b71d48be21a68d4df8794f859ba0dc7faf606bdfc6237b87ba",
20
+ "artifactSha256": "585436bd096f716d38077ee00628f80f10b2b7a53eebc064c71a348c691a120c",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "60634a9dc231f9072fde1f67ff8a5bbc55e46b60d27c60cb108bedbd50411268"
24
+ "sha256": "fdd221a66ce155cf8571f478400c90e78b0fd644f4872d75688fb406c1d3ea7e"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
28
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "IzK1AOM08Nj7CATQpFl9FsIJlXXxo7To0446ljsCQQ1P2ubMQrdpsFG8zGleaP+/jY19aaI8hsix+8dDWw77CA=="
37
+ "value": "Fily8bX8ubTUGRXVQypr+6847eqkD+bGCPQQNXTMhaG+vj3IK3SNrPGfR7uRNT74D0K1inVGIV3umQbQ6IMvCw=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "f8c82cf85a4a23b71d48be21a68d4df8794f859ba0dc7faf606bdfc6237b87ba"
14
+ "content": "585436bd096f716d38077ee00628f80f10b2b7a53eebc064c71a348c691a120c"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "02e9b9e3299f353c6b3f7af3c19028c59ff9709d2556511a790133c9f48a9415",
19
+ "artifactSha256": "a8a29c8478e18fa30f1db2c123fa8a9f3df6021ee41371415b0b58c058102477",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "068657ff17929cbf9648464ae855e33650852295281f018ef2e1dc7d0b81b4e5"
23
+ "sha256": "d11c991b3337d7a437cc66106a2f8d3b4b119f6b088c3509e7b8c754f4eddd0f"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "1YvI7w6WGFWlTBPRDAq6syJqw6GWE5o3MAbDYFtkbA2k7GLIM9h6DtV+bsGHOTA1FfrO5dFLKq7TEfKBIXjTAg=="
36
+ "value": "N0GemRSWE3adFqXfPJQ8W/oU9aAgejnHCza7s3SBXjU8sFS/ntUtZ3q8MGFP+lN/QDqHnhHIyM/XSqM7KzejDw=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "02e9b9e3299f353c6b3f7af3c19028c59ff9709d2556511a790133c9f48a9415"
14
+ "content": "a8a29c8478e18fa30f1db2c123fa8a9f3df6021ee41371415b0b58c058102477"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "14d49f6f3317b10ffa02399ce9e864f8674aabbe63cddaf30c8e893caa50161b",
19
+ "artifactSha256": "bd0f6ff601ab21a2052364567465ba319d847a5b67f061bb5107360a88c03971",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "2d064fe5d098c9bcb742337a5de979b9f1527ca5631a5a50fdb7bb518572d7de"
23
+ "sha256": "8fbe609d1e94a3650544e02908b35b6ebdf93eac6dcd1ddf7983add76da5b57e"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "oSM7VB0hcVN6suleUCCNY+pHhllCu1mkw5VFAtUWvsKu4fh6JZ/Rp9I1uVmB/GWbmXW9ydMRC1tgslU9THxqDA=="
36
+ "value": "dUqTPahkHmCiAEmSaMEnq3zUKFiVBV+ZuMZTP4c8AryvORF2OoCGUglSVf+Ol9Ww8H4CIyByxkftL01Awk8rAw=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "14d49f6f3317b10ffa02399ce9e864f8674aabbe63cddaf30c8e893caa50161b"
14
+ "content": "bd0f6ff601ab21a2052364567465ba319d847a5b67f061bb5107360a88c03971"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "6b92deb985196cc4fa39f303bfaeaf6a7fe91e6956c88f4703c9eb80a14907eb",
19
+ "artifactSha256": "ab11f8980f5b174b9c2d5b6806daa3d356a12e841b2eaf668c106a3c45cd816e",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "e41dbcc50ba6a9ab7e7fd28ac7575c42278789d50df00e9b8c966f3457b26573"
23
+ "sha256": "24889fae3a9cff6f55b7cd1d60b6ea1ccb7fa9a8e53f3e2609e1aab97d6fa88b"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "+3i482SRJYkWRr9Hen7RC/+/RylV/20s7P/Aih3Ohau2MgX9WGMuhlPtrsRm2ka7nqpfAbSiHAargBAll01oCw=="
36
+ "value": "Scj9Wqin6lntJ7TVv9I4nGUPwfYEIkvDW957suo9QXU3oLZIdwo+gWy+8r0jfMvNzqkbJrXuaUseiGzMnV31Aw=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "6b92deb985196cc4fa39f303bfaeaf6a7fe91e6956c88f4703c9eb80a14907eb"
14
+ "content": "ab11f8980f5b174b9c2d5b6806daa3d356a12e841b2eaf668c106a3c45cd816e"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-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": "090f69d833611e7719e0888c077dbf77753a4e04133b24d25916bd64af5aaf43",
19
+ "artifactSha256": "c23996625c6b938358150cf4179453e12e2e0fd13e8eea0e84f5fcc85c55e150",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "26742cf05d4862d5657fb85941248a21de692ecc6ae8ff3365d9a5b868b2249c"
23
+ "sha256": "6dc9f80ab3206c95cc8a9f3eff39bf21f21e8fbb30e0cf31c4dbcd26e095c675"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "oahOQvontXieDU/JM+btZgDzXZVWchvAuYHjvTFS44WwkwJguIzIcokp80qaNmtRXsY6rrSb0EB3Z91WF7xlDQ=="
36
+ "value": "813Dm95ogKfJ0gWnnob2MqAjFqrZiGqBFsOKm9fbJB1y3MWxQn1ntV1t/eONh0I1r6qA/LJFarprcALWHEMbAA=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "090f69d833611e7719e0888c077dbf77753a4e04133b24d25916bd64af5aaf43"
14
+ "content": "c23996625c6b938358150cf4179453e12e2e0fd13e8eea0e84f5fcc85c55e150"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-aarch64-pc-windows-msvc",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-aarch64-pc-windows-msvc",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "win32",
17
17
  "arch": "arm64",
18
18
  "libc": null,
19
- "artifactSha256": "cf138d9e9e92b96f5b21de5a8711eff870e3075d0c5fc065b3f4f49029777c87",
19
+ "artifactSha256": "0668394e6f892080771e2f878c2f75d7692f7d2db03c543bdda4fd2fbbf27bd4",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-arm64-msvc.node.sbom.json",
23
- "sha256": "cc83713433b55a3e207c0f54ca504265f8a55ea90dea70ced1ea6699b6b9f1da"
23
+ "sha256": "8bd0170c6b52aed934ad9d080190e2d63cf012bd6d6f132449e599e1770c60fa"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "ofYOfjmQbbkoYzbcQ2psnXvyHHXPejpwm98gCmQHoXwDmshJlXmEh+yGQfhB2+2sj9Vew0QEfDdup7s5WpmPCw=="
36
+ "value": "Pse3AY39p2tC7McGWVjvSCG/TOprOtT1W9dvf0XwP/ZWVEd4fVCQUwrTyoXKGAwXCOp4vQjViiE+CvHuSkQ2Dw=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "cf138d9e9e92b96f5b21de5a8711eff870e3075d0c5fc065b3f4f49029777c87"
14
+ "content": "0668394e6f892080771e2f878c2f75d7692f7d2db03c543bdda4fd2fbbf27bd4"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
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.12",
4
- "engineVersion": "5.3.12",
5
- "buildId": "1-5.3.12-x86_64-pc-windows-msvc",
3
+ "cliVersion": "5.3.14",
4
+ "engineVersion": "5.3.14",
5
+ "buildId": "1-5.3.14-x86_64-pc-windows-msvc",
6
6
  "protocolAbi": 1,
7
7
  "capabilityAbi": 2,
8
8
  "nodeApiAbi": 4,
@@ -16,15 +16,15 @@
16
16
  "platform": "win32",
17
17
  "arch": "x64",
18
18
  "libc": null,
19
- "artifactSha256": "01375537d3a4179420ccf3bb1927246b7aeaddb87b421f88cf0bbbb795211fe3",
19
+ "artifactSha256": "60f4555904763ce92bb3193d78ce261c98334ff4630466214ba8ab1c257a2482",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-x64-msvc.node.sbom.json",
23
- "sha256": "e23734f6ed9e20b3c3ea614b16cacb63748bd11953a2d482654720a5ba9dd18a"
23
+ "sha256": "4754b2b3a274f43a3ee5d1bcece2ae4c8a02373bf9ba646291dce44574304df5"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "492ab6a01d184b5778576a890418143361819d20",
27
+ "sourceCommit": "a847a7442e7735a9f4f2a9878eccbd52fc54509b",
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": "p0gyjSJxiKoyZlBp9bpqNrjmd4mu/AAuliEDQKGdGXVHHB6Vb0gX74WUe5MQgI6EoaE4OfLKjJzINjC3XO5qAA=="
36
+ "value": "KLoEL/AX7y2xHycyQKsFA2zksyqZ8uDBBixdAqVnSTf5Oa/aEUsOS7CbH2dt3vpY034HSgbZO319iN+ws/taBA=="
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.12",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.14",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.12",
10
+ "version": "5.3.14",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "01375537d3a4179420ccf3bb1927246b7aeaddb87b421f88cf0bbbb795211fe3"
14
+ "content": "60f4555904763ce92bb3193d78ce261c98334ff4630466214ba8ab1c257a2482"
15
15
  }
16
16
  ]
17
17
  }
@@ -70,9 +70,9 @@
70
70
  },
71
71
  {
72
72
  "type": "library",
73
- "bom-ref": "pkg:cargo/bstr@1.13.0",
73
+ "bom-ref": "pkg:cargo/bstr@1.13.1",
74
74
  "name": "bstr",
75
- "version": "1.13.0",
75
+ "version": "1.13.1",
76
76
  "externalReferences": [
77
77
  {
78
78
  "type": "distribution",
@@ -971,7 +971,7 @@
971
971
  ]
972
972
  },
973
973
  {
974
- "ref": "pkg:cargo/bstr@1.13.0",
974
+ "ref": "pkg:cargo/bstr@1.13.1",
975
975
  "dependsOn": [
976
976
  "pkg:cargo/memchr@2.8.3",
977
977
  "pkg:cargo/serde_core@1.0.228"
@@ -1049,7 +1049,7 @@
1049
1049
  "ref": "pkg:cargo/globset@0.4.20",
1050
1050
  "dependsOn": [
1051
1051
  "pkg:cargo/aho-corasick@1.1.5",
1052
- "pkg:cargo/bstr@1.13.0",
1052
+ "pkg:cargo/bstr@1.13.1",
1053
1053
  "pkg:cargo/log@0.4.33",
1054
1054
  "pkg:cargo/regex-automata@0.4.18",
1055
1055
  "pkg:cargo/regex-syntax@0.8.11"
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.3.12",
1109
+ "ref": "pkg:cargo/planu-core@5.3.14",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -119,10 +119,13 @@ function checkInterpolatedSections(content, criteria) {
119
119
  }
120
120
  const start = heading.index + heading[0].length;
121
121
  const end = headingMatches[i + 1]?.index ?? content.length;
122
- const bullets = content
122
+ const bulletLines = content
123
123
  .slice(start, end)
124
124
  .split('\n')
125
- .map((line) => BULLET_LINE_RE.exec(line.trim())?.[1])
125
+ .map((line) => line.trim())
126
+ .filter((line) => BULLET_LINE_RE.test(line));
127
+ const bullets = bulletLines
128
+ .map((line) => BULLET_LINE_RE.exec(line)?.[1])
126
129
  .filter((line) => Boolean(line));
127
130
  if (isFileListSection(bullets)) {
128
131
  continue;
@@ -132,6 +135,7 @@ function checkInterpolatedSections(content, criteria) {
132
135
  kind: STRUCTURAL_INTERPOLATION_KIND,
133
136
  phrase: heading[1],
134
137
  reason: `subsection "${heading[1]}" restates each criterion into the same template with no new information`,
138
+ evidence: bulletLines[0],
135
139
  });
136
140
  }
137
141
  }
@@ -192,10 +196,22 @@ function restatesCriterion(variable, criteria) {
192
196
  if (normalizedCriterion.length < CRITERION_RESTATEMENT_MIN_LENGTH) {
193
197
  return false;
194
198
  }
199
+ if (isCriterionPathTokenEcho(normalizedVariable, criterion)) {
200
+ return false;
201
+ }
195
202
  return (normalizedVariable.includes(normalizedCriterion) ||
196
203
  normalizedCriterion.includes(normalizedVariable));
197
204
  });
198
205
  }
206
+ function isCriterionPathTokenEcho(normalizedVariable, criterion) {
207
+ return criterionPathTokens(criterion).some((token) => normalizeForRestatementMatch(token).includes(normalizedVariable));
208
+ }
209
+ function criterionPathTokens(criterion) {
210
+ return criterion
211
+ .split(/\s+/)
212
+ .map((word) => word.replace(/^[`'"]+|[`'".,;:]+$/g, ''))
213
+ .filter((word) => PATH_TOKEN_RE.test(word));
214
+ }
199
215
  function normalizeForRestatementMatch(value) {
200
216
  return value
201
217
  .replace(/[`*_"]/g, '')
@@ -7,6 +7,7 @@ export const SOURCE_IGNORED_ROOTS = new Set([
7
7
  'coverage',
8
8
  'dist',
9
9
  'node_modules',
10
+ 'planu',
10
11
  ]);
11
12
  export function isValidationSourcePath(path) {
12
13
  const normalized = path.replaceAll('\\', '/').normalize('NFC');
@@ -927,6 +927,21 @@ function applyEnglishOnlyGate(gate) {
927
927
  function quotePosixShellArgument(value) {
928
928
  return `'${value.replaceAll("'", `'"'"'`)}'`;
929
929
  }
930
+ /**
931
+ * SPEC-1469: the quality gate finding alone (`phrase` + `reason`) forced callers into
932
+ * trial-and-error rewording because it dropped the offending rendered line and the rule
933
+ * needed to pass. Quoting `evidence` verbatim and naming the generator-owned FILES:/TEST:
934
+ * marker exemption gives a what-failed + what-to-do-next message on the first read.
935
+ */
936
+ function formatGenericOutputIssue(issue) {
937
+ const base = `${issue.phrase}: ${issue.reason}`;
938
+ if (!issue.evidence) {
939
+ return base;
940
+ }
941
+ return (`${base}. Offending row: "${issue.evidence}". ` +
942
+ "A row that only echoes a criterion's own mandatory FILES:/TEST: marker path is generator-owned " +
943
+ "and already exempt; rewrite the row's remaining content so it adds information beyond the fixed template.");
944
+ }
930
945
  function earlyPreparation(result, clarificationProjectId) {
931
946
  return {
932
947
  kind: 'early',
@@ -1144,10 +1159,7 @@ async function prepareCreateSpecCandidate(initialParams, server) {
1144
1159
  {
1145
1160
  type: 'text',
1146
1161
  text: 'Spec quality gate blocked generic output before persistence. ' +
1147
- genericOutputGate.issues
1148
- .slice(0, 3)
1149
- .map((issue) => `${issue.phrase}: ${issue.reason}`)
1150
- .join('; '),
1162
+ genericOutputGate.issues.slice(0, 3).map(formatGenericOutputIssue).join('; '),
1151
1163
  },
1152
1164
  ],
1153
1165
  isError: true,
@@ -67,6 +67,7 @@ import { reportClassifiedDegradation } from '../../errors/classified-degradation
67
67
  import { captureValidationFreshnessLease } from '../../engine/validation/validation-freshness.js';
68
68
  import { computeDurableValidationBindings, toValidationReceiptBindings, } from '../../engine/validation/durable-validation.js';
69
69
  import { checkReconciliationFreshness } from '../../engine/evidence-gates/reconciliation-freshness.js';
70
+ import { doneReceiptBindingsDifferOnlyInEvidence } from './done-receipt-verifier.js';
70
71
  import { extractCanonicalFileOwnership } from '../../engine/handoff-packager.js';
71
72
  import { generateTaskPlanSkeleton, writeEvidenceSkeleton, } from '../../engine/evidence-gates/evidence-skeletons.js';
72
73
  import { extractSection } from '../../engine/spec-format/markdown-sections.js';
@@ -285,8 +286,11 @@ async function currentBindingsAreFresh(identity, currentBindings) {
285
286
  projectPath: identity.projectPath,
286
287
  specPath,
287
288
  });
288
- return (JSON.stringify(toValidationReceiptBindings(observed.bindings, observed.artifactDigests)) ===
289
- JSON.stringify(currentBindings));
289
+ const observedBindings = toValidationReceiptBindings(observed.bindings, observed.artifactDigests);
290
+ if (JSON.stringify(observedBindings) === JSON.stringify(currentBindings)) {
291
+ return true;
292
+ }
293
+ return doneReceiptBindingsDifferOnlyInEvidence(observedBindings, currentBindings);
290
294
  }
291
295
  catch (error) {
292
296
  reportClassifiedDegradation('VALIDATION_RECEIPT_RECOMPUTE_FAILED', error);
@@ -45,6 +45,9 @@ export interface GenericSpecOutputIssue {
45
45
  kind: GenericSpecOutputIssueKind;
46
46
  phrase: string;
47
47
  reason: string;
48
+ /** SPEC-1469: the first offending bullet verbatim, so the tool boundary can quote the exact
49
+ * rendered line instead of forcing the caller to guess which row collided. */
50
+ evidence?: string;
48
51
  }
49
52
  export interface GenericSpecOutputGateResult {
50
53
  passed: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planu/cli",
3
- "version": "5.3.12",
3
+ "version": "5.3.14",
4
4
  "description": "Planu — MCP Server for Spec Driven Development with native Rust acceleration for hot paths. Cross-platform (Linux/macOS/Windows, x64/arm64, glibc/musl).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -35,14 +35,14 @@
35
35
  "packageName": "@planu/core"
36
36
  },
37
37
  "optionalDependencies": {
38
- "@planu/core-darwin-arm64": "5.3.12",
39
- "@planu/core-darwin-x64": "5.3.12",
40
- "@planu/core-linux-arm64-gnu": "5.3.12",
41
- "@planu/core-linux-arm64-musl": "5.3.12",
42
- "@planu/core-linux-x64-gnu": "5.3.12",
43
- "@planu/core-linux-x64-musl": "5.3.12",
44
- "@planu/core-win32-arm64-msvc": "5.3.12",
45
- "@planu/core-win32-x64-msvc": "5.3.12"
38
+ "@planu/core-darwin-arm64": "5.3.14",
39
+ "@planu/core-darwin-x64": "5.3.14",
40
+ "@planu/core-linux-arm64-gnu": "5.3.14",
41
+ "@planu/core-linux-arm64-musl": "5.3.14",
42
+ "@planu/core-linux-x64-gnu": "5.3.14",
43
+ "@planu/core-linux-x64-musl": "5.3.14",
44
+ "@planu/core-win32-arm64-msvc": "5.3.14",
45
+ "@planu/core-win32-x64-msvc": "5.3.14"
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=24.0.0"
package/planu-native.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dev.planu.native",
3
3
  "displayName": "Planu Native Lightweight Surface",
4
- "version": "5.3.12",
4
+ "version": "5.3.14",
5
5
  "packageName": "@planu/cli",
6
6
  "modes": {
7
7
  "lightweight": {
package/planu-plugin.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "dev.planu.cli",
3
3
  "displayName": "Planu — Spec Driven Development",
4
4
  "description": "Manage software specs, estimations, and autonomous SDD workflows. Language-agnostic MCP server for Claude Code.",
5
- "version": "5.3.12",
5
+ "version": "5.3.14",
6
6
  "icon": "assets/plugin/icon.svg",
7
7
  "command": ["npx", "@planu/cli@latest"],
8
8
  "packageName": "@planu/cli",