@planu/cli 5.3.3 → 5.3.4

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 +20 -0
  2. package/dist/engine/autopilot/action-registry.js +20 -2
  3. package/dist/engine/constitution/sdd-rules-registry.js +8 -4
  4. package/dist/engine/drift/violation-resolver.js +30 -8
  5. package/dist/engine/evidence-gates/evidence-skeletons.js +9 -4
  6. package/dist/engine/handoff-packager.js +10 -3
  7. package/dist/engine/implementation-contract/common.d.ts +13 -1
  8. package/dist/engine/implementation-contract/common.js +19 -3
  9. package/dist/engine/implementation-contract/evaluator.js +116 -35
  10. package/dist/engine/implementation-contract/renderer.js +62 -31
  11. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  12. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  13. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  14. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  15. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  16. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  17. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  18. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  19. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  20. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  21. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  22. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  23. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  24. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  25. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  26. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  27. package/dist/engine/spec-format/unified-spec-builder.js +32 -8
  28. package/dist/engine/spec-generator/fallback-generator.js +5 -3
  29. package/dist/engine/spec-quality/generic-output-gate.d.ts +7 -1
  30. package/dist/engine/spec-quality/generic-output-gate.js +199 -8
  31. package/dist/engine/spec-quality-scorer.js +9 -5
  32. package/dist/engine/workers/handlers/auto-drift.js +22 -8
  33. package/dist/tools/create-spec.js +5 -0
  34. package/dist/tools/update-status/evidence-gate.js +10 -17
  35. package/dist/tools/update-status/transition-guard.js +26 -14
  36. package/dist/types/spec-quality.d.ts +6 -1
  37. package/package.json +9 -9
  38. package/planu-native.json +1 -1
  39. package/planu-plugin.json +1 -1
@@ -4,14 +4,14 @@
4
4
  "version": 1,
