Merge branch 'next' into fix/2116-surface-bare-require
This commit is contained in:
@@ -155,7 +155,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "8797c0c7da927c8e",
|
||||
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
|
||||
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
|
||||
@@ -203,7 +203,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "22f5466085c47c00",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "3ecffffe78021e0a",
|
||||
"gsd-core/workflows/audit-milestone.md": "77089ccd7b45c0f0",
|
||||
"gsd-core/workflows/audit-milestone.md": "280cd85908dd45cb",
|
||||
"gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4",
|
||||
"gsd-core/workflows/autonomous.md": "603ce2019835f00e",
|
||||
"gsd-core/workflows/check-todos.md": "5a62092df800ad7c",
|
||||
@@ -308,7 +308,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "d8e92b0b7214eba6",
|
||||
"gsd-core/workflows/undo.md": "6ab639d1fc7e0721",
|
||||
"gsd-core/workflows/update.md": "2c58df5e21c41c31",
|
||||
"gsd-core/workflows/validate-phase.md": "6c0ab739d15709fa",
|
||||
"gsd-core/workflows/validate-phase.md": "ae3f0180a2316fcd",
|
||||
"gsd-core/workflows/verify-phase.md": "0eefbb6bb1b0bed6",
|
||||
"gsd-core/workflows/verify-work.md": "59276d94999ee022",
|
||||
"hooks/gsd-check-update-worker.js": "fa301e6366270d5f",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "6866ce260980c21e",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "fd160e13f8b7e83c",
|
||||
"gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "22f18492581f1da5",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9",
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "d8f0fe8dba3bb28a",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -273,7 +273,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "3503f52a7356caf0",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "816c71b0ef2d8c1d",
|
||||
"gsd-core/workflows/audit-milestone.md": "a35795246b955bdb",
|
||||
"gsd-core/workflows/audit-milestone.md": "ae8605b4ecc37c0b",
|
||||
"gsd-core/workflows/audit-uat.md": "1c4a02a8c1ab930f",
|
||||
"gsd-core/workflows/autonomous.md": "6adf957e64518d15",
|
||||
"gsd-core/workflows/check-todos.md": "8f2c6b27f18cc5e2",
|
||||
@@ -378,7 +378,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "b926ba7e4de0c76d",
|
||||
"gsd-core/workflows/undo.md": "d759702f84e308fa",
|
||||
"gsd-core/workflows/update.md": "2a59b4edf4a3c8c7",
|
||||
"gsd-core/workflows/validate-phase.md": "83eeefeeca31c2b5",
|
||||
"gsd-core/workflows/validate-phase.md": "3150904744b4a1bd",
|
||||
"gsd-core/workflows/verify-phase.md": "6ae6f159be75dcdd",
|
||||
"gsd-core/workflows/verify-work.md": "de14acdc8e925338",
|
||||
"hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3",
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "d8f0fe8dba3bb28a",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -202,7 +202,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "a898d99b8d844215",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "722397c04272dfaa",
|
||||
"gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589",
|
||||
@@ -307,7 +307,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "328664400a001fd5",
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "f9e7d8a760d0d3c8",
|
||||
"gsd-core/workflows/validate-phase.md": "2ac231dc541441c2",
|
||||
"gsd-core/workflows/validate-phase.md": "7a3db6ab8ce9f380",
|
||||
"gsd-core/workflows/verify-phase.md": "e0957e153788a222",
|
||||
"gsd-core/workflows/verify-work.md": "c8ffee621e7319de",
|
||||
"hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3",
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "c9fea2d8afa17d80",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -206,7 +206,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "5159c6bdf102f74b",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "9bb427cd3b4075d5",
|
||||
"gsd-core/workflows/audit-milestone.md": "2266710d0ae48932",
|
||||
"gsd-core/workflows/audit-milestone.md": "202b726748604c93",
|
||||
"gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f",
|
||||
"gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c",
|
||||
"gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde",
|
||||
@@ -311,7 +311,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "ceff456b1e9d94d8",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "165beec33490bd28",
|
||||
"gsd-core/workflows/validate-phase.md": "5b4ae14c87859bd2",
|
||||
"gsd-core/workflows/validate-phase.md": "706627c190ae11aa",
|
||||
"gsd-core/workflows/verify-phase.md": "a4f918c92c927268",
|
||||
"gsd-core/workflows/verify-work.md": "3fb282f2bce34a79",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "6866ce260980c21e",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "5ff1f77222977648",
|
||||
"gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "22f18492581f1da5",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd",
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "59a3d4f6c4afbfc9",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "e3ca8ebb8d7e2cd0",
|
||||
"gsd-core/templates/VALIDATION.md": "dae6246879d09d13",
|
||||
"gsd-core/templates/claude-md.md": "dd1a9011684f9753",
|
||||
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
|
||||
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
|
||||
@@ -309,7 +309,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "1dfa15d8f28c022d",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "46edd152d8b63bfc",
|
||||
"gsd-core/workflows/audit-milestone.md": "5f362cead97ceaca",
|
||||
"gsd-core/workflows/audit-uat.md": "2564078edb15b5e9",
|
||||
"gsd-core/workflows/autonomous.md": "92f08626d4aea668",
|
||||
"gsd-core/workflows/check-todos.md": "b2b103e8638e760a",
|
||||
@@ -414,7 +414,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0bafc2af27be4591",
|
||||
"gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5",
|
||||
"gsd-core/workflows/update.md": "5c35c0ec0f462ea6",
|
||||
"gsd-core/workflows/validate-phase.md": "020201a41049679f",
|
||||
"gsd-core/workflows/validate-phase.md": "6d6d10fe53f6b1d0",
|
||||
"gsd-core/workflows/verify-phase.md": "2e12c3cb97a9122a",
|
||||
"gsd-core/workflows/verify-work.md": "5b348e73fc0d0829",
|
||||
"hooks/gsd-check-update.js": "ef48957eb6ac6a10",
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "f436ae75a9c8518a",
|
||||
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
|
||||
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
|
||||
@@ -204,7 +204,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "ef0c2474cee76b00",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "9fdfe8a7fbcd1417",
|
||||
"gsd-core/workflows/audit-milestone.md": "19e03e6d34d96f38",
|
||||
"gsd-core/workflows/audit-milestone.md": "258e4dfd259ab13f",
|
||||
"gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933",
|
||||
"gsd-core/workflows/autonomous.md": "dd972ddde9663295",
|
||||
"gsd-core/workflows/check-todos.md": "be9b50b5f28d7504",
|
||||
@@ -309,7 +309,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "7217c34dc9eaf7bb",
|
||||
"gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd",
|
||||
"gsd-core/workflows/update.md": "f444a7cfcd246cfb",
|
||||
"gsd-core/workflows/validate-phase.md": "2f705775a4b76d42",
|
||||
"gsd-core/workflows/validate-phase.md": "e7aa423ebdd6a230",
|
||||
"gsd-core/workflows/verify-phase.md": "5c72780e34214e27",
|
||||
"gsd-core/workflows/verify-work.md": "c966971a3cbd1d71",
|
||||
"hooks/gsd-session.json": "3382597f61e3a559",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "d6d7da8b7817a04c",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "b79f320d59a68773",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce",
|
||||
"gsd-core/workflows/check-todos.md": "1a67337d1630848f",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "466e01d65c350ef6",
|
||||
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
|
||||
"gsd-core/workflows/update.md": "23e294ba707c3580",
|
||||
"gsd-core/workflows/validate-phase.md": "2df0c6e298a5f249",
|
||||
"gsd-core/workflows/validate-phase.md": "d03a94b7b807be12",
|
||||
"gsd-core/workflows/verify-phase.md": "e0957e153788a222",
|
||||
"gsd-core/workflows/verify-work.md": "e7e7e900c4874490",
|
||||
"hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f",
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "7c778398f79e25a3",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -203,7 +203,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "ddab2912d025db65",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "2eee4a0be82ef951",
|
||||
"gsd-core/workflows/audit-milestone.md": "806d346ee5bfe9f8",
|
||||
"gsd-core/workflows/audit-milestone.md": "690289689e9eda7a",
|
||||
"gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad",
|
||||
"gsd-core/workflows/autonomous.md": "dd572ca89862e5ec",
|
||||
"gsd-core/workflows/check-todos.md": "ea9a303c48a5d752",
|
||||
@@ -308,7 +308,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0d103bf2622436f7",
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "7499bb4cb2a3ce6f",
|
||||
"gsd-core/workflows/validate-phase.md": "75e8971d3981d06b",
|
||||
"gsd-core/workflows/validate-phase.md": "88edc724568337d3",
|
||||
"gsd-core/workflows/verify-phase.md": "5c8d1305b47fbef4",
|
||||
"gsd-core/workflows/verify-work.md": "7a9c9541d2d73fdc",
|
||||
"hooks/gsd-check-update-worker.js": "7989cc2bedd1138d",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "f35856254768bf7d",
|
||||
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
|
||||
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "c85c6afdc64f0da6",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8",
|
||||
"gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710",
|
||||
"gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405",
|
||||
"gsd-core/workflows/autonomous.md": "73f429f7472c9949",
|
||||
"gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "29245758b8497fa0",
|
||||
"gsd-core/workflows/undo.md": "7cd2153f8b15e30d",
|
||||
"gsd-core/workflows/update.md": "07dc2fba78ad1865",
|
||||
"gsd-core/workflows/validate-phase.md": "557e3251e3b9349a",
|
||||
"gsd-core/workflows/validate-phase.md": "52b9fa8a9533b444",
|
||||
"gsd-core/workflows/verify-phase.md": "e0957e153788a222",
|
||||
"gsd-core/workflows/verify-work.md": "9fc717845828c6e3",
|
||||
"kilo.json": "13151e97ff23c1aa",
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -267,7 +267,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "6866ce260980c21e",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
@@ -372,7 +372,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "6718e0632bba26ca",
|
||||
"gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "22f18492581f1da5",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "a4f5e38984001194",
|
||||
"gsd-core/templates/codebase/architecture.md": "282db635ba093b1a",
|
||||
"gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "90e5f97018715b18",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "2871c5d0a4b671fa",
|
||||
"gsd-core/workflows/audit-milestone.md": "7aa0db364a4b67e2",
|
||||
"gsd-core/workflows/audit-milestone.md": "8bd0b730de08d1a8",
|
||||
"gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b",
|
||||
"gsd-core/workflows/autonomous.md": "6cb0c014f5f56965",
|
||||
"gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "f4bad8de3fdb49fa",
|
||||
"gsd-core/workflows/undo.md": "0bba5e7f6196c894",
|
||||
"gsd-core/workflows/update.md": "71b6cd852f38b4bc",
|
||||
"gsd-core/workflows/validate-phase.md": "abcdbc1b56780565",
|
||||
"gsd-core/workflows/validate-phase.md": "434d9927c65f2bba",
|
||||
"gsd-core/workflows/verify-phase.md": "126be1d026900102",
|
||||
"gsd-core/workflows/verify-work.md": "ae07b3fa8b6f864e",
|
||||
"hooks/gsd-check-update-worker.js": "385fb7c67810baf6",
|
||||
|
||||
6
tests/fixtures/golden-install-parity/pi.json
vendored
6
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -122,7 +122,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -170,7 +170,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "6866ce260980c21e",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
@@ -275,7 +275,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "7e69d278375a2493",
|
||||
"gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "22f18492581f1da5",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"hooks/gsd-check-update-worker.js": "55376b5b9335a580",
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "ec5972ab31c0f5d0",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -203,7 +203,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "afdc7c15f03a95fc",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "aaa1b74e001322b6",
|
||||
"gsd-core/workflows/audit-milestone.md": "b7617cf590d92a56",
|
||||
"gsd-core/workflows/audit-milestone.md": "78dbc1e8c4499d7d",
|
||||
"gsd-core/workflows/audit-uat.md": "97d441d07e7972b3",
|
||||
"gsd-core/workflows/autonomous.md": "3014ff90115f0daf",
|
||||
"gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1",
|
||||
@@ -308,7 +308,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "49921383982474e0",
|
||||
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
|
||||
"gsd-core/workflows/update.md": "b34cb866152d4de3",
|
||||
"gsd-core/workflows/validate-phase.md": "e989cbaa4228564c",
|
||||
"gsd-core/workflows/validate-phase.md": "dfb9bd178ee1b67b",
|
||||
"gsd-core/workflows/verify-phase.md": "0dc52b9e629a5f5a",
|
||||
"gsd-core/workflows/verify-work.md": "3355ddc14f052fff",
|
||||
"hooks/gsd-check-update-worker.js": "4bb354044e0dff91",
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "17217a07ab8a6485",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -203,7 +203,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "d469eb120e52de0f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "76607add3257cb37",
|
||||
"gsd-core/workflows/audit-milestone.md": "a379eda51d821bce",
|
||||
"gsd-core/workflows/audit-milestone.md": "ebec95af8f68f2ed",
|
||||
"gsd-core/workflows/audit-uat.md": "6e768b1c208a787a",
|
||||
"gsd-core/workflows/autonomous.md": "c482645c5d1ead46",
|
||||
"gsd-core/workflows/check-todos.md": "0dda8236355e8c9c",
|
||||
@@ -308,7 +308,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "77b58ef8af5209bd",
|
||||
"gsd-core/workflows/undo.md": "59b8baa54efc4110",
|
||||
"gsd-core/workflows/update.md": "1f935251fca1f276",
|
||||
"gsd-core/workflows/validate-phase.md": "1c0ebe56d96a14d1",
|
||||
"gsd-core/workflows/validate-phase.md": "58fd1a0a679d7115",
|
||||
"gsd-core/workflows/verify-phase.md": "a151ed36eb51813b",
|
||||
"gsd-core/workflows/verify-work.md": "dde2a42a56c27c4e",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "68d32d1fea14e184",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6144951011cdca57",
|
||||
"gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3",
|
||||
"gsd-core/templates/claude-md.md": "20be2a0201ab92cd",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -203,7 +203,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "8948988717506320",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c",
|
||||
"gsd-core/workflows/audit-fix.md": "aa052e15623d759d",
|
||||
"gsd-core/workflows/audit-milestone.md": "ac2238ea6c11ae9e",
|
||||
"gsd-core/workflows/audit-milestone.md": "868db5a8f5d55040",
|
||||
"gsd-core/workflows/audit-uat.md": "d496e39402e160de",
|
||||
"gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2",
|
||||
"gsd-core/workflows/check-todos.md": "afc840fceb07bf99",
|
||||
@@ -308,7 +308,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "53b77a8edf60acd0",
|
||||
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
|
||||
"gsd-core/workflows/update.md": "79aaf4b8f1f83045",
|
||||
"gsd-core/workflows/validate-phase.md": "2db47bf5547d7b9d",
|
||||
"gsd-core/workflows/validate-phase.md": "bf16fd7ff71286b2",
|
||||
"gsd-core/workflows/verify-phase.md": "f961cdb3ef03ff05",
|
||||
"gsd-core/workflows/verify-work.md": "cce8ae44b30957f1",
|
||||
"hooks/gsd-windsurf-pre-command.js": "7467a8a63e354aad",
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
@@ -274,7 +274,7 @@
|
||||
"gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575",
|
||||
"gsd-core/workflows/audit-milestone.md": "6866ce260980c21e",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc",
|
||||
@@ -379,7 +379,7 @@
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
|
||||
"gsd-core/workflows/update.md": "dc580dee13f881a6",
|
||||
"gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa",
|
||||
"gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607",
|
||||
"gsd-core/workflows/verify-phase.md": "22f18492581f1da5",
|
||||
"gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// allow-test-rule: runtime-contract-is-the-product — asserts GSD workflow/template markdown prose, the executable contract (#138, #2117)
|
||||
'use strict';
|
||||
|
||||
// Policy regression test for issue #138:
|
||||
@@ -67,3 +68,59 @@ test('legacy Nyquist config helper still detects unsafe direct reads', () => {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
// Issue #2117: audit-milestone could not distinguish a not-yet-validated phase
|
||||
// from a validated-but-failing one — both read Nyquist PARTIAL. The fix makes the
|
||||
// dead `status` field live (validate-phase §6 promotes draft → validated) and has
|
||||
// audit-milestone §5.5 bucket `status: draft` as a distinct NOT-VALIDATED state.
|
||||
// These assertions fail-first if either half of that two-workflow contract is
|
||||
// reverted, silently re-collapsing "not validated" and "validation failed".
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
test('#2117 validate-phase.md promotes status: draft → validated when it reconciles VALIDATION.md', () => {
|
||||
const content = readWorkflow('validate-phase.md');
|
||||
// Both the create (State B) and update (State A) paths in §6 must set the
|
||||
// terminal marker, otherwise `status` stays `draft` for the life of the file
|
||||
// and audit-milestone cannot tell an unvalidated phase from a failing one.
|
||||
const occurrences = content.match(/status: validated/g) || [];
|
||||
assert.ok(
|
||||
occurrences.length >= 2,
|
||||
'validate-phase.md must set `status: validated` in both the create (State B) and update (State A) VALIDATION.md paths',
|
||||
);
|
||||
});
|
||||
|
||||
test('#2117 audit-milestone.md buckets status: draft as NOT-VALIDATED, never PARTIAL', () => {
|
||||
const content = readWorkflow('audit-milestone.md');
|
||||
assert.ok(
|
||||
content.includes('`status`'),
|
||||
'audit-milestone.md must parse the `status` frontmatter field to detect not-yet-validated phases',
|
||||
);
|
||||
assert.ok(
|
||||
content.includes('| NOT-VALIDATED | `status: draft`'),
|
||||
'audit-milestone.md must define a NOT-VALIDATED bucket keyed on `status: draft`',
|
||||
);
|
||||
assert.ok(
|
||||
content.includes('| COMPLIANT | `status: validated`'),
|
||||
'COMPLIANT must require `status: validated` so a draft file can never be scored compliant',
|
||||
);
|
||||
assert.ok(
|
||||
content.includes('| PARTIAL | `status: validated`'),
|
||||
'PARTIAL must require `status: validated`; a `status: draft` file is NOT-VALIDATED, not PARTIAL',
|
||||
);
|
||||
assert.ok(
|
||||
content.includes('not_validated_phases'),
|
||||
'audit-milestone.md must report not_validated_phases in the nyquist audit YAML aggregate',
|
||||
);
|
||||
});
|
||||
|
||||
test('#2117 VALIDATION.md template seeds status: draft (the pre-validation state)', () => {
|
||||
const template = fs.readFileSync(
|
||||
path.join(__dirname, '..', 'gsd-core', 'templates', 'VALIDATION.md'),
|
||||
'utf8',
|
||||
);
|
||||
assert.ok(
|
||||
/^status: draft$/m.test(template),
|
||||
'VALIDATION.md template must seed `status: draft`; validate-phase promotes it to validated',
|
||||
);
|
||||
});
|
||||
|
||||
90
tests/security-dead-exports.regression.test.cjs
Normal file
90
tests/security-dead-exports.regression.test.cjs
Normal file
@@ -0,0 +1,90 @@
|
||||
/**
|
||||
* Regression test for #2198 — advertised base64/entropy/homoglyph scanning
|
||||
* never runs live. `scanEntropyAnomalies` + `shannonEntropy` were dead exports
|
||||
* (zero callers outside their own unit tests). The live hooks inline their
|
||||
* own pattern subsets "for hook independence" and never call these functions.
|
||||
*
|
||||
* This test asserts the chosen contract: the dead export was removed and the
|
||||
* docs no longer over-claim entropy analysis as a live MUST.
|
||||
*
|
||||
* Contract: `scanForInjection` is retained — it serves as the CI codebase
|
||||
* scanner engine (tests/prompt-injection-scan.security.test.cjs). It is NOT
|
||||
* called from live hooks; hooks inline their own patterns.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const { describe, test } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const PROJECT_ROOT = path.join(__dirname, '..');
|
||||
|
||||
describe('#2198 regression: dead scan exports removed, docs corrected', () => {
|
||||
test('scanEntropyAnomalies is no longer exported from security.cjs', () => {
|
||||
const security = require('../gsd-core/bin/lib/security.cjs');
|
||||
assert.equal(
|
||||
security.scanEntropyAnomalies,
|
||||
undefined,
|
||||
'scanEntropyAnomalies should have been removed as a dead export (#2198)'
|
||||
);
|
||||
});
|
||||
|
||||
test('shannonEntropy is not accessible from the security module', () => {
|
||||
const security = require('../gsd-core/bin/lib/security.cjs');
|
||||
assert.equal(
|
||||
security.shannonEntropy,
|
||||
undefined,
|
||||
'shannonEntropy was the private helper for the removed scanEntropyAnomalies'
|
||||
);
|
||||
});
|
||||
|
||||
test('scanForInjection is retained (CI codebase scanner uses it)', () => {
|
||||
const security = require('../gsd-core/bin/lib/security.cjs');
|
||||
assert.equal(
|
||||
typeof security.scanForInjection,
|
||||
'function',
|
||||
'scanForInjection is retained: it serves as the CI codebase scanner engine'
|
||||
);
|
||||
});
|
||||
|
||||
test('FEATURES.md does not over-claim entropy analysis as a live MUST', () => {
|
||||
const features = fs.readFileSync(
|
||||
path.join(PROJECT_ROOT, 'docs', 'FEATURES.md'),
|
||||
'utf-8'
|
||||
);
|
||||
assert.ok(
|
||||
!features.includes('REQ-SCAN-INJ-03: Scanner MUST apply entropy analysis'),
|
||||
'REQ-SCAN-INJ-03 should not claim entropy analysis runs as a live MUST — ' +
|
||||
'the implementation was dead code (#2198)'
|
||||
);
|
||||
});
|
||||
|
||||
test('FEATURES.md documents that base64-decode is CI-only, not live', () => {
|
||||
const features = fs.readFileSync(
|
||||
path.join(PROJECT_ROOT, 'docs', 'FEATURES.md'),
|
||||
'utf-8'
|
||||
);
|
||||
assert.ok(
|
||||
features.includes('CI-time control'),
|
||||
'FEATURES.md should note base64-decode is a CI-time control, not a live hook (#2198)'
|
||||
);
|
||||
});
|
||||
|
||||
test('live hooks inline patterns independently (do not import security.cjs)', () => {
|
||||
const hookFiles = [
|
||||
'hooks/gsd-prompt-guard.js',
|
||||
'hooks/gsd-read-injection-scanner.js',
|
||||
];
|
||||
|
||||
for (const relPath of hookFiles) {
|
||||
const fullPath = path.join(PROJECT_ROOT, relPath);
|
||||
const source = fs.readFileSync(fullPath, 'utf-8');
|
||||
assert.ok(
|
||||
!source.match(/require\s*\(\s*['"][^'"]*security\.(cjs|js)['"]\s*\)/) &&
|
||||
!source.match(/import\s+.*from\s+['"][^'"]*security\.(cjs|js)['"]\s*;?/),
|
||||
`${relPath} must not require/import security.cjs — hooks inline patterns for independence`
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -21,7 +21,6 @@ const {
|
||||
validateFieldName,
|
||||
validateShellArg,
|
||||
validatePromptStructure,
|
||||
scanEntropyAnomalies,
|
||||
} = require('../gsd-core/bin/lib/security.cjs');
|
||||
|
||||
// ─── Path Traversal Prevention ──────────────────────────────────────────────
|
||||
@@ -765,79 +764,8 @@ describe('validatePromptStructure', () => {
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Layer 4: Paragraph-Level Entropy Anomaly Detection ─────────────────────
|
||||
|
||||
describe('scanEntropyAnomalies', () => {
|
||||
test('is exported from security.cjs', () => {
|
||||
assert.equal(typeof scanEntropyAnomalies, 'function');
|
||||
});
|
||||
|
||||
test('returns { clean, findings } shape', () => {
|
||||
const result = scanEntropyAnomalies('Normal text here.');
|
||||
assert.ok(typeof result.clean === 'boolean');
|
||||
assert.ok(Array.isArray(result.findings));
|
||||
});
|
||||
|
||||
test('clean natural language text passes', () => {
|
||||
const text = [
|
||||
'Build an authentication system with JWT tokens.',
|
||||
'',
|
||||
'The system should support login, logout, and token refresh.',
|
||||
].join('\n');
|
||||
const result = scanEntropyAnomalies(text);
|
||||
assert.ok(result.clean, `Expected clean but got: ${result.findings.join(', ')}`);
|
||||
});
|
||||
|
||||
test('detects high-entropy paragraph (random-character content)', () => {
|
||||
// A string cycling through 90 distinct chars has entropy ~6.4 bits/char, well above 5.5 threshold
|
||||
const highEntropyPara = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=!@#$%^&*()_-[]{}|;:,.<>?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr';
|
||||
const result = scanEntropyAnomalies(highEntropyPara);
|
||||
assert.ok(!result.clean, 'should detect high-entropy paragraph');
|
||||
assert.ok(
|
||||
result.findings.some(f => f.includes('High-entropy paragraph')),
|
||||
'finding should mention high-entropy paragraph'
|
||||
);
|
||||
});
|
||||
|
||||
test('finding includes entropy value in bits/char', () => {
|
||||
const highEntropyPara = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=!@#$%^&*()_-[]{}|;:,.<>?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr';
|
||||
const result = scanEntropyAnomalies(highEntropyPara);
|
||||
assert.ok(result.findings.some(f => f.includes('bits/char')));
|
||||
});
|
||||
|
||||
test('skips paragraphs shorter than or equal to 50 chars', () => {
|
||||
// Even a high-entropy short paragraph should not be flagged
|
||||
const shortPara = 'SGVsbG8gV29ybGQ='; // 16 chars — under 50
|
||||
const result = scanEntropyAnomalies(shortPara);
|
||||
assert.ok(result.clean, 'short paragraphs should be skipped');
|
||||
});
|
||||
|
||||
test('handles empty text gracefully', () => {
|
||||
const result = scanEntropyAnomalies('');
|
||||
assert.ok(result.clean);
|
||||
assert.equal(result.findings.length, 0);
|
||||
});
|
||||
|
||||
test('handles null gracefully', () => {
|
||||
const result = scanEntropyAnomalies(null);
|
||||
assert.ok(result.clean);
|
||||
assert.equal(result.findings.length, 0);
|
||||
});
|
||||
|
||||
test('multiple paragraphs — flags only high-entropy ones', () => {
|
||||
const highEntropyPara = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=!@#$%^&*()_-[]{}|;:,.<>?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr';
|
||||
const text = [
|
||||
'This is a perfectly normal English sentence describing a feature.',
|
||||
'',
|
||||
highEntropyPara,
|
||||
'',
|
||||
'Another clean sentence about the authentication requirements.',
|
||||
].join('\n');
|
||||
const result = scanEntropyAnomalies(text);
|
||||
assert.ok(!result.clean);
|
||||
assert.equal(result.findings.length, 1, 'only 1 high-entropy paragraph should be flagged');
|
||||
});
|
||||
});
|
||||
// NOTE (#2198): scanEntropyAnomalies test block removed — the function was a
|
||||
// dead export (zero production callers) and has been deleted from security.cts.
|
||||
|
||||
|
||||
// ────────────────────────────────────────────────────────────────────────
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"ai-integration-phase.md": 14805,
|
||||
"analyze-dependencies.md": 3887,
|
||||
"audit-fix.md": 11717,
|
||||
"audit-milestone.md": 17681,
|
||||
"audit-milestone.md": 18448,
|
||||
"audit-uat.md": 7469,
|
||||
"autonomous.md": 42474,
|
||||
"check-todos.md": 9475,
|
||||
@@ -87,7 +87,7 @@
|
||||
"ultraplan-phase.md": 10512,
|
||||
"undo.md": 10431,
|
||||
"update.md": 20914,
|
||||
"validate-phase.md": 10789,
|
||||
"validate-phase.md": 10849,
|
||||
"verify-phase.md": 40923,
|
||||
"verify-work.md": 40247
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user