5
5
  "metadata": {
6
6
  "component": {
7
- "bom-ref": "pkg:cargo/planu-core@5.3.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "936cf103c37c5622595eba08d503131657a4718d37b84d9355fe3dd8b63f313a"
14
+ "content": "570521dc4b74de29cb0e40a5da5da31bb8a34851c7bbc632c40dfeba48400bfc"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "a00b4de15350f55e6b2dfbff7d172fe9c731f857b517ca903a3ef2faab5c9b2a",
20
+ "artifactSha256": "0912425f86760d302fed2c7c81a1e6c41f46b143ba6e611120e1c9cffe4c7fe3",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "7e25d45c059cf37c0f32d13526d9857d8b33e20e1326428d2ce6f6bf2684029b"
24
+ "sha256": "8b9b3ef32f117e9ca3cebbe8ccfc04f4be4250496a45dffc6e9afa03640a89c9"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
28
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "JFfOtvnI+70+fijN8e5fJF4XqkwdZyAR8tOUxm+gdnM1okUI0EFUtqnb2nzPFzG4RnFZGSYgnoYJQpfd5zmnDw=="
37
+ "value": "f/aPrNL3a1yLv73UGSBLj+lnbA1N9L7YqjgWDERXxNPsv9xmK6//LgzZhXXMHQmcU9kV40J3Re3sVnCB56MHDQ=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "a00b4de15350f55e6b2dfbff7d172fe9c731f857b517ca903a3ef2faab5c9b2a"
14
+ "content": "0912425f86760d302fed2c7c81a1e6c41f46b143ba6e611120e1c9cffe4c7fe3"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "83c55f2f9e0f2bc32bca52de4d5ed248b09217d1893d2e05ce7880394e25a884",
19
+ "artifactSha256": "0e815c9991af25c98c0d0de307b850385204b0e3eee7fd31ab40c5e77ebcd3d5",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "39ddcdd6a6c9fae71bbb1f6f1716a1352ee37bf81196b24eef318d4abb0b4b1d"
23
+ "sha256": "bb4cdfbbd37c0990dc035253ccb275e109941ee3a9c169d520b4f1857ab6159b"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "P1xQ4p3pp++gck7GGKW/Ue9/MdpedjnqGeuyl/76jzqFN5VmtA+L/5jlHvBc+qDPGkNT6wiXY8R3J5CHkjk5Cg=="
36
+ "value": "bLVx5tLIU+AaTSOdP/kJeXAUtUOY+FqHpAX04NtahMzSz61CWs8YOEDhJzLWBNv7IeorjRSKasAq/5e8YG9YBA=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "83c55f2f9e0f2bc32bca52de4d5ed248b09217d1893d2e05ce7880394e25a884"
14
+ "content": "0e815c9991af25c98c0d0de307b850385204b0e3eee7fd31ab40c5e77ebcd3d5"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "6f31cf91ea1ae1bde34191ab4a7b7c2d6a58dcdb7206f18dcefcc1dfb42b349b",
19
+ "artifactSha256": "5189fb5c83e53a091b57c0cfd372455b6210ffc23919434a0cf7644455b60b77",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "c90938e79cf8fb28eb448b50b683c624c65ddfd34ee50515b3b999465d55cc83"
23
+ "sha256": "16fa655252e62f666d6a1ca041108685532d283622ed44bdd91838bf0953d7b2"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "uvmtUXDibJr1Kf/Y1D1IiFea7pMuBcx2UWIonJHde2OweiQqQ1++KkoPMLGAIxfsSTncVTdXpU7nGiGpIm3jAQ=="
36
+ "value": "6QGtEc97VMTZiSeA8cROjxiO8GRssD0jak6OWFPzIQ+CG7xsnloT/6G7Yxyi0HVmoEShx2pnmSKpigEg5wQyCQ=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "6f31cf91ea1ae1bde34191ab4a7b7c2d6a58dcdb7206f18dcefcc1dfb42b349b"
14
+ "content": "5189fb5c83e53a091b57c0cfd372455b6210ffc23919434a0cf7644455b60b77"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "125329171f49f6a9d37b2503c64e74238c1b4ad4f22a56177a58e64f5297ea8c",
19
+ "artifactSha256": "3fa9b1c9b4096bbf7628582e4f2fe62250836f6415000e402b67eb109aaf2d32",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "edb71690879e6a06c47b15db5d2ecd5c45d0d96f574dfb025e4ede5201925ca8"
23
+ "sha256": "93bdc77c871c4e47c47becd9bfe65cf96970dbc17619ad9963c9ca901777b2fd"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "8E8ysYR9C83WqDmoU9pE+Qz8skx8fRTDRQY58Cz3CWkvU0Ul5FqTVqsMmOCGMtbQnKloSTpqejDr4wfieZcOBw=="
36
+ "value": "ehdGAkoK/g0bywWm+yz+e6X3dZ5gmVCWjz6jip97SMkUysrPvgTiEWRJFa7DRcwLBNpmDr0M1iR3Dcktv4EpDg=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "125329171f49f6a9d37b2503c64e74238c1b4ad4f22a56177a58e64f5297ea8c"
14
+ "content": "3fa9b1c9b4096bbf7628582e4f2fe62250836f6415000e402b67eb109aaf2d32"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "0e4804010d87a4089e8fd59af5d0b61ba6a572ff20f9f55b1caa904af861f030",
19
+ "artifactSha256": "84a3ad58be73c7b2c75a1b15252e557644c80bf66e6484781107300b6b0aec91",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "b90757ad531f433d3152e0e90a090afe261e5463f88accb49abd5b19f909a326"
23
+ "sha256": "dd6d811714f3dbe94427c0e66399f779dd9d9c194af589ae143bd16dc929b31a"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "cff322qqiXm/iOOexje+zv117NOLslTpYswuxD7tgzZ86aQL30/W+bGQ2W6Qe2VVhhoG60WDXpMbwiyQndvFBg=="
36
+ "value": "DUxITC22qKLQyVQNvklBEPM4TRryjTl4v3QM6mz+4f46GEkcMEOJ+6K3kH4/U425xnQH3fKBuqtpvWpj9Er8Aw=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "0e4804010d87a4089e8fd59af5d0b61ba6a572ff20f9f55b1caa904af861f030"
14
+ "content": "84a3ad58be73c7b2c75a1b15252e557644c80bf66e6484781107300b6b0aec91"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-aarch64-pc-windows-msvc",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "5f4ce40b9f76cfaa1fdc25ba8ce765cc3fd7fc0b38bbe10ce8a5b3ba5b0dcc1a",
19
+ "artifactSha256": "d3f8633e9c7014a9163666c20dcd016f64b362e575ffb26afa9e8f51393cc8ba",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-arm64-msvc.node.sbom.json",
23
- "sha256": "f054e6818584024d2f3acb36f2ebfa044546d72d203ecf06b758bfb4c2a8dcfc"
23
+ "sha256": "cb8c0c1f6567d471967a019e14fd7834b359c8a423626129bb8b01d404df9f5d"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "i9Ts/DMWmNUhyq+YNId6aNr4Y+5GGr8CPIe0fXqtBLcXoqGlxgxq83PMgvnFX0fG0pa8MI+Fv7fbamFQ4/SWBg=="
36
+ "value": "R9tg5e4kK1p1AOy5RPA/HvLo5GwymlNQsCDMiGePRFZVetj8GumU1QAjBxF+B/yYCvaMa0YmuKCRrbpI4raNBQ=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "5f4ce40b9f76cfaa1fdc25ba8ce765cc3fd7fc0b38bbe10ce8a5b3ba5b0dcc1a"
14
+ "content": "d3f8633e9c7014a9163666c20dcd016f64b362e575ffb26afa9e8f51393cc8ba"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
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.3",
4
- "engineVersion": "5.3.3",
5
- "buildId": "1-5.3.3-x86_64-pc-windows-msvc",
3
+ "cliVersion": "5.3.4",
4
+ "engineVersion": "5.3.4",
5
+ "buildId": "1-5.3.4-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": "5da0cd500b980f5a7295886298ea9176905bc38190fee2a7eae3359ec59513e9",
19
+ "artifactSha256": "a1ffe9cf1c0fa69ad29543b70dc3e6af72993f4ac3b770b5ed8f1794b5082020",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-x64-msvc.node.sbom.json",
23
- "sha256": "a8f35671f2c924ba92ed04e0a9513262c9005451c04423c11e13a9d8371164bc"
23
+ "sha256": "76c83934b4a0fb50e59919c6d27723a395f5387af0c467674f5eeb0bb328a3a3"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "30eda7a2ba11647e835b0079c526bed77f189c8e",
27
+ "sourceCommit": "7f78cd615083c4284cab36c05f11dc2ce76e5cbd",
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": "yN+zsORULiFYmazE/LZm1vp2+Nd3NpEqE/1IKcjW3OHz/Nqk9jN1Hj1CR78aDGcJHiMSMobSiBdCviN9dvM4CA=="
36
+ "value": "/yNziQ2dBYLR9Qg13plc/CanSa9RXWtBP8E8TDNsJYuZ+jLV1dnHksyG0zlVrGw/guegmsNe/LRC6fREdCFMCA=="
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.3",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.4",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.3",
10
+ "version": "5.3.4",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "5da0cd500b980f5a7295886298ea9176905bc38190fee2a7eae3359ec59513e9"
14
+ "content": "a1ffe9cf1c0fa69ad29543b70dc3e6af72993f4ac3b770b5ed8f1794b5082020"
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.3",
1109
+ "ref": "pkg:cargo/planu-core@5.3.4",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -2,6 +2,7 @@
2
2
  // Closes the SPEC-630 residue: every new spec is born unified, never written as a
3
3
  // two-file spec.md + technical.md pair only to be merged on the next list_specs run.
4
4
  import { stripFrontmatter } from '../frontmatter-parser.js';
5
+ import { extractAcceptanceCriteriaTexts } from './acceptance-criteria.js';
5
6
  const REQUIRED_SECTIONS = [
6
7
  'Problem',
7
8
  'Goal',
@@ -254,18 +255,41 @@ function firstSentence(text) {
254
255
  .find((part) => part.length > 0 && !part.startsWith('#'));
255
256
  return sentence ?? null;
256
257
  }
257
- function extractExecutableCriteria(source, criteria) {
258
- const explicit = /\bGIVEN\b[\s\S]*?(?=(?:\n##|\bFILES:|\bFUNCTIONS:|\bTEST:|$))/i
259
- .exec(source)?.[0]
260
- ?.trim()
261
- .replace(/[.\s]+$/, '.');
262
- if (explicit) {
263
- return `- ${explicit}`;
264
- }
258
+ function fallbackCriteriaBullets(criteria) {
265
259
  return criteria
266
260
  .map((criterion) => `- GIVEN the requested change is implemented WHEN the behavior is exercised THEN ${criterion.text}`)
267
261
  .join('\n');
268
262
  }
263
+ // Same BDD step vocabulary `acceptance-criteria.ts` recognizes (English + Spanish).
264
+ // A criterion already starting with one of these is a genuine BDD fragment
265
+ // (a full GIVEN/WHEN/THEN block, or an AND continuation of one) — leave it as-is.
266
+ const BDD_STEP_START = /^(GIVEN|WHEN|THEN|AND|DADO|CUANDO|ENTONCES|Y)\b/i;
267
+ /**
268
+ * Render one real criterion as an executable bullet. Criteria already
269
+ * written in BDD form pass through untouched; plain-text criteria (e.g.
270
+ * checkbox items) are wrapped in the same GIVEN/WHEN/THEN scaffold
271
+ * `fallbackCriteriaBullets` uses, so every bullet stays BDD-executable
272
+ * without ever discarding a real criterion.
273
+ */
274
+ function toExecutableBullet(text) {
275
+ const cleaned = text.trim().replace(/[.\s]+$/, '.');
276
+ if (BDD_STEP_START.test(cleaned)) {
277
+ return `- ${cleaned}`;
278
+ }
279
+ return `- GIVEN the requested change is implemented WHEN the behavior is exercised THEN ${cleaned}`;
280
+ }
281
+ /**
282
+ * Criteria resolve through the canonical parser in `acceptance-criteria.ts`
283
+ * so the renderer and `readiness-checker.ts` can never disagree about how
284
+ * many criteria a spec has.
285
+ */
286
+ function extractExecutableCriteria(source, criteria) {
287
+ const parsed = extractAcceptanceCriteriaTexts(source);
288
+ if (parsed.length === 0) {
289
+ return fallbackCriteriaBullets(criteria);
290
+ }
291
+ return parsed.map(toExecutableBullet).join('\n');
292
+ }
269
293
  function renderOwnedFiles(files) {
270
294
  const sections = [];
271
295
  for (const [title, entries] of [
@@ -22,9 +22,11 @@ export class FallbackGenerator {
22
22
  method: 'deterministic',
23
23
  generatedAt: new Date().toISOString(),
24
24
  },
25
- qualityWarnings: [
26
- 'Fallback generator used. Source description was preserved; missing decisions require explicit user input.',
27
- ],
25
+ // SPEC-1406 (DEFECT 4, round 2): this generator is the only one wired into
26
+ // production (create-spec.ts:1430), so this warning fired unconditionally on
27
+ // every spec ever created — a warning with 100% incidence and no gate consumer
28
+ // carries no signal. Only qualityWarnings from actual quality issues remain.
29
+ qualityWarnings: [],
28
30
  fallbackReason: 'No external model generator is configured for create_spec.',
29
31
  });
30
32
  }
@@ -1,3 +1,9 @@
1
- import type { GenericSpecOutputGateResult } from '../../types/index.js';
1
+ import type { GenericSpecOutputGateResult, GenericSpecOutputIssueKind } from '../../types/index.js';
2
+ /**
3
+ * SPEC-1406 (DEFECT 2 fix): the constant kind reused to mark structural-interpolation
4
+ * findings so callers can tell them apart from the other generic-output issue kinds and
5
+ * decide, per call site, whether that finding blocks or only warns.
6
+ */
7
+ export declare const STRUCTURAL_INTERPOLATION_KIND: GenericSpecOutputIssueKind;
2
8
  export declare function checkGenericSpecOutput(content: string): GenericSpecOutputGateResult;
3
9
  //# sourceMappingURL=generic-output-gate.d.ts.map