@renoxar/koolie 1.25.0

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 (693) hide show
  1. package/.gitattributes +16 -0
  2. package/.gitignore +51 -0
  3. package/.koolie/QUELLREPOSITORIUM.md +18 -0
  4. package/.koolie/core/CHANGELOG.md +11832 -0
  5. package/.koolie/core/LICENSE +674 -0
  6. package/.koolie/core/LICENSE-HINWEIS.md +98 -0
  7. package/.koolie/core/OWNERS.md +36 -0
  8. package/.koolie/core/VERSION +1 -0
  9. package/.koolie/core/banner.py +397 -0
  10. package/.koolie/core/build/README.md +34 -0
  11. package/.koolie/core/build/assemble.py +354 -0
  12. package/.koolie/core/build/build-docx.py +194 -0
  13. package/.koolie/core/build/doc/00-kopf.md +18 -0
  14. package/.koolie/core/build/doc/01-executive-summary.md +24 -0
  15. package/.koolie/core/build/doc/02-zielbild.md +13 -0
  16. package/.koolie/core/build/doc/03-ziele-nichtziele.md +28 -0
  17. package/.koolie/core/build/doc/04-geltungsbereich.md +25 -0
  18. package/.koolie/core/build/doc/05-glossar.md +47 -0
  19. package/.koolie/core/build/doc/06-leitprinzipien.md +5 -0
  20. package/.koolie/core/build/doc/07-architektur.md +60 -0
  21. package/.koolie/core/build/doc/07a-abbildungsschicht.md +66 -0
  22. package/.koolie/core/build/doc/08-trennung.md +24 -0
  23. package/.koolie/core/build/doc/09-betriebsmodi.md +18 -0
  24. package/.koolie/core/build/doc/10-arbeitsablauf.md +5 -0
  25. package/.koolie/core/build/doc/11-datenschutz.md +5 -0
  26. package/.koolie/core/build/doc/12-sicherheit.md +5 -0
  27. package/.koolie/core/build/doc/13-risiko.md +5 -0
  28. package/.koolie/core/build/doc/14-rollen.md +9 -0
  29. package/.koolie/core/build/doc/15-referenzstruktur.md +124 -0
  30. package/.koolie/core/build/doc/16-agentenanweisung.md +8 -0
  31. package/.koolie/core/build/doc/17-overlay.md +29 -0
  32. package/.koolie/core/build/doc/18-skill-standard.md +5 -0
  33. package/.koolie/core/build/doc/19-skill-template.md +5 -0
  34. package/.koolie/core/build/doc/20-referenz-skills.md +70 -0
  35. package/.koolie/core/build/doc/21-prompts.md +53 -0
  36. package/.koolie/core/build/doc/22-checklisten.md +49 -0
  37. package/.koolie/core/build/doc/23-entscheidungsbaeume.md +29 -0
  38. package/.koolie/core/build/doc/24-onboarding.md +33 -0
  39. package/.koolie/core/build/doc/25-governance.md +35 -0
  40. package/.koolie/core/build/doc/26-qs-test.md +9 -0
  41. package/.koolie/core/build/doc/27-pilot.md +13 -0
  42. package/.koolie/core/build/doc/28-uebernahme.md +5 -0
  43. package/.koolie/core/build/doc/29-grenzen.md +87 -0
  44. package/.koolie/core/build/doc/30-roadmap.md +5 -0
  45. package/.koolie/core/build/doc/31-anhaenge.md +151 -0
  46. package/.koolie/core/build/doc/32-abschluss.md +92 -0
  47. package/.koolie/core/build/ref-a4.docx +0 -0
  48. package/.koolie/core/checklists/01-preflight.md +54 -0
  49. package/.koolie/core/checklists/02-privacy-context.md +51 -0
  50. package/.koolie/core/checklists/03-before-code-change.md +51 -0
  51. package/.koolie/core/checklists/04-review-ai-code.md +58 -0
  52. package/.koolie/core/checklists/05-testing.md +48 -0
  53. package/.koolie/core/checklists/06-security.md +50 -0
  54. package/.koolie/core/checklists/07-new-dependency.md +57 -0
  55. package/.koolie/core/checklists/08-merge-request.md +47 -0
  56. package/.koolie/core/checklists/09-onboarding.md +52 -0
  57. package/.koolie/core/checklists/10-project-adoption.md +74 -0
  58. package/.koolie/core/checklists/11-framework-release.md +71 -0
  59. package/.koolie/core/checklists/README.md +28 -0
  60. package/.koolie/core/clientmap.py +1358 -0
  61. package/.koolie/core/clients/README.md +113 -0
  62. package/.koolie/core/clients/_template/CLIENT_PACK.md +197 -0
  63. package/.koolie/core/clients/claude-code/CLIENT_PACK.md +383 -0
  64. package/.koolie/core/clients/claude-code/manifest.json +232 -0
  65. package/.koolie/core/clients/claude-code/root-template/.claude/README.md +127 -0
  66. package/.koolie/core/clients/cursor/CLIENT_PACK.md +229 -0
  67. package/.koolie/core/clients/cursor/manifest.json +330 -0
  68. package/.koolie/core/clients/cursor/root-template/.cursor/README.md +36 -0
  69. package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +251 -0
  70. package/.koolie/core/clients/devin-desktop/manifest.json +163 -0
  71. package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +79 -0
  72. package/.koolie/core/clients/kiro/CLIENT_PACK.md +223 -0
  73. package/.koolie/core/clients/kiro/manifest.json +300 -0
  74. package/.koolie/core/clients/kiro/root-template/.kiro/README.md +37 -0
  75. package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +257 -0
  76. package/.koolie/core/clients/openai-codex/manifest.json +208 -0
  77. package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +35 -0
  78. package/.koolie/core/decision-trees/01-context-allowed.md +46 -0
  79. package/.koolie/core/decision-trees/02-may-ai-do-task.md +47 -0
  80. package/.koolie/core/decision-trees/03-analyze-or-modify.md +50 -0
  81. package/.koolie/core/decision-trees/04-required-review.md +49 -0
  82. package/.koolie/core/decision-trees/05-stop-or-escalate.md +47 -0
  83. package/.koolie/core/decision-trees/06-rule-placement.md +58 -0
  84. package/.koolie/core/decision-trees/README.md +14 -0
  85. package/.koolie/core/docs/ADOPTION_GUIDE.md +582 -0
  86. package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +91 -0
  87. package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +79 -0
  88. package/.koolie/core/docs/ROADMAP.md +848 -0
  89. package/.koolie/core/docs/RUNTIME_GLOSSARY.md +113 -0
  90. package/.koolie/core/examples/README.md +11 -0
  91. package/.koolie/core/examples/example-ergebnisbericht.md +31 -0
  92. package/.koolie/core/examples/example-mr-description.md +31 -0
  93. package/.koolie/core/examples/example-overlay-runtime.md +48 -0
  94. package/.koolie/core/framework/core/00-principles.md +93 -0
  95. package/.koolie/core/framework/core/01-governance.md +58 -0
  96. package/.koolie/core/framework/core/02-privacy.md +141 -0
  97. package/.koolie/core/framework/core/03-security.md +86 -0
  98. package/.koolie/core/framework/core/04-quality.md +48 -0
  99. package/.koolie/core/framework/core/05-working-model.md +199 -0
  100. package/.koolie/core/framework/core/06-prompting-rules.md +51 -0
  101. package/.koolie/core/framework/core/07-review-rules.md +52 -0
  102. package/.koolie/core/framework/core/08-skill-conventions.md +115 -0
  103. package/.koolie/core/framework/core/09-risk-model.md +87 -0
  104. package/.koolie/core/framework/core/10-error-escalation.md +53 -0
  105. package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +16 -0
  106. package/.koolie/core/framework/org-policies/README.md +29 -0
  107. package/.koolie/core/framework/overlay-patterns/general/documents/branching-strategy/muster-general.md +43 -0
  108. package/.koolie/core/framework/overlay-patterns/general/documents/coding-guidelines/muster-general.md +82 -0
  109. package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-done/muster-general.md +52 -0
  110. package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-ready/muster-general.md +54 -0
  111. package/.koolie/core/framework/overlay-patterns/general/documents/quality/muster-general.md +59 -0
  112. package/.koolie/core/framework/overlay-patterns/general/documents/security/muster-general.md +52 -0
  113. package/.koolie/core/framework/overlay-patterns/general.md +150 -0
  114. package/.koolie/core/framework/role-packs/README.md +63 -0
  115. package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +58 -0
  116. package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +158 -0
  117. package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +88 -0
  118. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/CHANGELOG.md +10 -0
  119. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/EXAMPLES.md +148 -0
  120. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/SKILL.md +195 -0
  121. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +22 -0
  122. package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +95 -0
  123. package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +26 -0
  124. package/.koolie/core/framework/runtime/agents/fw-reviewer.md +34 -0
  125. package/.koolie/core/framework/runtime/client-settings.json +3 -0
  126. package/.koolie/core/framework/runtime/hooks.json +20 -0
  127. package/.koolie/core/framework/runtime/mcp-config.example.json +4 -0
  128. package/.koolie/core/framework/runtime/permissions.json +106 -0
  129. package/.koolie/core/framework/runtime/root-instruction-local.example.md +19 -0
  130. package/.koolie/core/framework/runtime/root-instruction.md +116 -0
  131. package/.koolie/core/framework/runtime/rules/00-framework-core.md +49 -0
  132. package/.koolie/core/framework/runtime/rules/10-privacy-security.md +49 -0
  133. package/.koolie/core/framework/runtime/rules/15-development-rules.md +41 -0
  134. package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +32 -0
  135. package/.koolie/core/framework/runtime/rules/20-project-overlay.md +60 -0
  136. package/.koolie/core/framework/skills/fw-bugfix-prepare/CHANGELOG.md +14 -0
  137. package/.koolie/core/framework/skills/fw-bugfix-prepare/EXAMPLES.md +57 -0
  138. package/.koolie/core/framework/skills/fw-bugfix-prepare/SKILL.md +177 -0
  139. package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +15 -0
  140. package/.koolie/core/framework/skills/fw-change-analyze/CHANGELOG.md +12 -0
  141. package/.koolie/core/framework/skills/fw-change-analyze/EXAMPLES.md +66 -0
  142. package/.koolie/core/framework/skills/fw-change-analyze/SKILL.md +167 -0
  143. package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +16 -0
  144. package/.koolie/core/framework/skills/fw-change-small/CHANGELOG.md +13 -0
  145. package/.koolie/core/framework/skills/fw-change-small/EXAMPLES.md +68 -0
  146. package/.koolie/core/framework/skills/fw-change-small/SKILL.md +175 -0
  147. package/.koolie/core/framework/skills/fw-change-small/TESTS.md +13 -0
  148. package/.koolie/core/framework/skills/fw-code-explain/CHANGELOG.md +11 -0
  149. package/.koolie/core/framework/skills/fw-code-explain/EXAMPLES.md +61 -0
  150. package/.koolie/core/framework/skills/fw-code-explain/SKILL.md +163 -0
  151. package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +11 -0
  152. package/.koolie/core/framework/skills/fw-docs-update/CHANGELOG.md +10 -0
  153. package/.koolie/core/framework/skills/fw-docs-update/EXAMPLES.md +59 -0
  154. package/.koolie/core/framework/skills/fw-docs-update/SKILL.md +160 -0
  155. package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +12 -0
  156. package/.koolie/core/framework/skills/fw-error-analyze/CHANGELOG.md +10 -0
  157. package/.koolie/core/framework/skills/fw-error-analyze/EXAMPLES.md +67 -0
  158. package/.koolie/core/framework/skills/fw-error-analyze/SKILL.md +160 -0
  159. package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +12 -0
  160. package/.koolie/core/framework/skills/fw-mr-description/CHANGELOG.md +12 -0
  161. package/.koolie/core/framework/skills/fw-mr-description/EXAMPLES.md +69 -0
  162. package/.koolie/core/framework/skills/fw-mr-description/SKILL.md +170 -0
  163. package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +12 -0
  164. package/.koolie/core/framework/skills/fw-overlay-pflege/CHANGELOG.md +7 -0
  165. package/.koolie/core/framework/skills/fw-overlay-pflege/EXAMPLES.md +48 -0
  166. package/.koolie/core/framework/skills/fw-overlay-pflege/SKILL.md +147 -0
  167. package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +13 -0
  168. package/.koolie/core/framework/skills/fw-plan/CHANGELOG.md +14 -0
  169. package/.koolie/core/framework/skills/fw-plan/EXAMPLES.md +69 -0
  170. package/.koolie/core/framework/skills/fw-plan/SKILL.md +168 -0
  171. package/.koolie/core/framework/skills/fw-plan/TESTS.md +14 -0
  172. package/.koolie/core/framework/skills/fw-refactor/CHANGELOG.md +10 -0
  173. package/.koolie/core/framework/skills/fw-refactor/EXAMPLES.md +70 -0
  174. package/.koolie/core/framework/skills/fw-refactor/SKILL.md +173 -0
  175. package/.koolie/core/framework/skills/fw-refactor/TESTS.md +14 -0
  176. package/.koolie/core/framework/skills/fw-repo-analyze/CHANGELOG.md +10 -0
  177. package/.koolie/core/framework/skills/fw-repo-analyze/EXAMPLES.md +52 -0
  178. package/.koolie/core/framework/skills/fw-repo-analyze/SKILL.md +149 -0
  179. package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +11 -0
  180. package/.koolie/core/framework/skills/fw-review-support/CHANGELOG.md +12 -0
  181. package/.koolie/core/framework/skills/fw-review-support/EXAMPLES.md +69 -0
  182. package/.koolie/core/framework/skills/fw-review-support/SKILL.md +179 -0
  183. package/.koolie/core/framework/skills/fw-review-support/TESTS.md +13 -0
  184. package/.koolie/core/framework/skills/fw-tests/CHANGELOG.md +9 -0
  185. package/.koolie/core/framework/skills/fw-tests/EXAMPLES.md +65 -0
  186. package/.koolie/core/framework/skills/fw-tests/SKILL.md +169 -0
  187. package/.koolie/core/framework/skills/fw-tests/TESTS.md +12 -0
  188. package/.koolie/core/framework/tech-packs/README.md +15 -0
  189. package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +61 -0
  190. package/.koolie/core/governance/ADOPTION_REGISTRY.md +89 -0
  191. package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +60 -0
  192. package/.koolie/core/governance/DECISION_LOG.md +779 -0
  193. package/.koolie/core/governance/EXCEPTION_PROCESS.md +31 -0
  194. package/.koolie/core/governance/FEEDBACK_PROCESS.md +34 -0
  195. package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +135 -0
  196. package/.koolie/core/governance/INCIDENT_HANDLING.md +47 -0
  197. package/.koolie/core/governance/PRIORITY_HIERARCHY.md +61 -0
  198. package/.koolie/core/governance/RACI.md +37 -0
  199. package/.koolie/core/governance/RELEASE_PROCESS.md +183 -0
  200. package/.koolie/core/governance/change-requests/CR-2026-001-definition-release-1-0-0.md +67 -0
  201. package/.koolie/core/governance/change-requests/CR-2026-002-client-packs.md +63 -0
  202. package/.koolie/core/governance/change-requests/CR-2026-003-install-client-schalter.md +70 -0
  203. package/.koolie/core/governance/change-requests/CR-2026-004-client-pack-claude-code.md +82 -0
  204. package/.koolie/core/governance/change-requests/CR-2026-005-kern-neutralisierung.md +75 -0
  205. package/.koolie/core/governance/change-requests/CR-2026-006-gemeinsame-skill-quelle.md +77 -0
  206. package/.koolie/core/governance/change-requests/CR-2026-007-geteilte-kernbestandteile.md +80 -0
  207. package/.koolie/core/governance/change-requests/CR-2026-008-berechtigungen-und-hooks.md +85 -0
  208. package/.koolie/core/governance/change-requests/CR-2026-009-umbenennung-leitwerk.md +77 -0
  209. package/.koolie/core/governance/change-requests/CR-2026-010-restduplikation.md +73 -0
  210. package/.koolie/core/governance/change-requests/CR-2026-011-hauptdokument.md +72 -0
  211. package/.koolie/core/governance/change-requests/CR-2026-012-schreibschutz-kernverzeichnis.md +106 -0
  212. package/.koolie/core/governance/change-requests/CR-2026-013-validator-blindstellen.md +128 -0
  213. package/.koolie/core/governance/change-requests/CR-2026-014-kurzform-langform.md +125 -0
  214. package/.koolie/core/governance/change-requests/CR-2026-015-versionskette.md +150 -0
  215. package/.koolie/core/governance/change-requests/CR-2026-016-ap2-claude-code.md +127 -0
  216. package/.koolie/core/governance/change-requests/CR-2026-017-ladebedingungen-claude-code.md +173 -0
  217. package/.koolie/core/governance/change-requests/CR-2026-018-quellenliste-claude-code.md +121 -0
  218. package/.koolie/core/governance/change-requests/CR-2026-019-strukturentscheidungen-fortschreiben.md +143 -0
  219. package/.koolie/core/governance/change-requests/CR-2026-020-akteursbezeichnung.md +118 -0
  220. package/.koolie/core/governance/change-requests/CR-2026-021-hook-interpreter.md +113 -0
  221. package/.koolie/core/governance/change-requests/CR-2026-022-artefaktversionen.md +73 -0
  222. package/.koolie/core/governance/change-requests/CR-2026-023-shell-lesesperre.md +128 -0
  223. package/.koolie/core/governance/change-requests/CR-2026-024-clientbindungen.md +78 -0
  224. package/.koolie/core/governance/change-requests/CR-2026-025-betriebsmodi.md +110 -0
  225. package/.koolie/core/governance/change-requests/CR-2026-026-fail-closed.md +134 -0
  226. package/.koolie/core/governance/change-requests/CR-2026-027-zeichenlimit-einstufung.md +105 -0
  227. package/.koolie/core/governance/change-requests/CR-2026-028-berechtigungsmodi.md +130 -0
  228. package/.koolie/core/governance/change-requests/CR-2026-029-hook-ablageort.md +115 -0
  229. package/.koolie/core/governance/change-requests/CR-2026-030-lesende-werkzeuge.md +143 -0
  230. package/.koolie/core/governance/change-requests/CR-2026-031-regelquellen-ausserhalb.md +182 -0
  231. package/.koolie/core/governance/change-requests/CR-2026-032-fremde-skill-ablage.md +151 -0
  232. package/.koolie/core/governance/change-requests/CR-2026-033-modusabhaengige-durchsetzung.md +131 -0
  233. package/.koolie/core/governance/change-requests/CR-2026-034-nachweisbedingungen.md +116 -0
  234. package/.koolie/core/governance/change-requests/CR-2026-035-readme-in-der-regelablage.md +115 -0
  235. package/.koolie/core/governance/change-requests/CR-2026-036-ortsangaben-hook-konfiguration.md +108 -0
  236. package/.koolie/core/governance/change-requests/CR-2026-037-meldender-hook-clientgebunden.md +133 -0
  237. package/.koolie/core/governance/change-requests/CR-2026-038-importsteuerung.md +159 -0
  238. package/.koolie/core/governance/change-requests/CR-2026-039-normative-saetze-in-kommentaren.md +124 -0
  239. package/.koolie/core/governance/change-requests/CR-2026-040-erh01-ist-clientgebunden.md +115 -0
  240. package/.koolie/core/governance/change-requests/CR-2026-041-s5-nicht-abbildbar.md +128 -0
  241. package/.koolie/core/governance/change-requests/CR-2026-042-abwesenheitsnachweis-suchwerkzeug.md +102 -0
  242. package/.koolie/core/governance/change-requests/CR-2026-043-validator-gibt-trefferwerte-aus.md +135 -0
  243. package/.koolie/core/governance/change-requests/CR-2026-044-aktivierungspruefung-clientgebunden.md +112 -0
  244. package/.koolie/core/governance/change-requests/CR-2026-045-update-verliert-die-clientwahl.md +116 -0
  245. package/.koolie/core/governance/change-requests/CR-2026-046-erstinstallation-ueberschreibt-projektdatei.md +125 -0
  246. package/.koolie/core/governance/change-requests/CR-2026-047-zusagen-je-zugriffskanal.md +133 -0
  247. package/.koolie/core/governance/change-requests/CR-2026-048-modusgrenze-ohne-durchsetzung.md +137 -0
  248. package/.koolie/core/governance/change-requests/CR-2026-049-sondenlauf-kodierungsabhaengig.md +126 -0
  249. package/.koolie/core/governance/change-requests/CR-2026-050-allowed-tools-und-verworfene-permissions.md +110 -0
  250. package/.koolie/core/governance/change-requests/CR-2026-051-quellenkarte-und-ueberholter-stand.md +110 -0
  251. package/.koolie/core/governance/change-requests/CR-2026-052-drei-regelkonflikte.md +166 -0
  252. package/.koolie/core/governance/change-requests/CR-2026-053-lesesperre-und-entwicklungsprofil.md +144 -0
  253. package/.koolie/core/governance/change-requests/CR-2026-054-aktivierung-verlangt-aktivitaet.md +124 -0
  254. package/.koolie/core/governance/change-requests/CR-2026-055-domain-ausnahme-ohne-mechanismus.md +173 -0
  255. package/.koolie/core/governance/change-requests/CR-2026-056-eingabeschema-und-pfadidentitaet.md +245 -0
  256. package/.koolie/core/governance/change-requests/CR-2026-057-disallowed-tools-und-s3.md +148 -0
  257. package/.koolie/core/governance/change-requests/CR-2026-058-unteragent-reichweite.md +203 -0
  258. package/.koolie/core/governance/change-requests/CR-2026-059-unteragent-tiefe-und-widerspruch.md +125 -0
  259. package/.koolie/core/governance/change-requests/CR-2026-060-stumme-brueche.md +170 -0
  260. package/.koolie/core/governance/change-requests/CR-2026-061-berechtigungsdatei-ohne-pruefung.md +169 -0
  261. package/.koolie/core/governance/change-requests/CR-2026-062-werkzeugabbildung-des-frontmatters.md +178 -0
  262. package/.koolie/core/governance/change-requests/CR-2026-063-skillaufruf-ohne-freigabe.md +207 -0
  263. package/.koolie/core/governance/change-requests/CR-2026-064-pruefregister-nicht-nachgezaehlt.md +141 -0
  264. package/.koolie/core/governance/change-requests/CR-2026-065-devin-suchwerkzeuge-erhoben.md +170 -0
  265. package/.koolie/core/governance/change-requests/CR-2026-066-schlitzdeckung-ohne-abgleich.md +153 -0
  266. package/.koolie/core/governance/change-requests/CR-2026-067-hookblock-und-praeparationsregister.md +140 -0
  267. package/.koolie/core/governance/change-requests/CR-2026-068-sondenlauf-nebenlaeufig.md +106 -0
  268. package/.koolie/core/governance/change-requests/CR-2026-069-bytecode-des-kerns.md +108 -0
  269. package/.koolie/core/governance/change-requests/CR-2026-070-d11-zaehler.md +114 -0
  270. package/.koolie/core/governance/change-requests/CR-2026-071-strukturentscheidungen-bestaetigen.md +322 -0
  271. package/.koolie/core/governance/change-requests/CR-2026-072-modulstatus-heben.md +315 -0
  272. package/.koolie/core/governance/change-requests/CR-2026-073-nicht-skill-traeger-heben.md +246 -0
  273. package/.koolie/core/governance/change-requests/CR-2026-074-restliche-nicht-skill-traeger-heben.md +271 -0
  274. package/.koolie/core/governance/change-requests/CR-2026-075-ap2-zielversion-devin-desktop.md +335 -0
  275. package/.koolie/core/governance/change-requests/CR-2026-076-erster-sitzungstest.md +455 -0
  276. package/.koolie/core/governance/change-requests/CR-2026-077-sitzungstest-schranken.md +425 -0
  277. package/.koolie/core/governance/change-requests/CR-2026-078-planung-nach-1-0-0.md +294 -0
  278. package/.koolie/core/governance/change-requests/CR-2026-079-umbenennung-vorziehen.md +233 -0
  279. package/.koolie/core/governance/change-requests/CR-2026-080-clientbindung-des-kerns.md +321 -0
  280. package/.koolie/core/governance/change-requests/CR-2026-081-produktnamen-im-kern.md +297 -0
  281. package/.koolie/core/governance/change-requests/CR-2026-082-sitzungstest-pi-ds-2.md +145 -0
  282. package/.koolie/core/governance/change-requests/CR-2026-083-sitzungstest-ne-sc.md +300 -0
  283. package/.koolie/core/governance/change-requests/CR-2026-084-trockenlauf-gegen-den-committeten-stand.md +117 -0
  284. package/.koolie/core/governance/change-requests/CR-2026-085-vorbedingungen-sitzungstest-5.md +182 -0
  285. package/.koolie/core/governance/change-requests/CR-2026-086-grenzfaelle-gegen-die-fassungen.md +164 -0
  286. package/.koolie/core/governance/change-requests/CR-2026-087-produktbeobachtung-quellenliste.md +206 -0
  287. package/.koolie/core/governance/change-requests/CR-2026-088-vorbedingungen-testblaetter.md +127 -0
  288. package/.koolie/core/governance/change-requests/CR-2026-089-herrichtung-uebungsrepositorium.md +226 -0
  289. package/.koolie/core/governance/change-requests/CR-2026-090-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +255 -0
  290. package/.koolie/core/governance/change-requests/CR-2026-091-sitzungstest-5.md +163 -0
  291. package/.koolie/core/governance/change-requests/CR-2026-092-pruefmittelwort-und-buendelschnitt.md +226 -0
  292. package/.koolie/core/governance/change-requests/CR-2026-093-sechzehnte-praeparation.md +151 -0
  293. package/.koolie/core/governance/change-requests/CR-2026-094-testblaetter-buendel-1.md +113 -0
  294. package/.koolie/core/governance/change-requests/CR-2026-095-pruefapparat-filter.md +65 -0
  295. package/.koolie/core/governance/change-requests/CR-2026-096-vorbedingungen-buendel-2.md +225 -0
  296. package/.koolie/core/governance/change-requests/CR-2026-097-testblaetter-buendel-2.md +162 -0
  297. package/.koolie/core/governance/change-requests/CR-2026-098-anforderungen-auslieferung.md +93 -0
  298. package/.koolie/core/governance/change-requests/CR-2026-099-k74-und-vorbedingungen-buendel-3.md +119 -0
  299. package/.koolie/core/governance/change-requests/CR-2026-100-testblaetter-buendel-3.md +120 -0
  300. package/.koolie/core/governance/change-requests/CR-2026-101-k77-eigener-posten.md +165 -0
  301. package/.koolie/core/governance/change-requests/CR-2026-102-k77-entschieden.md +118 -0
  302. package/.koolie/core/governance/change-requests/CR-2026-103-vorbedingungen-buendel-4.md +76 -0
  303. package/.koolie/core/governance/change-requests/CR-2026-104-herrichtung-buendel-4.md +82 -0
  304. package/.koolie/core/governance/change-requests/CR-2026-105-messapparat-buendel-4.md +227 -0
  305. package/.koolie/core/governance/change-requests/CR-2026-106-uebergabe-einchecken.md +91 -0
  306. package/.koolie/core/governance/change-requests/CR-2026-107-uebergabe-im-release-commit.md +111 -0
  307. package/.koolie/core/governance/change-requests/CR-2026-108-testblaetter-buendel-4.md +118 -0
  308. package/.koolie/core/governance/change-requests/CR-2026-109-berichtsweg-des-aufraeumers.md +108 -0
  309. package/.koolie/core/governance/change-requests/CR-2026-110-vorbedingungen-des-nachlaufs.md +184 -0
  310. package/.koolie/core/governance/change-requests/CR-2026-111-der-apparat-auf-dem-weg-der-wiederaufnahme.md +127 -0
  311. package/.koolie/core/governance/change-requests/CR-2026-112-der-arbeitsplatz-im-kern.md +103 -0
  312. package/.koolie/core/governance/change-requests/CR-2026-113-nachlauf-buendel-4.md +103 -0
  313. package/.koolie/core/governance/change-requests/CR-2026-114-vorbedingungen-buendel-5.md +317 -0
  314. package/.koolie/core/governance/change-requests/CR-2026-115-herrichtung-buendel-5.md +244 -0
  315. package/.koolie/core/governance/change-requests/CR-2026-116-messtag-buendel-5.md +178 -0
  316. package/.koolie/core/governance/change-requests/CR-2026-117-sammelzellen-zentraler-katalog.md +251 -0
  317. package/.koolie/core/governance/change-requests/CR-2026-118-quellenzuordnung-matrixzeilen.md +115 -0
  318. package/.koolie/core/governance/change-requests/CR-2026-119-umbenennung-koolie.md +204 -0
  319. package/.koolie/core/governance/change-requests/CR-2026-120-ap2-rest-devin-desktop.md +96 -0
  320. package/.koolie/core/governance/change-requests/CR-2026-121-verify-marker-abschaffen.md +185 -0
  321. package/.koolie/core/governance/change-requests/CR-2026-122-umbenennung-koolie-lauf.md +131 -0
  322. package/.koolie/core/governance/change-requests/CR-2026-123-vortrag-und-namensabsatz.md +170 -0
  323. package/.koolie/core/governance/change-requests/CR-2026-124-hauptdokument-ap11.md +237 -0
  324. package/.koolie/core/governance/change-requests/CR-2026-125-word-fassung-und-blinder-fleck.md +204 -0
  325. package/.koolie/core/governance/change-requests/CR-2026-126-lizenz-gpl3.md +112 -0
  326. package/.koolie/core/governance/change-requests/CR-2026-127-gegenzeichnung-rollenfrage.md +96 -0
  327. package/.koolie/core/governance/change-requests/CR-2026-128-freigabelauf-1.0.0.md +278 -0
  328. package/.koolie/core/governance/change-requests/CR-2026-129-archiv-zeilenenden.md +90 -0
  329. package/.koolie/core/governance/change-requests/CR-2026-130-reihenfolge-des-hebens.md +204 -0
  330. package/.koolie/core/governance/change-requests/CR-2026-131-chronik-und-vorlage.md +194 -0
  331. package/.koolie/core/governance/change-requests/CR-2026-132-erhebung-openai-codex.md +185 -0
  332. package/.koolie/core/governance/change-requests/CR-2026-133-bau-openai-codex.md +97 -0
  333. package/.koolie/core/governance/change-requests/CR-2026-134-uebergabe-lokal.md +117 -0
  334. package/.koolie/core/governance/change-requests/CR-2026-135-pfadlisten-nul-getrennt.md +139 -0
  335. package/.koolie/core/governance/change-requests/CR-2026-136-overlay-werte-einordnung.md +156 -0
  336. package/.koolie/core/governance/change-requests/CR-2026-137-kopierweg-kern.md +144 -0
  337. package/.koolie/core/governance/change-requests/CR-2026-138-overlay-muster-general.md +118 -0
  338. package/.koolie/core/governance/change-requests/CR-2026-139-overlay-muster-dokumente.md +105 -0
  339. package/.koolie/core/governance/change-requests/CR-2026-140-installer-je-zielsystem.md +120 -0
  340. package/.koolie/core/governance/change-requests/CR-2026-141-lieferumfang.md +123 -0
  341. package/.koolie/core/governance/change-requests/CR-2026-142-dokumentationsstandard.md +90 -0
  342. package/.koolie/core/governance/change-requests/CR-2026-143-klasse-b-core-laufzeit.md +89 -0
  343. package/.koolie/core/governance/change-requests/CR-2026-144-klasse-b-governance.md +90 -0
  344. package/.koolie/core/governance/change-requests/CR-2026-145-klasse-b-skills.md +81 -0
  345. package/.koolie/core/governance/change-requests/CR-2026-146-code-pack-posten.md +84 -0
  346. package/.koolie/core/governance/change-requests/CR-2026-147-regel-register-posten.md +78 -0
  347. package/.koolie/core/governance/change-requests/CR-2026-148-mehrprojekt-tokenlast.md +70 -0
  348. package/.koolie/core/governance/change-requests/CR-2026-149-regelablage-pfadtoken.md +71 -0
  349. package/.koolie/core/governance/change-requests/CR-2026-150-client-pack-kiro.md +76 -0
  350. package/.koolie/core/governance/change-requests/CR-2026-151-skill-anweisungen.md +71 -0
  351. package/.koolie/core/governance/change-requests/CR-2026-152-testblaetter-modellwechsel.md +78 -0
  352. package/.koolie/core/governance/change-requests/CR-2026-153-attributionszeile.md +88 -0
  353. package/.koolie/core/governance/change-requests/CR-2026-154-auffindbarkeit.md +102 -0
  354. package/.koolie/core/governance/change-requests/CR-2026-155-client-pack-cursor.md +80 -0
  355. package/.koolie/core/governance/change-requests/CR-2026-156-mandat-und-reibung.md +100 -0
  356. package/.koolie/core/governance/change-requests/CR-2026-157-mcp-anbindung.md +93 -0
  357. package/.koolie/core/governance/change-requests/CR-2026-158-registerpflege.md +69 -0
  358. package/.koolie/core/governance/change-requests/CR-2026-159-powershell.md +49 -0
  359. package/.koolie/core/governance/change-requests/CR-2026-160-messapparat.md +59 -0
  360. package/.koolie/core/governance/change-requests/CR-2026-161-pruefwerkzeuge.md +52 -0
  361. package/.koolie/core/governance/change-requests/CR-2026-162-schutzschicht.md +65 -0
  362. package/.koolie/core/governance/change-requests/CR-2026-163-pfadsemantik.md +61 -0
  363. package/.koolie/core/governance/change-requests/CR-2026-164-modi-ausnahmen.md +65 -0
  364. package/.koolie/core/governance/change-requests/CR-2026-165-installer-banner.md +406 -0
  365. package/.koolie/core/governance/change-requests/CR-2026-166-nachlauf-aufzeichnungen.md +59 -0
  366. package/.koolie/core/governance/change-requests/CR-2026-167-einsatzarchitektur.md +60 -0
  367. package/.koolie/core/governance/change-requests/CR-2026-168-paketquellen.md +64 -0
  368. package/.koolie/core/governance/change-requests/CR-2026-169-modusbindung-messfragen.md +58 -0
  369. package/.koolie/core/governance/change-requests/CR-2026-170-erste-veroeffentlichung.md +62 -0
  370. package/.koolie/core/governance/change-requests/CR-2026-171-befehl-im-projektverzeichnis.md +57 -0
  371. package/.koolie/core/governance/change-requests/CR-2026-172-auftritt-npm-suche.md +58 -0
  372. package/.koolie/core/install.py +2402 -0
  373. package/.koolie/core/install_dialog.py +227 -0
  374. package/.koolie/core/koexistenz.py +112 -0
  375. package/.koolie/core/mandat.py +605 -0
  376. package/.koolie/core/onboarding/COMPLETION_CRITERIA.md +37 -0
  377. package/.koolie/core/onboarding/GUIDE.md +103 -0
  378. package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +48 -0
  379. package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +40 -0
  380. package/.koolie/core/onboarding/QUICKSTART.md +50 -0
  381. package/.koolie/core/onboarding/REFERENCE.md +69 -0
  382. package/.koolie/core/onboarding/exercises/EXERCISES.md +78 -0
  383. package/.koolie/core/onboarding/exercises/README.md +120 -0
  384. package/.koolie/core/pilot/METRICS.md +59 -0
  385. package/.koolie/core/pilot/PILOT_CONCEPT.md +42 -0
  386. package/.koolie/core/prompts/01-understand-codebase.md +99 -0
  387. package/.koolie/core/prompts/02-impact-analysis.md +104 -0
  388. package/.koolie/core/prompts/03-implementation-planning.md +102 -0
  389. package/.koolie/core/prompts/04-code-generation.md +100 -0
  390. package/.koolie/core/prompts/05-test-generation.md +103 -0
  391. package/.koolie/core/prompts/06-refactoring.md +102 -0
  392. package/.koolie/core/prompts/07-debugging.md +97 -0
  393. package/.koolie/core/prompts/08-security-review.md +92 -0
  394. package/.koolie/core/prompts/09-performance-analysis.md +89 -0
  395. package/.koolie/core/prompts/10-documentation.md +91 -0
  396. package/.koolie/core/prompts/11-merge-request-review.md +94 -0
  397. package/.koolie/core/prompts/12-developer-training.md +90 -0
  398. package/.koolie/core/prompts/README.md +88 -0
  399. package/.koolie/core/templates/MR_AI_DISCLOSURE.md +37 -0
  400. package/.koolie/core/templates/PLAN_TEMPLATE.md +57 -0
  401. package/.koolie/core/templates/SKILL_TEMPLATE.md +159 -0
  402. package/.koolie/core/templates/project-overlay/OVERLAY.md +315 -0
  403. package/.koolie/core/templates/project-overlay/documents/README.md +43 -0
  404. package/.koolie/core/templates/project-overlay/documents/ai-governance/.gitkeep.md +3 -0
  405. package/.koolie/core/templates/project-overlay/documents/ai-process-model/.gitkeep.md +3 -0
  406. package/.koolie/core/templates/project-overlay/documents/architecture/.gitkeep.md +3 -0
  407. package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +3 -0
  408. package/.koolie/core/templates/project-overlay/documents/branching-strategy/.gitkeep.md +3 -0
  409. package/.koolie/core/templates/project-overlay/documents/coding-guidelines/.gitkeep.md +3 -0
  410. package/.koolie/core/templates/project-overlay/documents/definition-of-done/.gitkeep.md +3 -0
  411. package/.koolie/core/templates/project-overlay/documents/definition-of-ready/.gitkeep.md +3 -0
  412. package/.koolie/core/templates/project-overlay/documents/deployment/.gitkeep.md +3 -0
  413. package/.koolie/core/templates/project-overlay/documents/glossary/.gitkeep.md +3 -0
  414. package/.koolie/core/templates/project-overlay/documents/quality/.gitkeep.md +3 -0
  415. package/.koolie/core/templates/project-overlay/documents/roadmap/.gitkeep.md +3 -0
  416. package/.koolie/core/templates/project-overlay/documents/roles/.gitkeep.md +3 -0
  417. package/.koolie/core/templates/project-overlay/documents/security/.gitkeep.md +3 -0
  418. package/.koolie/core/templates/project-overlay/exceptions/EXCEPTIONS.md +9 -0
  419. package/.koolie/core/templates/project-overlay/forbidden-terms.txt +8 -0
  420. package/.koolie/core/templates/project-overlay/overlay-manifest.yaml +73 -0
  421. package/.koolie/core/templates/rules/21-overlay-TEMPLATE.md.template +28 -0
  422. package/.koolie/core/templates/rules/40-tech-TEMPLATE.md.template +33 -0
  423. package/.koolie/core/tests/EDGE_CASES.md +67 -0
  424. package/.koolie/core/tests/TEST_CATALOG.md +170 -0
  425. package/.koolie/core/tests/erhebungen/README.md +326 -0
  426. package/.koolie/core/tests/erhebungen/ablage.py +357 -0
  427. package/.koolie/core/tests/erhebungen/apparat/__init__.py +22 -0
  428. package/.koolie/core/tests/erhebungen/apparat/baum.py +214 -0
  429. package/.koolie/core/tests/erhebungen/apparat/belege.py +91 -0
  430. package/.koolie/core/tests/erhebungen/apparat/clients.py +321 -0
  431. package/.koolie/core/tests/erhebungen/apparat/freigabe.py +74 -0
  432. package/.koolie/core/tests/erhebungen/apparat/kontingent.py +64 -0
  433. package/.koolie/core/tests/erhebungen/apparat/laeufer.py +155 -0
  434. package/.koolie/core/tests/erhebungen/apparat/reihe.py +202 -0
  435. package/.koolie/core/tests/erhebungen/apparat/selbsttest.py +280 -0
  436. package/.koolie/core/tests/erhebungen/apparat/stand.py +30 -0
  437. package/.koolie/core/tests/erhebungen/apparat/vorpruefung.py +70 -0
  438. package/.koolie/core/tests/erhebungen/auswerten-b4.py +468 -0
  439. package/.koolie/core/tests/erhebungen/auswerten-b5.py +517 -0
  440. package/.koolie/core/tests/erhebungen/auswerten-dd.py +172 -0
  441. package/.koolie/core/tests/erhebungen/baeume-b4.py +334 -0
  442. package/.koolie/core/tests/erhebungen/baeume-b5.py +339 -0
  443. package/.koolie/core/tests/erhebungen/baeume_loeschen.py +138 -0
  444. package/.koolie/core/tests/erhebungen/cc-overlay-fuellen.py +277 -0
  445. package/.koolie/core/tests/erhebungen/dossier-b4.py +178 -0
  446. package/.koolie/core/tests/erhebungen/dossier-b5.py +202 -0
  447. package/.koolie/core/tests/erhebungen/historie-bauen-b4.py +642 -0
  448. package/.koolie/core/tests/erhebungen/k-bauen-b3.py +841 -0
  449. package/.koolie/core/tests/erhebungen/lauf-dd.py +146 -0
  450. package/.koolie/core/tests/erhebungen/lauf.py +114 -0
  451. package/.koolie/core/tests/erhebungen/mcp-waechter.py +278 -0
  452. package/.koolie/core/tests/erhebungen/messbaum-schnitt.py +256 -0
  453. package/.koolie/core/tests/erhebungen/messen.py +72 -0
  454. package/.koolie/core/tests/erhebungen/node-waechter.py +74 -0
  455. package/.koolie/core/tests/erhebungen/packaktivierung.py +403 -0
  456. package/.koolie/core/tests/erhebungen/prompts-schreiben-b4.py +210 -0
  457. package/.koolie/core/tests/erhebungen/prompts-schreiben-b5.py +251 -0
  458. package/.koolie/core/tests/erhebungen/reihe-b4.py +171 -0
  459. package/.koolie/core/tests/erhebungen/reihe-b5.py +172 -0
  460. package/.koolie/core/tests/erhebungen/stand-b4.py +135 -0
  461. package/.koolie/core/tests/erhebungen/stand-b5.py +137 -0
  462. package/.koolie/core/tests/erhebungen/trust-b4.py +56 -0
  463. package/.koolie/core/tests/erhebungen/trust-b5.py +56 -0
  464. package/.koolie/core/tests/erhebungen/turn2-schreiben-b4.py +105 -0
  465. package/.koolie/core/tests/erhebungen/umgebungen-bauen-b4.py +377 -0
  466. package/.koolie/core/tests/erhebungen/umgebungen-bauen-b5.py +363 -0
  467. package/.koolie/core/tests/erhebungen/zaehlen46.py +74 -0
  468. package/.koolie/core/tests/erhebungen/zustand-b4.py +82 -0
  469. package/.koolie/core/tests/erhebungen/zustand-b5.py +82 -0
  470. package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code-wirkungsnachweise.md +194 -0
  471. package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code.md +468 -0
  472. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-020-akteursbezeichnung.md +99 -0
  473. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-021-hook-interpreter.md +138 -0
  474. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-022-artefaktversionen.md +87 -0
  475. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-023-shell-lesesperre.md +135 -0
  476. package/.koolie/core/tests/protocols/2026-09-10-CR-2026-024-clientbindungen.md +98 -0
  477. package/.koolie/core/tests/protocols/2026-09-10-FW-DS-03.md +90 -0
  478. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-01.md +105 -0
  479. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-02.md +123 -0
  480. package/.koolie/core/tests/protocols/2026-09-10-FW-KO-04.md +73 -0
  481. package/.koolie/core/tests/protocols/2026-09-10-FW-RE-02.md +99 -0
  482. package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01-wiederholung.md +108 -0
  483. package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01.md +249 -0
  484. package/.koolie/core/tests/protocols/2026-09-10-FW-ZA-05.md +99 -0
  485. package/.koolie/core/tests/protocols/2026-09-11-AP2-devin-desktop.md +257 -0
  486. package/.koolie/core/tests/protocols/2026-09-11-CR-2026-026-fail-closed.md +113 -0
  487. package/.koolie/core/tests/protocols/2026-09-11-erhebungen-K21-K26.md +243 -0
  488. package/.koolie/core/tests/protocols/2026-09-11-wirkungsnachweise-0.26.0.md +101 -0
  489. package/.koolie/core/tests/protocols/2026-09-12-B01-allowed-tools.md +152 -0
  490. package/.koolie/core/tests/protocols/2026-09-12-B04-B05-gegenpruefung.md +204 -0
  491. package/.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md +268 -0
  492. package/.koolie/core/tests/protocols/2026-09-12-mehrprojekt-arbeitsbereich.md +154 -0
  493. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.26.1.md +126 -0
  494. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.27.0.md +114 -0
  495. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.28.0.md +129 -0
  496. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.29.0.md +121 -0
  497. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.30.0.md +112 -0
  498. package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.31.0.md +107 -0
  499. package/.koolie/core/tests/protocols/2026-09-13-B06-gegenpruefung.md +370 -0
  500. package/.koolie/core/tests/protocols/2026-09-13-B07-B09-gegenpruefung.md +211 -0
  501. package/.koolie/core/tests/protocols/2026-09-13-B08-B11-gegenpruefung.md +179 -0
  502. package/.koolie/core/tests/protocols/2026-09-13-erhebung-disallowed-tools.md +147 -0
  503. package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent-tiefe.md +139 -0
  504. package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent.md +214 -0
  505. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-berechtigungsdatei.md +253 -0
  506. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-stumme-brueche.md +202 -0
  507. package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md +219 -0
  508. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.32.0.md +133 -0
  509. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.33.0.md +169 -0
  510. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.34.0.md +187 -0
  511. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.35.0.md +187 -0
  512. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.36.0.md +137 -0
  513. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.37.0.md +112 -0
  514. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.38.0.md +154 -0
  515. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.39.0.md +188 -0
  516. package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.40.0.md +214 -0
  517. package/.koolie/core/tests/protocols/2026-09-14-erhebung-devin-werkzeuge.md +267 -0
  518. package/.koolie/core/tests/protocols/2026-09-14-erhebung-skillaufruf.md +238 -0
  519. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-pruefregister.md +156 -0
  520. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-schlitzdeckung.md +206 -0
  521. package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-skillwahl.md +127 -0
  522. package/.koolie/core/tests/protocols/2026-09-14-migrationslauf-pilot.md +134 -0
  523. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.41.0.md +175 -0
  524. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.42.0.md +180 -0
  525. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.43.0.md +165 -0
  526. package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.44.0.md +130 -0
  527. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-d11-zaehlregeln.md +311 -0
  528. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-modulstatus.md +524 -0
  529. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-nicht-skill-traeger.md +225 -0
  530. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-restliche-nicht-skill-traeger.md +345 -0
  531. package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-strukturentscheidungen.md +392 -0
  532. package/.koolie/core/tests/protocols/2026-09-15-herrichtung-uebungsrepositorium.md +213 -0
  533. package/.koolie/core/tests/protocols/2026-09-15-migrationslauf-pilot-0.46.0.md +143 -0
  534. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.45.0.md +127 -0
  535. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.46.0.md +193 -0
  536. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.47.0.md +149 -0
  537. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.49.0.md +202 -0
  538. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.50.0.md +183 -0
  539. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.51.0.md +202 -0
  540. package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.52.0.md +168 -0
  541. package/.koolie/core/tests/protocols/2026-09-16-AP2-zielversion-devin-desktop.md +231 -0
  542. package/.koolie/core/tests/protocols/2026-09-16-wirkungsnachweise-0.53.0.md +350 -0
  543. package/.koolie/core/tests/protocols/2026-09-17-nachtrag-migrationshinweis-0.54.1.md +121 -0
  544. package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-pi-ds.md +523 -0
  545. package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-schranken.md +433 -0
  546. package/.koolie/core/tests/protocols/2026-09-17-wirkungsnachweise-0.54.0.md +159 -0
  547. package/.koolie/core/tests/protocols/2026-09-18-FW-AK-01.md +442 -0
  548. package/.koolie/core/tests/protocols/2026-09-18-FW-KO-05.md +231 -0
  549. package/.koolie/core/tests/protocols/2026-09-18-herrichtung-uebungsrepositorium.md +273 -0
  550. package/.koolie/core/tests/protocols/2026-09-18-nachtrag-preis-umbenennung-0.56.1.md +102 -0
  551. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-5.md +349 -0
  552. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-ne-sc.md +430 -0
  553. package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-pi-ds-2.md +499 -0
  554. package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +170 -0
  555. package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-testblaetter.md +184 -0
  556. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.55.0.md +202 -0
  557. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.0.md +135 -0
  558. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.2.md +154 -0
  559. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.0.md +228 -0
  560. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.1.md +262 -0
  561. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.58.0.md +135 -0
  562. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.59.0.md +150 -0
  563. package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.60.0.md +340 -0
  564. package/.koolie/core/tests/protocols/2026-09-19-herrichtung-buendel-4.md +235 -0
  565. package/.koolie/core/tests/protocols/2026-09-19-k77-zurechenbarkeit.md +236 -0
  566. package/.koolie/core/tests/protocols/2026-09-19-pruefapparat-filter.md +50 -0
  567. package/.koolie/core/tests/protocols/2026-09-19-pruefmittelwort-und-buendelschnitt.md +239 -0
  568. package/.koolie/core/tests/protocols/2026-09-19-sechzehnte-praeparation.md +135 -0
  569. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-1.md +250 -0
  570. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-2.md +229 -0
  571. package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-3.md +293 -0
  572. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-2.md +236 -0
  573. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-3.md +253 -0
  574. package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-4.md +138 -0
  575. package/.koolie/core/tests/protocols/2026-09-20-messapparat-buendel-4.md +433 -0
  576. package/.koolie/core/tests/protocols/2026-09-20-testblaetter-buendel-4.md +321 -0
  577. package/.koolie/core/tests/protocols/2026-09-20-uebergabe-im-release-commit.md +146 -0
  578. package/.koolie/core/tests/protocols/2026-09-20-vorbedingungen-nachlauf-b4.md +259 -0
  579. package/.koolie/core/tests/protocols/2026-09-21-arbeitsplatz-im-kern.md +127 -0
  580. package/.koolie/core/tests/protocols/2026-09-21-nachlauf-buendel-4.md +157 -0
  581. package/.koolie/core/tests/protocols/2026-09-21-vorbedingungen-buendel-5.md +247 -0
  582. package/.koolie/core/tests/protocols/2026-09-21-wiederaufnahme-nachlauf-b4.md +190 -0
  583. package/.koolie/core/tests/protocols/2026-09-22-ap2-rest-devin-desktop.md +614 -0
  584. package/.koolie/core/tests/protocols/2026-09-22-hauptdokument-ap11.md +443 -0
  585. package/.koolie/core/tests/protocols/2026-09-22-herrichtung-buendel-5.md +224 -0
  586. package/.koolie/core/tests/protocols/2026-09-22-messtag-buendel-5.md +327 -0
  587. package/.koolie/core/tests/protocols/2026-09-22-quellenzuordnung-matrixzeilen.md +230 -0
  588. package/.koolie/core/tests/protocols/2026-09-22-sammelzellen-zentraler-katalog.md +354 -0
  589. package/.koolie/core/tests/protocols/2026-09-22-umbenennung-koolie.md +296 -0
  590. package/.koolie/core/tests/protocols/2026-09-22-verify-marker-abschaffen.md +283 -0
  591. package/.koolie/core/tests/protocols/2026-09-22-vortrag-und-name.md +261 -0
  592. package/.koolie/core/tests/protocols/2026-09-22-wirkungsnachweise-0.86.0.md +158 -0
  593. package/.koolie/core/tests/protocols/2026-09-23-archiv-zeilenenden.md +113 -0
  594. package/.koolie/core/tests/protocols/2026-09-23-bau-openai-codex.md +168 -0
  595. package/.koolie/core/tests/protocols/2026-09-23-chronik-und-vorlage.md +224 -0
  596. package/.koolie/core/tests/protocols/2026-09-23-erhebung-openai-codex.md +309 -0
  597. package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0-vorbereitung.md +119 -0
  598. package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0.md +150 -0
  599. package/.koolie/core/tests/protocols/2026-09-23-gegenzeichnung-rollenfrage.md +198 -0
  600. package/.koolie/core/tests/protocols/2026-09-23-reihenfolge-des-hebens.md +220 -0
  601. package/.koolie/core/tests/protocols/2026-09-23-word-fassung-und-blinder-fleck.md +307 -0
  602. package/.koolie/core/tests/protocols/2026-09-24-kopierweg-kern.md +98 -0
  603. package/.koolie/core/tests/protocols/2026-09-24-overlay-werte-einordnung.md +111 -0
  604. package/.koolie/core/tests/protocols/2026-09-24-pfadlisten-nul-getrennt.md +128 -0
  605. package/.koolie/core/tests/protocols/2026-09-24-uebergabe-lokal.md +85 -0
  606. package/.koolie/core/tests/protocols/2026-09-25-code-pack-posten.md +86 -0
  607. package/.koolie/core/tests/protocols/2026-09-25-dokumentationsstandard.md +101 -0
  608. package/.koolie/core/tests/protocols/2026-09-25-installer-je-zielsystem.md +134 -0
  609. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-core-laufzeit.md +126 -0
  610. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-governance.md +133 -0
  611. package/.koolie/core/tests/protocols/2026-09-25-klasse-b-skills.md +91 -0
  612. package/.koolie/core/tests/protocols/2026-09-25-lieferumfang.md +76 -0
  613. package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-dokumente.md +107 -0
  614. package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-general.md +100 -0
  615. package/.koolie/core/tests/protocols/2026-09-25-regel-register-posten.md +87 -0
  616. package/.koolie/core/tests/protocols/2026-09-26-attributionszeile.md +83 -0
  617. package/.koolie/core/tests/protocols/2026-09-26-auffindbarkeit.md +85 -0
  618. package/.koolie/core/tests/protocols/2026-09-26-bau-cursor.md +68 -0
  619. package/.koolie/core/tests/protocols/2026-09-26-bau-kiro.md +75 -0
  620. package/.koolie/core/tests/protocols/2026-09-26-mehrprojekt-tokenlast.md +174 -0
  621. package/.koolie/core/tests/protocols/2026-09-26-regelablage-pfadtoken.md +133 -0
  622. package/.koolie/core/tests/protocols/2026-09-26-skill-anweisungen.md +111 -0
  623. package/.koolie/core/tests/protocols/2026-09-26-testblaetter-modellwechsel.md +106 -0
  624. package/.koolie/core/tests/protocols/2026-09-27-mandat-und-reibung.md +58 -0
  625. package/.koolie/core/tests/protocols/2026-09-28-mcp-anbindung.md +72 -0
  626. package/.koolie/core/tests/protocols/2026-09-29-messapparat.md +75 -0
  627. package/.koolie/core/tests/protocols/2026-09-29-powershell.md +58 -0
  628. package/.koolie/core/tests/protocols/2026-09-29-pruefwerkzeuge.md +64 -0
  629. package/.koolie/core/tests/protocols/2026-09-29-registerpflege.md +228 -0
  630. package/.koolie/core/tests/protocols/2026-09-29-schutzschicht.md +95 -0
  631. package/.koolie/core/tests/protocols/2026-09-30-einsatzarchitektur.md +104 -0
  632. package/.koolie/core/tests/protocols/2026-09-30-modi-ausnahmen.md +77 -0
  633. package/.koolie/core/tests/protocols/2026-09-30-nachlauf-banner.md +85 -0
  634. package/.koolie/core/tests/protocols/2026-09-30-paketquellen.md +65 -0
  635. package/.koolie/core/tests/protocols/2026-09-30-pfadsemantik.md +79 -0
  636. package/.koolie/core/tests/protocols/2026-10-01-auftritt-und-suche.md +58 -0
  637. package/.koolie/core/tests/protocols/2026-10-01-befehl-im-projektverzeichnis.md +47 -0
  638. package/.koolie/core/tests/protocols/2026-10-01-erste-veroeffentlichung.md +60 -0
  639. package/.koolie/core/tests/protocols/2026-10-01-modusbindung-messfragen.md +107 -0
  640. package/.koolie/core/tests/protocols/README.md +14 -0
  641. package/.koolie/core/tests/scripts/hook-check-secrets.py +1307 -0
  642. package/.koolie/core/tests/scripts/hook-overlay-status.py +120 -0
  643. package/.koolie/core/tests/scripts/mermaid_renderer.py +67 -0
  644. package/.koolie/core/tests/scripts/overlay_status.py +130 -0
  645. package/.koolie/core/tests/scripts/probe-pruefungen.py +110 -0
  646. package/.koolie/core/tests/scripts/pruefungen/__init__.py +4 -0
  647. package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +1559 -0
  648. package/.koolie/core/tests/scripts/pruefungen/bestand.py +1433 -0
  649. package/.koolie/core/tests/scripts/pruefungen/dokumente.py +1262 -0
  650. package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +784 -0
  651. package/.koolie/core/tests/scripts/pruefungen/hooks.py +1188 -0
  652. package/.koolie/core/tests/scripts/pruefungen/overlay.py +1251 -0
  653. package/.koolie/core/tests/scripts/pruefungen/packs.py +1314 -0
  654. package/.koolie/core/tests/scripts/pruefungen/register.py +950 -0
  655. package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +1202 -0
  656. package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +957 -0
  657. package/.koolie/core/tests/scripts/sonden/__init__.py +4 -0
  658. package/.koolie/core/tests/scripts/sonden/apparat.py +653 -0
  659. package/.koolie/core/tests/scripts/sonden/teil01_grundbestand_und_installation.py +999 -0
  660. package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +942 -0
  661. package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +1184 -0
  662. package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +1491 -0
  663. package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +1447 -0
  664. package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +739 -0
  665. package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +1014 -0
  666. package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +1325 -0
  667. package/.koolie/core/tests/scripts/sonden/teil09_pruefmittel_81_und_82.py +505 -0
  668. package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +1218 -0
  669. package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +149 -0
  670. package/.koolie/core/tests/scripts/sonden/teil12_pruefungen_106_und_107.py +136 -0
  671. package/.koolie/core/tests/scripts/sonden/teil13_pfad_und_mustersemantik.py +150 -0
  672. package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +204 -0
  673. package/.koolie/core/tests/scripts/sonden/teil15_banner_und_nachlauf.py +193 -0
  674. package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +114 -0
  675. package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +115 -0
  676. package/.koolie/core/tests/scripts/sonden/teil18_modusbindung_m3_m5.py +113 -0
  677. package/.koolie/core/tests/scripts/validate-framework.py +1104 -0
  678. package/.koolie/core/tests/scripts/validate-output.py +296 -0
  679. package/.koolie/core/wirksamkeit.py +430 -0
  680. package/CONTRIBUTING.md +119 -0
  681. package/LICENSE +674 -0
  682. package/QUICKSTART.en.md +135 -0
  683. package/QUICKSTART.md +129 -0
  684. package/README.en.md +108 -0
  685. package/README.md +107 -0
  686. package/install.cmd +44 -0
  687. package/install.command +46 -0
  688. package/package.json +21 -0
  689. package/paketquellen/README.md +41 -0
  690. package/paketquellen/bauen.py +411 -0
  691. package/paketquellen/koolie.cmd +23 -0
  692. package/paketquellen/koolie_befehl.py +82 -0
  693. package/paketquellen/npm/koolie.js +26 -0
@@ -0,0 +1,942 @@
1
+ """Sonden zum Messapparat, zu den Importkanaelen, zur Kuerzung der Testblaetter, zur
2
+ Attribution, zu den Pfadtoken von codex, zu den Packs kiro und cursor, zu den Pruefungen
3
+ 96 bis 101, zum Mandat und zu MCP.
4
+
5
+ Teil des Sondenskripts probe-pruefungen.py, seit 1.19.1 in Module geteilt (K-174). Die
6
+ Einheiten melden sich beim Laden dieses Moduls an; der Einstieg laedt die Module in der
7
+ Reihenfolge ihrer Nummer, und das ist die Reihenfolge der Ausgabe (D-49). Ein Modul
8
+ liest nur aus dem Apparat und aus frueheren Teilen."""
9
+ from __future__ import annotations
10
+
11
+ import ast
12
+ import datetime
13
+ import json
14
+ import os
15
+ import re
16
+ import shutil
17
+ import subprocess
18
+ import sys
19
+ import tempfile
20
+
21
+ from .apparat import (
22
+ aufraeumen, buendel, ersetze, gegenprobe, installation, kopie, lies, melde, notiz,
23
+ P, Praeparationsfehler, QUELLE, schreib, sonde, strict_ausgabe, unterprozess,
24
+ validator_ausgabe)
25
+
26
+
27
+ # --- D-407: der Messapparat findet den Kern unter `.koolie/core` (K-154) ----------------
28
+ #
29
+ # 🔴 SEIT DER UMBENENNUNG (0.88.0) WAR DER MESSAPPARAT AN DREI STELLEN GEBROCHEN, UND ES
30
+ # FIEL ERST IM NACHLAUF VON 1.11.0 AUF. `validate-output.py` und `mcp-waechter.py`
31
+ # suchten das Kernverzeichnis EINE Ebene unter der Wurzel und meldeten in jedem
32
+ # installierten Baum, es gebe keines; `cc-overlay-fuellen.py` entfaltete den Schlitz
33
+ # `Edit(<READ_ONLY_PATHS>)` nicht, den der Kern seit 1.5.0 fuehrt, und brach ab.
34
+ # D407 (Sonde) - an einer echten claude-code-Installation mit dem Kern unter
35
+ # `.koolie/core` finden beide Werkzeuge Pack und Skill.
36
+ # D407a (Gegenprobe) - ohne Kern erfinden sie keinen: dieselbe Meldung wie bisher.
37
+ # D407b (Sonde) - der Abgleich zwischen den Platzhaltern der erzeugten
38
+ # Berechtigungsdatei und der Liste des Fuellskripts meldet die
39
+ # Luecke von 1.11.0 (Liste ohne `<READ_ONLY_PATHS>`).
40
+ # D407c (Gegenprobe) - mit der ausgelieferten Liste bleibt keine Luecke.
41
+ # ⚠️ Grenze, benannt: D407b und D407c messen den ABGLEICH, nicht den Lauf des
42
+ # Fuellskripts; der braucht das Uebungsrepositorium, und eine Sonde, die daran haengt,
43
+ # bestuende auf einem Arbeitsplatz und fiele auf dem naechsten. Gelaufen ist das Skript
44
+ # im Messaufbau von 1.12.0 (Protokoll).
45
+ M407_KEIN_KERN = "weder ein installiertes Client Pack noch ein Kernverzeichnis"
46
+ M407_CODE = r"""
47
+ import importlib.util, json, sys
48
+ def lade(name, pfad):
49
+ spec = importlib.util.spec_from_file_location(name, pfad)
50
+ m = importlib.util.module_from_spec(spec)
51
+ spec.loader.exec_module(m)
52
+ return m
53
+ sys.path.insert(0, sys.argv[2])
54
+ vo = lade("_vo407", sys.argv[1])
55
+ mw = lade("_mw407", sys.argv[3])
56
+ pfad, grund = vo.skill_pfad(sys.argv[4], "fw-code-explain")
57
+ pack, _ = mw._manifest(sys.argv[4])
58
+ print(json.dumps({"pfad": pfad, "grund": grund, "pack": pack}))
59
+ """
60
+
61
+
62
+ def _407_gebraucht(quelltext: str) -> list:
63
+ """Die Liste GEBRAUCHT des Fuellskripts - gelesen, nicht nachgeschrieben."""
64
+ for knoten in ast.walk(ast.parse(quelltext)):
65
+ if isinstance(knoten, ast.Assign) and any(
66
+ isinstance(z, ast.Name) and z.id == "GEBRAUCHT" for z in knoten.targets):
67
+ return [e.value for e in knoten.value.elts]
68
+ return []
69
+
70
+
71
+ def _407_luecken(settings_text: str, gebraucht: list) -> list:
72
+ return sorted(set(re.findall(r"<[A-Z_]+>", settings_text)) - set(gebraucht))
73
+
74
+
75
+ def sonden_messapparat() -> None:
76
+ """Wirkungsnachweis fuer D-407 an einer echten claude-code-Installation."""
77
+ kern = os.path.join(QUELLE, ".koolie", "core")
78
+ vo = os.path.join(kern, "tests", "scripts", "validate-output.py")
79
+ erh = os.path.join(kern, "tests", "erhebungen")
80
+ mw = os.path.join(erh, "mcp-waechter.py")
81
+ ziel = tempfile.mkdtemp(prefix="lw-407-")
82
+ try:
83
+ root = os.path.join(ziel, "projekt")
84
+ os.makedirs(root)
85
+ p = unterprozess([sys.executable, os.path.join(kern, "install.py"),
86
+ "--client", "claude-code", "--root", root])
87
+ settings = lies(os.path.join(root, ".claude", "settings.json"))
88
+ # Der Kern im Baum, so weit die Werkzeuge ihn brauchen: Packs und Skillquellen.
89
+ shutil.copytree(os.path.join(kern, "clients"),
90
+ os.path.join(root, ".koolie", "core", "clients"))
91
+ shutil.copytree(os.path.join(kern, "framework"),
92
+ os.path.join(root, ".koolie", "core", "framework"))
93
+ q = unterprozess([sys.executable, "-c", M407_CODE, vo, erh, mw, root])
94
+ try:
95
+ ist = json.loads((q.stdout or "").strip().splitlines()[-1])
96
+ except (ValueError, IndexError):
97
+ ist = {}
98
+ erwartet = os.path.join(root, ".claude", "skills", "fw-code-explain", "SKILL.md")
99
+ ok = (p.returncode == 0 and q.returncode == 0 and ist.get("pack") == "claude-code"
100
+ and os.path.normcase(ist.get("pfad") or "") == os.path.normcase(erwartet))
101
+ melde("SONDE", "D407", ok,
102
+ "Kern unter .koolie/core: validate-output.py findet den Skill des "
103
+ "installierten Packs, mcp-waechter.py das Pack")
104
+ if not ok:
105
+ notiz(" Exit %d/%d, Ergebnis %r" % (p.returncode, q.returncode, ist))
106
+
107
+ shutil.rmtree(os.path.join(root, ".koolie", "core"))
108
+ q = unterprozess([sys.executable, "-c", M407_CODE, vo, erh, mw, root])
109
+ try:
110
+ ist = json.loads((q.stdout or "").strip().splitlines()[-1])
111
+ except (ValueError, IndexError):
112
+ ist = {}
113
+ ok = (q.returncode == 0 and ist.get("pack") is None and ist.get("pfad") is None
114
+ and M407_KEIN_KERN in (ist.get("grund") or ""))
115
+ melde("GEGENPROBE", "D407a", ok,
116
+ "Ohne Kern erfinden beide Werkzeuge keinen - dieselbe Meldung wie bisher")
117
+ if not ok:
118
+ notiz(" Exit %d, Ergebnis %r" % (q.returncode, ist))
119
+
120
+ gebraucht = _407_gebraucht(lies(os.path.join(erh, "cc-overlay-fuellen.py")))
121
+ luecke = _407_luecken(settings, [g for g in gebraucht if g != "<READ_ONLY_PATHS>"])
122
+ ok = p.returncode == 0 and luecke == ["<READ_ONLY_PATHS>"]
123
+ melde("SONDE", "D407b", ok,
124
+ "Der Abgleich meldet die Luecke von 1.11.0: die Liste des Fuellskripts "
125
+ "ohne <READ_ONLY_PATHS>")
126
+ if not ok:
127
+ notiz(" Luecke %r" % luecke)
128
+ luecke = _407_luecken(settings, gebraucht)
129
+ ok = p.returncode == 0 and bool(gebraucht) and luecke == []
130
+ melde("GEGENPROBE", "D407c", ok,
131
+ "Die ausgelieferte Liste deckt jeden Platzhalter der erzeugten "
132
+ "Berechtigungsdatei")
133
+ if not ok:
134
+ notiz(" GEBRAUCHT %r, Luecke %r" % (gebraucht, luecke))
135
+ finally:
136
+ aufraeumen(ziel)
137
+
138
+
139
+ buendel(sonden_messapparat,
140
+ "Der Messapparat findet den Kern unter .koolie/core, und das Fuellskript "
141
+ "entfaltet jeden Platzhalter der claude-code-Berechtigungsdatei")
142
+
143
+
144
+ # --- D-411: die Importkanaele, die devin-desktop seit 1.12.1 zulaesst (K-156) -----------
145
+ #
146
+ # 🔴 MIT `windsurf: false` LAEDT DEVIN CLI DIE EIGENE REGELABLAGE NICHT - gemessen mit
147
+ # 3000.11.1 und 3000.11.3. Das Pack laesst Windsurf-Quellen seither zu, und damit eine
148
+ # Regel im Benutzerprofil, die in jeder Sitzung laedt (D-290). `install.py` meldet die
149
+ # Kanaele aus `import_channels_report`, wenn sie belegt sind.
150
+ # D411 (Sonde) - devin-desktop mit nicht leerer global_rules.md in einem
151
+ # Ersatz-Benutzerprofil und `.windsurf/` im Projekt: Installation
152
+ # und Hebung nennen beide Kanaele. Gegen v1.12.0 faellt sie.
153
+ # D411a (Gegenprobe) - leere global_rules.md, kein `.windsurf/`: kein Hinweis. Ein
154
+ # Werkzeug, das immer warnt, besteht die Sonde auch.
155
+ M411_HINWEIS = "Die Importsteuerung dieses Client Packs laesst"
156
+ M411_GLOBAL = "~/.codeium/windsurf/memories/global_rules.md"
157
+ M411_PROJEKT = " .windsurf\n"
158
+
159
+
160
+ def sonden_importkanaele() -> None:
161
+ """Wirkungsnachweis fuer die Meldung aus D-411 an echten Installationen."""
162
+ werkzeug = os.path.join(QUELLE, ".koolie", "core", "install.py")
163
+ faelle = (("SONDE", "D411", True,
164
+ "Belegte Windsurf-Kanaele werden bei Installation und Hebung genannt"),
165
+ ("GEGENPROBE", "D411a", False,
166
+ "Ohne belegten Kanal bleibt der Hinweis aus"))
167
+ for art, kennung, belegt, was in faelle:
168
+ ziel = tempfile.mkdtemp(prefix="lw-411-")
169
+ try:
170
+ heim = os.path.join(ziel, "heim")
171
+ erinnerung = os.path.join(heim, ".codeium", "windsurf", "memories")
172
+ os.makedirs(erinnerung)
173
+ schreib(os.path.join(erinnerung, "global_rules.md"),
174
+ "Sonde D411.\n" if belegt else "")
175
+ root = os.path.join(ziel, "projekt")
176
+ os.makedirs(root)
177
+ if belegt:
178
+ os.makedirs(os.path.join(root, ".windsurf", "rules"))
179
+ umg = dict(os.environ, USERPROFILE=heim, HOME=heim)
180
+ p = unterprozess([sys.executable, werkzeug, "--client", "devin-desktop",
181
+ "--root", root], env=umg)
182
+ q = unterprozess([sys.executable, werkzeug, "--update", "--root", root], env=umg)
183
+ ein = (p.stdout or "") + (p.stderr or "")
184
+ heb = (q.stdout or "") + (q.stderr or "")
185
+ ist = tuple((M411_HINWEIS in t, M411_GLOBAL in t, M411_PROJEKT in t)
186
+ for t in (ein, heb))
187
+ soll = ((belegt, belegt, belegt),) * 2
188
+ ok = p.returncode == 0 and q.returncode == 0 and ist == soll
189
+ melde(art, kennung, ok, was)
190
+ if not ok:
191
+ notiz(" Exit %d/%d, (Hinweis, global, Projekt) = %s, erwartet %s"
192
+ % (p.returncode, q.returncode, ist, soll))
193
+ finally:
194
+ aufraeumen(ziel)
195
+
196
+
197
+ buendel(sonden_importkanaele,
198
+ "install.py nennt die Windsurf-Kanaele, die devin-desktop seit 1.12.1 zulaesst, "
199
+ "wenn sie belegt sind - und nur dann")
200
+
201
+
202
+ # --- D-471: die Ergebniszellen bleiben im Kern (CR-2026-160, K-56) ------------------------
203
+ #
204
+ # Ein Testblatt ist Regelquelle UND Aufzeichnung. install.py ersetzt in der Skillablage der
205
+ # Laufzeitschicht jede Ergebniszelle durch 'offen' mit Verweis auf die Kernfassung; die
206
+ # Kopie des Kerns bleibt, wie sie ist. Und eine Zeile, deren Striche nicht zum Kopf passen,
207
+ # bricht die Installation ab, statt eine halb gekuerzte Zelle weiterzugeben.
208
+ M471_ERSATZ = "(D-471)"
209
+ M471_ABBRUCH = "nicht sicher kuerzbar"
210
+ P471_BLATT = ("framework", "skills", "fw-refactor", "TESTS.md")
211
+ P471_BELEG = "tests/protocols/2026-09-26-testblaetter-modellwechsel.md"
212
+
213
+
214
+ def sonden_testblatt_kuerzung() -> None:
215
+ root = installation("claude-code")
216
+ try:
217
+ lauf = os.path.join(root, ".claude", "skills", *P471_BLATT[2:])
218
+ kern = os.path.join(root, ".koolie", "core", *P471_BLATT)
219
+ t_lauf, t_kern = lies(lauf), lies(kern)
220
+ zeilen = [z for z in t_lauf.split("\n") if z.startswith("| SK-007-")]
221
+ ok = bool(zeilen) and all(z.rstrip("\r").endswith(M471_ERSATZ + " |") for z in zeilen) \
222
+ and P471_BELEG not in t_lauf
223
+ melde("SONDE", "D471", ok, "Die Skillablage der Laufzeitschicht traegt die Testfaelle "
224
+ "ohne die Ergebnisse des Quellrepositoriums")
225
+ if not ok:
226
+ notiz(" %d Zeilen, Beleg in der Laufzeitfassung: %s"
227
+ % (len(zeilen), P471_BELEG in t_lauf))
228
+ ok = P471_BELEG in t_kern and M471_ERSATZ + " |" not in t_kern
229
+ melde("GEGENPROBE", "D471a", ok, "Die Kopie des Kerns behaelt ihre Ergebniszellen")
230
+ finally:
231
+ aufraeumen(os.path.dirname(root))
232
+ quelle = kopie()
233
+ ziel = tempfile.mkdtemp(prefix="lw-471-")
234
+ try:
235
+ blatt = os.path.join(quelle, ".koolie", "core", *P471_BLATT)
236
+ # eine Zeile mit einem Strich zu viel: die Kuerzung koennte die falsche Zelle treffen
237
+ ersetze(blatt, ("| SK-007-P02 | Befund melden statt beheben |",
238
+ "| SK-007-P02 | Befund melden | statt beheben |"))
239
+ p = unterprozess([sys.executable, os.path.join(quelle, ".koolie", "core", "install.py"),
240
+ "--client", "claude-code", "--root", ziel])
241
+ aus = (p.stdout or "") + (p.stderr or "")
242
+ ok = p.returncode != 0 and M471_ABBRUCH in aus
243
+ melde("SONDE", "D471b", ok, "Eine Tabellenzeile mit falscher Strichzahl bricht die "
244
+ "Installation ab, statt gekuerzt zu werden")
245
+ if not ok:
246
+ notiz(" Exit %d, Meldung: %s" % (p.returncode, M471_ABBRUCH in aus))
247
+ finally:
248
+ aufraeumen(ziel)
249
+ aufraeumen(quelle)
250
+
251
+
252
+ buendel(sonden_testblatt_kuerzung,
253
+ "install.py liefert die Testblaetter ohne die Ergebniszellen des Quellrepositoriums aus "
254
+ "und bricht bei einer Zeile ab, die es nicht sicher kuerzen kann")
255
+
256
+ # --- D-433/D-434: die Attributionsvorgabe des Clients und ihr Nachtrag (K-171) ----------
257
+ #
258
+ # 🔴 CLAUDE CODE GIBT DEM MODELL VON SICH AUS EINEN TRAILER Co-Authored-By VOR - gegen Q5,
259
+ # gemessen in SK-005-P01 (1.14.1). Das Pack schaltet ihn mit `attribution` ab, und zwar
260
+ # in OBJEKTFORM: Die Kurzform `false` laesst Staende vor 2.1.281 die ganze
261
+ # Einstellungsdatei verwerfen, mit Berechtigungen und Hooks (QC-7).
262
+ # D433 (Sonde) - die erzeugte Einstellungsdatei einer frischen claude-code-
263
+ # Installation traegt `attribution` als Objekt mit commit "" auf der
264
+ # obersten Ebene. Gegen v1.14.1 faellt sie.
265
+ # D434 (Sonde) - eine Hebung ueber eine Einstellungsdatei OHNE die beiden
266
+ # Zusatzschluessel nennt beide. Gegen v1.14.1 faellt sie.
267
+ # D434a (Gegenprobe) - eine Hebung ueber die frisch erzeugte Datei bleibt stumm. Ein
268
+ # Werkzeug, das immer warnt, besteht D434 auch.
269
+ M434_HINWEIS = "Das Client Pack deklariert Schluessel, die in"
270
+
271
+
272
+ def sonden_attribution() -> None:
273
+ """Wirkungsnachweis fuer D-433 und D-434 an echten Installationen."""
274
+ werkzeug = os.path.join(QUELLE, ".koolie", "core", "install.py")
275
+ ziel = tempfile.mkdtemp(prefix="lw-433-")
276
+ try:
277
+ root = os.path.join(ziel, "projekt")
278
+ os.makedirs(root)
279
+ p = unterprozess([sys.executable, werkzeug, "--client", "claude-code",
280
+ "--root", root])
281
+ pfad = os.path.join(root, ".claude", "settings.json")
282
+ cfg = json.loads(lies(pfad))
283
+ wert = cfg.get("attribution")
284
+ ok = (p.returncode == 0 and isinstance(wert, dict) and wert.get("commit") == ""
285
+ and "attribution" not in cfg.get("permissions", {}))
286
+ melde("SONDE", "D433", ok, "Die frische claude-code-Installation schaltet die "
287
+ "Attributionsvorgabe in Objektform auf der obersten Ebene ab")
288
+ if not ok:
289
+ notiz(" Exit %d, attribution = %r" % (p.returncode, wert))
290
+ for art, kennung, entfernen, was in (
291
+ ("GEGENPROBE", "D434a", False,
292
+ "Eine Hebung ueber die vollstaendige Einstellungsdatei bleibt stumm"),
293
+ ("SONDE", "D434", True,
294
+ "Eine Hebung ueber eine alte Einstellungsdatei nennt die fehlenden "
295
+ "Zusatzschluessel")):
296
+ if entfernen:
297
+ cfg = json.loads(lies(pfad))
298
+ cfg.pop("attribution", None)
299
+ cfg.pop("autoMemoryEnabled", None)
300
+ schreib(pfad, json.dumps(cfg, ensure_ascii=False, indent=2) + "\n")
301
+ q = unterprozess([sys.executable, werkzeug, "--update", "--root", root])
302
+ aus = (q.stdout or "") + (q.stderr or "")
303
+ ist = (M434_HINWEIS in aus, " attribution (oberste Ebene)" in aus,
304
+ " autoMemoryEnabled (oberste Ebene)" in aus)
305
+ soll = (entfernen,) * 3
306
+ ok = q.returncode == 0 and ist == soll
307
+ melde(art, kennung, ok, was)
308
+ if not ok:
309
+ notiz(" Exit %d, (Hinweis, attribution, autoMemory) = %s, erwartet %s"
310
+ % (q.returncode, ist, soll))
311
+ finally:
312
+ aufraeumen(ziel)
313
+
314
+
315
+ buendel(sonden_attribution,
316
+ "claude-code schaltet die Attributionsvorgabe des Clients ab, und install.py "
317
+ "--update nennt einen deklarierten Zusatzschluessel, der im Projekt fehlt")
318
+
319
+
320
+ # --- D-412: das Sonderziel des Arbeitsbereichs bei openai-codex (K-157) ------------------
321
+ #
322
+ # 🔴 SEIT CLIENTVERSION 0.157 IGNORIERT CODEX DIE FORM `:workspace/<pfad>`, UND MIT IHR
323
+ # WAR DER GANZE ARBEITSBEREICH SCHREIBGESCHUETZT - gemessen mit `codex sandbox` ohne
324
+ # Modellaufruf. Das Sonderziel heisst `:workspace_roots` und fuehrt seine Unterpfade als
325
+ # eigene Tabelle.
326
+ # D412 (Sonde) - die erzeugte config.toml einer echten Installation fuehrt die
327
+ # Tabelle `":workspace_roots"` mit "." = "write" und dem Kern als
328
+ # "read", und keinen Schluessel der alten Form. Gegen v1.12.0 faellt sie.
329
+ # D412a (Gegenprobe) - der Grundstock ":root" = "read" bleibt in der Dateisystemtabelle
330
+ # selbst: Ein Werkzeug, das ALLES in die Untertabelle schiebt,
331
+ # besteht die Sonde auch und nimmt dem Client das Leserecht.
332
+ M412_TABELLE = '[permissions.koolie.filesystem.":workspace_roots"]'
333
+
334
+
335
+ def _412_tabellen(text: str) -> dict:
336
+ tabellen, aktuell = {}, None
337
+ for zeile in text.splitlines():
338
+ zeile = zeile.strip()
339
+ if zeile.startswith("[") and zeile.endswith("]"):
340
+ aktuell = zeile
341
+ tabellen[aktuell] = {}
342
+ elif aktuell and " = " in zeile and not zeile.startswith("#"):
343
+ k, v = zeile.split(" = ", 1)
344
+ tabellen[aktuell][k.strip('"')] = v.strip('"')
345
+ return tabellen
346
+
347
+
348
+ def sonden_pfadtoken_codex() -> None:
349
+ """Wirkungsnachweis fuer D-412 an einer echten openai-codex-Installation."""
350
+ werkzeug = os.path.join(QUELLE, ".koolie", "core", "install.py")
351
+ ziel = tempfile.mkdtemp(prefix="lw-412-")
352
+ try:
353
+ root = os.path.join(ziel, "projekt")
354
+ os.makedirs(root)
355
+ p = unterprozess([sys.executable, werkzeug, "--client", "openai-codex", "--root", root])
356
+ text = lies(os.path.join(root, ".codex", "config.toml"))
357
+ tab = _412_tabellen(text)
358
+ unter = tab.get(M412_TABELLE, {})
359
+ alt = [k for t in tab.values() for k in t if k.startswith(":workspace/")
360
+ or k == ":workspace"]
361
+ ok = (p.returncode == 0 and unter.get(".") == "write"
362
+ and unter.get(".koolie/core") == "read" and not alt)
363
+ melde("SONDE", "D412", ok,
364
+ "openai-codex: der Arbeitsbereich steht als Tabelle :workspace_roots, "
365
+ "keine Schluessel der alten Form")
366
+ if not ok:
367
+ notiz(" Exit %d, Untertabelle %r, alte Schluessel %r"
368
+ % (p.returncode, unter, alt))
369
+ fs = tab.get("[permissions.koolie.filesystem]", {})
370
+ ok = p.returncode == 0 and fs.get(":root") == "read" and ":root" not in unter
371
+ melde("GEGENPROBE", "D412a", ok,
372
+ "Der Grundstock :root = read bleibt in der Dateisystemtabelle selbst")
373
+ if not ok:
374
+ notiz(" Dateisystemtabelle %r" % fs)
375
+ finally:
376
+ aufraeumen(ziel)
377
+
378
+
379
+ buendel(sonden_pfadtoken_codex,
380
+ "openai-codex: das Rechteprofil fuehrt den Arbeitsbereich in der Schreibweise "
381
+ "von Clientversion 0.157")
382
+
383
+
384
+ # --- D-414 bis D-417: das Client Pack kiro (CR-2026-150) --------------------------------
385
+ #
386
+ # Gemessen am 2026-09-26 mit kiro-cli 2.24.1: Die Berechtigungen stehen in einem
387
+ # Agentenprofil, das nur als AKTIVER Agent wirkt; fehlt es oder ist es kaputt, faellt der
388
+ # Client still auf seinen eingebauten Agenten zurueck (D-414). Das Schreibverbot auf die
389
+ # Laufzeitschicht nimmt die Spezifikationen aus (D-415). Die Menge der formatgebundenen
390
+ # Pruefungen fuehrte 76 statt 72 (D-416). Der Schutz-Hook sperrt nur mit Grund auf stderr
391
+ # (D-417). Alle Einheiten laufen an ECHTEN Installationen.
392
+ # D414 (Sonde) - die Abbildung: Profil mit exclude, Einstellungsdatei, Hook mit
393
+ # --sperrform stderr-grund, Regelvorlage mit inclusion: fileMatch.
394
+ # Gegen v1.12.1 faellt sie (kein Pack kiro).
395
+ # D414a (Gegenprobe) - eine Kernregel traegt KEINE Ladebedingung; eine Regel, die
396
+ # immer gilt, darf nicht an Dateimuster gebunden werden.
397
+ # 96..96f (Sonden) - Pruefung 96: Profil fehlt, kein JSON, Einstellung waehlt einen
398
+ # anderen Agenten, unbekannte Faehigkeit, deny-Regel entfernt,
399
+ # fremde allow-Regel, verbreiterte Ausnahme.
400
+ # 96g (Gegenprobe) - frische Installation: keine Meldung der Pruefung 96. Eine
401
+ # Pruefung, die immer meldet, bestuende die Sonden auch.
402
+ # D416 (Sonde) - Pruefung 72 erreicht das Agentenprofil: ein Skill ohne
403
+ # Freigaberegel wird gemeldet.
404
+ # D417 (Sonde) - Pruefung 86: ein Skript, dessen Form stderr-grund keinen Grund
405
+ # auf stderr schreibt, wird gemeldet.
406
+ # D417a (Gegenprobe) - das ausgelieferte Skript sperrt in dieser Form mit Exit 2 und
407
+ # Grund: keine Meldung.
408
+ M96 = ("Prüfung 96", "stille Rückfall", "Die Einstellung wählt ein Profil",
409
+ "kein gültiges JSON", "das Pack verlangt", "die der Client nicht kennt",
410
+ "die Kernquelle erzeugt 'deny", "erzeugt die Kernquelle nicht",
411
+ "mit einer anderen Ausnahme")
412
+ M96_FEHLT = "Die Einstellung wählt ein Profil, das es nicht gibt"
413
+ M96_JSON = "kein gültiges JSON"
414
+ M96_WERT = "das Pack verlangt"
415
+ M96_FAEHIGKEIT = "die der Client nicht kennt"
416
+ M96_DENY = "die Kernquelle erzeugt 'deny fs_read .env'"
417
+ M96_ALLOW = "erzeugt die Kernquelle nicht"
418
+ M96_AUSNAHME = "mit einer anderen Ausnahme"
419
+ M416_SKILL = "wird aber von keinem Eintrag der Berechtigungsdatei genannt"
420
+ M417_FORM = "Sperrform 'stderr-grund' verlangt Exit 2"
421
+
422
+
423
+ def _414_profil(root: str, aenderung) -> None:
424
+ pfad = os.path.join(root, ".kiro", "agents", "koolie.json")
425
+ daten = json.loads(lies(pfad))
426
+ aenderung(daten)
427
+ schreib(pfad, json.dumps(daten, indent=2, ensure_ascii=False) + "\n")
428
+
429
+
430
+ def _414_regeln_ohne(daten: dict, faehigkeit: str, effekt: str, muster: str) -> None:
431
+ for regel in daten["permissions"]["rules"]:
432
+ if regel["capability"] == faehigkeit and regel["effect"] == effekt:
433
+ if muster not in regel["match"]:
434
+ raise Praeparationsfehler("Muster %r fehlt in %s/%s" % (muster, faehigkeit, effekt))
435
+ regel["match"].remove(muster)
436
+ return
437
+ raise Praeparationsfehler("keine Regel %s/%s" % (faehigkeit, effekt))
438
+
439
+
440
+ def sonden_kiro() -> None:
441
+ """Wirkungsnachweis fuer D-414 bis D-417 an echten kiro-Installationen."""
442
+ root = installation("kiro")
443
+ try:
444
+ profil = json.loads(lies(os.path.join(root, ".kiro", "agents", "koolie.json")))
445
+ einst = json.loads(lies(os.path.join(root, ".kiro", "settings", "cli.json")))
446
+ hooks = json.loads(lies(os.path.join(root, ".kiro", "hooks", "koolie.json")))
447
+ vorlage = lies(os.path.join(root, ".kiro", "steering", "40-tech-TEMPLATE.md.template"))
448
+ regeln = profil.get("permissions", {}).get("rules", [])
449
+ ausnahme = [r for r in regeln if r.get("exclude") == [".kiro/specs/**"]
450
+ and r.get("match") == [".kiro/**"] and r.get("effect") == "deny"]
451
+ befehle = [h["action"]["command"] for h in hooks.get("hooks", [])
452
+ if h.get("trigger") == "PreToolUse"]
453
+ ok = (bool(ausnahme) and einst == {"chat.agentEngine": "v3", "chat.defaultAgent": "koolie"}
454
+ and profil.get("name") == "koolie" and len(befehle) == 1
455
+ and "--sperrform stderr-grund" in befehle[0]
456
+ and vorlage.startswith("---\ninclusion: fileMatch\nfileMatchPattern:\n"))
457
+ melde("SONDE", "D414", ok,
458
+ "kiro: Profil mit Ausnahme fuer .kiro/specs, Einstellung waehlt es, Hook mit "
459
+ "Sperrform stderr-grund, Regelvorlage mit inclusion: fileMatch")
460
+ if not ok:
461
+ notiz(" Ausnahme %r, Einstellung %r, Hook %r, Vorlage %r"
462
+ % (ausnahme, einst, befehle, vorlage[:60]))
463
+ kern = lies(os.path.join(root, ".kiro", "steering", "00-framework-core.md"))
464
+ ok = not kern.startswith("---")
465
+ melde("GEGENPROBE", "D414a", ok,
466
+ "Eine Kernregel traegt keine Ladebedingung und laedt immer")
467
+
468
+ frisch = validator_ausgabe(root)
469
+ treffer = [m for m in M96 if m in frisch]
470
+ melde("GEGENPROBE", "96g", not treffer,
471
+ "Frische Installation: Pruefung 96 meldet nichts")
472
+ if treffer:
473
+ notiz(" Meldungen: %r" % treffer)
474
+
475
+ faelle = (
476
+ ("96", "Profil fehlt", M96_FEHLT,
477
+ lambda r: os.remove(os.path.join(r, ".kiro", "agents", "koolie.json"))),
478
+ ("96a", "Profil ist kein gueltiges JSON", M96_JSON,
479
+ lambda r: schreib(os.path.join(r, ".kiro", "agents", "koolie.json"), '{ "name": ')),
480
+ ("96b", "Einstellung waehlt einen anderen Agenten", M96_WERT,
481
+ lambda r: schreib(os.path.join(r, ".kiro", "settings", "cli.json"),
482
+ '{"chat.agentEngine": "v3", "chat.defaultAgent": "kiro_default"}\n')),
483
+ ("96c", "Regel mit unbekannter Faehigkeit", M96_FAEHIGKEIT,
484
+ lambda r: _414_profil(r, lambda d: d["permissions"]["rules"].append(
485
+ {"capability": "fs_raed", "match": ["x"], "effect": "deny"}))),
486
+ ("96d", "deny-Muster der Kernquelle entfernt", M96_DENY,
487
+ lambda r: _414_profil(r, lambda d: _414_regeln_ohne(d, "fs_read", "deny", ".env"))),
488
+ ("96e", "fremde allow-Regel", M96_ALLOW,
489
+ lambda r: _414_profil(r, lambda d: d["permissions"]["rules"].append(
490
+ {"capability": "shell", "match": ["git commit*"], "effect": "allow"}))),
491
+ ("96f", "Ausnahme verbreitert", M96_AUSNAHME,
492
+ lambda r: _414_profil(r, lambda d: [x.__setitem__("exclude", [".kiro/**"])
493
+ for x in d["permissions"]["rules"]
494
+ if x.get("exclude")])),
495
+ ("D416", "Pruefung 72: Skill ohne Freigaberegel", M416_SKILL,
496
+ lambda r: _414_profil(r, lambda d: _414_regeln_ohne(d, "skill", "allow", "fw-plan"))),
497
+ )
498
+ # Die Kennungen stehen unten WOERTLICH: Pruefung 40 liest die Sondenmenge aus dem
499
+ # Quelltext (melde("SONDE", "<nr>")), und eine Kennung in einer Variablen ist fuer
500
+ # sie unsichtbar - dieselbe Lehre wie bei Pruefung 12 und os.path.join (0.88.0).
501
+ treffer = {}
502
+ for kennung, was, marke, praeparieren in faelle:
503
+ ziel = tempfile.mkdtemp(prefix="lw-414-")
504
+ try:
505
+ kopie_root = os.path.join(ziel, "projekt")
506
+ shutil.copytree(root, kopie_root)
507
+ praeparieren(kopie_root)
508
+ treffer[kennung] = (marke in validator_ausgabe(kopie_root), "kiro: " + was)
509
+ finally:
510
+ aufraeumen(ziel)
511
+ melde("SONDE", "96", *treffer["96"])
512
+ melde("SONDE", "96a", *treffer["96a"])
513
+ melde("SONDE", "96b", *treffer["96b"])
514
+ melde("SONDE", "96c", *treffer["96c"])
515
+ melde("SONDE", "96d", *treffer["96d"])
516
+ melde("SONDE", "96e", *treffer["96e"])
517
+ melde("SONDE", "96f", *treffer["96f"])
518
+ melde("SONDE", "D416", *treffer["D416"])
519
+
520
+ # Pruefung 86 an der Form des Packs: ein Skript, das in der Form stderr-grund
521
+ # nichts auf stderr schreibt, sperrt bei diesem Client nichts (D-417).
522
+ ziel = tempfile.mkdtemp(prefix="lw-417-")
523
+ try:
524
+ kopie_root = os.path.join(ziel, "projekt")
525
+ shutil.copytree(root, kopie_root)
526
+ skript = os.path.join(kopie_root, ".koolie", "core", "tests", "scripts",
527
+ "hook-check-secrets.py")
528
+ ersetze(skript, ('sys.stderr.write(reason.strip() or "Framework-Regel: gesperrt.")',
529
+ 'print(reason)'))
530
+ ausgabe = validator_ausgabe(kopie_root)
531
+ melde("SONDE", "D417", M417_FORM in ausgabe,
532
+ "Pruefung 86: Sperrform stderr-grund ohne Grund auf stderr wird gemeldet")
533
+ finally:
534
+ aufraeumen(ziel)
535
+ melde("GEGENPROBE", "D417a", M417_FORM not in frisch,
536
+ "Das ausgelieferte Skript sperrt in der Form stderr-grund mit Grund")
537
+ finally:
538
+ aufraeumen(os.path.dirname(root))
539
+
540
+
541
+ buendel(sonden_kiro,
542
+ "kiro: Agentenprofil, Einstellung, Ausnahme fuer die Spezifikationen und Sperrform "
543
+ "des Schutz-Hooks - an echten Installationen")
544
+
545
+
546
+ # --- Das Client Pack cursor (CR-2026-155, D-440 bis D-443) --------------------------
547
+ #
548
+ # Pruefung 97 und die Befunde des Baus, an echten Installationen. Die Faelle der
549
+ # Berechtigungsdatei sind je einer: ein fremder Schluessel (der Client startet nicht),
550
+ # kaputtes JSON, eine entfernte Kernzusage, ein fremdes allow, ein Rueckfragekorb, ein
551
+ # unbekannter Regeltyp, ein Pfadverbot, das nie trifft, und die Ausschlussdatei.
552
+
553
+ M97 = ("Prüfung 97", "Der Client nimmt auf Projektebene nur", "Der Client startet damit nicht",
554
+ "fehlt in permissions.deny", "in permissions.allow erzeugt die Kernquelle nicht",
555
+ "darf nur allow und deny führen", "ist keine Regel der Gestalt",
556
+ "trifft bei diesem Client nie", "Leseverbot '", "Ohne sie wertet das Suchwerkzeug")
557
+ M97_SCHLUESSEL = "Der Client nimmt auf Projektebene nur"
558
+ M97_JSON = "Der Client startet damit nicht"
559
+ M97_KERN = "die Kernzusage 'Read(*/.env)' fehlt in permissions.deny"
560
+ M97_ALLOW = "in permissions.allow erzeugt die Kernquelle nicht"
561
+ M97_KORB = "darf nur allow und deny führen"
562
+ M97_TYP = "ist keine Regel der Gestalt"
563
+ M97_NIE = "trifft bei diesem Client nie"
564
+ M97_IGNORE = "das Leseverbot '**/secrets/**' der Kernquelle fehlt"
565
+ M97_IGNORE_FEHLT = "Ohne sie wertet das Suchwerkzeug"
566
+ M440_ENDUNG = "Pflichtpfad fehlt: .cursor/rules/20-project-overlay.mdc"
567
+ M441_DURCHLASS = "verlangt beim Durchlass Exit 0"
568
+
569
+
570
+ def _440_cli(root: str, aenderung) -> None:
571
+ pfad = os.path.join(root, ".cursor", "cli.json")
572
+ daten = json.loads(lies(pfad))
573
+ aenderung(daten)
574
+ schreib(pfad, json.dumps(daten, ensure_ascii=False, indent=2) + "\n")
575
+
576
+
577
+ def _440_hook(eingabe: bytes, *argumente) -> tuple:
578
+ """Der Schutz-Hook, direkt aufgerufen: (Exit, stdout)."""
579
+ skript = os.path.join(QUELLE, ".koolie/core", "tests", "scripts", "hook-check-secrets.py")
580
+ p = subprocess.run([sys.executable, skript] + list(argumente), input=eingabe,
581
+ capture_output=True, timeout=60, cwd=QUELLE)
582
+ return p.returncode, p.stdout.decode("utf-8", "replace").strip()
583
+
584
+
585
+ def sonden_cursor() -> None:
586
+ """Wirkungsnachweis fuer D-440 bis D-443 an echten cursor-Installationen."""
587
+ root = installation("cursor")
588
+ try:
589
+ cli = json.loads(lies(os.path.join(root, ".cursor", "cli.json")))
590
+ hooks = json.loads(lies(os.path.join(root, ".cursor", "hooks.json")))
591
+ kern = lies(os.path.join(root, ".cursor", "rules", "00-framework-core.mdc"))
592
+ vorlage = lies(os.path.join(root, ".cursor", "rules", "40-tech-TEMPLATE.mdc.template"))
593
+ agent = lies(os.path.join(root, ".cursor", "agents", "fw-reviewer.md"))
594
+ ignore = lies(os.path.join(root, ".cursorignore")).splitlines()
595
+ deny = cli.get("permissions", {}).get("deny", [])
596
+ pre = hooks.get("hooks", {}).get("preToolUse", [])
597
+ ok = (set(cli) == {"permissions"} and set(cli["permissions"]) == {"allow", "deny"}
598
+ and "Read(*/.env)" in deny and "Read(*\\.env)" in deny
599
+ and hooks.get("version") == 1 and len(pre) == 1 and pre[0].get("failClosed") is True
600
+ and "--sperrform permission-json" in pre[0].get("command", "")
601
+ and kern.startswith("---\nalwaysApply: true\n---")
602
+ and vorlage.startswith("---\nalwaysApply: false\nglobs:\n")
603
+ and "\nreadonly: true\n" in agent and ".env" in ignore
604
+ and not os.path.exists(os.path.join(root, ".cursor", "rules",
605
+ "00-framework-core.md")))
606
+ melde("SONDE", "D440", ok,
607
+ "cursor: Berechtigungsdatei nur mit permissions, Muster in beiden Schreibweisen, "
608
+ "Hook mit failClosed und permission-json, Regeln als .mdc, readonly-Reviewer, "
609
+ ".cursorignore")
610
+ if not ok:
611
+ notiz(" cli %r, hooks %r, kern %r, vorlage %r"
612
+ % (sorted(cli), pre, kern[:40], vorlage[:40]))
613
+
614
+ frisch = validator_ausgabe(root)
615
+ treffer = [m for m in M97 if m in frisch]
616
+ melde("GEGENPROBE", "97g", not treffer,
617
+ "Frische Installation: Pruefung 97 meldet nichts")
618
+ if treffer:
619
+ notiz(" Meldungen: %r" % treffer)
620
+ melde("GEGENPROBE", "D441a", M441_DURCHLASS not in frisch,
621
+ "Das ausgelieferte Skript antwortet beim Durchlass in der Form permission-json")
622
+
623
+ faelle = (
624
+ ("97", "fremder Schluessel", M97_SCHLUESSEL,
625
+ lambda r: _440_cli(r, lambda d: d.__setitem__("_comment", "Sonde"))),
626
+ ("97a", "kein gueltiges JSON", M97_JSON,
627
+ lambda r: schreib(os.path.join(r, ".cursor", "cli.json"), '{ "permissions": ')),
628
+ ("97b", "Kernzusage entfernt", M97_KERN,
629
+ lambda r: _440_cli(r, lambda d: d["permissions"]["deny"].remove("Read(*/.env)"))),
630
+ ("97c", "fremde Freigabe", M97_ALLOW,
631
+ lambda r: _440_cli(r, lambda d: d["permissions"]["allow"].append("Shell(git commit)"))),
632
+ ("97d", "Rueckfragekorb", M97_KORB,
633
+ lambda r: _440_cli(r, lambda d: d["permissions"].__setitem__("ask", ["Write(**)"]))),
634
+ ("97e", "unbekannter Regeltyp", M97_TYP,
635
+ lambda r: _440_cli(r, lambda d: d["permissions"]["deny"].append("Exec(ls)"))),
636
+ ("97f", "Pfadverbot ohne fuehrenden Stern", M97_NIE,
637
+ lambda r: _440_cli(r, lambda d: d["permissions"]["deny"].append("Read(geheim/**)"))),
638
+ ("97h", "Ausschlussdatei ohne Zeile des Kerns", M97_IGNORE,
639
+ lambda r: ersetze(os.path.join(r, ".cursorignore"), ("**/secrets/**\n", ""))),
640
+ ("97i", "Ausschlussdatei fehlt", M97_IGNORE_FEHLT,
641
+ lambda r: os.remove(os.path.join(r, ".cursorignore"))),
642
+ ("D440b", "Laufzeitregel mit der Endung .md statt .mdc", M440_ENDUNG,
643
+ lambda r: os.rename(os.path.join(r, ".cursor", "rules", "20-project-overlay.mdc"),
644
+ os.path.join(r, ".cursor", "rules", "20-project-overlay.md"))),
645
+ ("D441", "Pruefung 86: Durchlass ohne Antwort", M441_DURCHLASS,
646
+ lambda r: ersetze(os.path.join(r, ".koolie", "core", "tests", "scripts",
647
+ "hook-check-secrets.py"),
648
+ (' print("{}")\r\n', ' pass\r\n'))),
649
+ )
650
+ # Die Kennungen stehen unten WOERTLICH (Pruefung 40 liest den Quelltext).
651
+ treffer = {}
652
+ for kennung, was, marke, praeparieren in faelle:
653
+ ziel = tempfile.mkdtemp(prefix="lw-440-")
654
+ try:
655
+ kopie_root = os.path.join(ziel, "projekt")
656
+ shutil.copytree(root, kopie_root)
657
+ praeparieren(kopie_root)
658
+ treffer[kennung] = (marke in validator_ausgabe(kopie_root), "cursor: " + was)
659
+ finally:
660
+ aufraeumen(ziel)
661
+ melde("SONDE", "97", *treffer["97"])
662
+ melde("SONDE", "97a", *treffer["97a"])
663
+ melde("SONDE", "97b", *treffer["97b"])
664
+ melde("SONDE", "97c", *treffer["97c"])
665
+ melde("SONDE", "97d", *treffer["97d"])
666
+ melde("SONDE", "97e", *treffer["97e"])
667
+ melde("SONDE", "97f", *treffer["97f"])
668
+ melde("SONDE", "97h", *treffer["97h"])
669
+ melde("SONDE", "97i", *treffer["97i"])
670
+ melde("SONDE", "D440b", *treffer["D440b"])
671
+ melde("SONDE", "D441", *treffer["D441"])
672
+ finally:
673
+ aufraeumen(os.path.dirname(root))
674
+
675
+ # Der Schutz-Hook selbst: BOM-feste Eingabe (D-441) und der Ordnername (D-442).
676
+ bom = b"\xef\xbb\xbf"
677
+ harmlos = json.dumps({"tool_name": "Read", "tool_input": {"file_path": "README.md"}})
678
+ code, aus = _440_hook(bom + harmlos.encode("utf-8"), "--fail-closed",
679
+ "--sperrform", "permission-json")
680
+ melde("SONDE", "D441b", code == 0 and aus == "{}",
681
+ "Schutz-Hook: Eingabe mit BOM wird gelesen, Durchlass antwortet {}")
682
+ geheim = json.dumps({"tool_name": "Read", "tool_input": {"file_path": ".env"}})
683
+ code, aus = _440_hook(bom + geheim.encode("utf-8"), "--fail-closed",
684
+ "--sperrform", "permission-json")
685
+ melde("GEGENPROBE", "D441c", code == 2 and '"deny"' in aus,
686
+ "Schutz-Hook: .env mit BOM-Eingabe bleibt gesperrt")
687
+ # D-463: gemessen am 2026-09-28 - die Eingabe kam mit ZWEI BOM an.
688
+ code, aus = _440_hook(bom + bom + harmlos.encode("utf-8"), "--fail-closed",
689
+ "--sperrform", "permission-json")
690
+ melde("SONDE", "D463", code == 0 and aus == "{}",
691
+ "Schutz-Hook: Eingabe mit zwei BOM wird gelesen, Durchlass antwortet {}")
692
+ code, aus = _440_hook(bom + bom + geheim.encode("utf-8"), "--fail-closed",
693
+ "--sperrform", "permission-json")
694
+ melde("GEGENPROBE", "D463a", code == 2 and '"deny"' in aus,
695
+ "Schutz-Hook: .env mit zwei BOM bleibt gesperrt")
696
+ ordner = json.dumps({"tool_name": "Grep", "tool_input": {"file_path": "secrets"}})
697
+ code, _ = _440_hook(ordner.encode("utf-8"), "--fail-closed")
698
+ melde("SONDE", "D442", code == 2,
699
+ "Schutz-Hook: eine Suche ueber den Ordner secrets wird gesperrt")
700
+ aehnlich = json.dumps({"tool_name": "Grep", "tool_input": {"file_path": "secretary.txt"}})
701
+ code, _ = _440_hook(aehnlich.encode("utf-8"), "--fail-closed")
702
+ melde("GEGENPROBE", "D442a", code == 0,
703
+ "Schutz-Hook: ein Name, der nur mit secret beginnt, bleibt frei")
704
+
705
+
706
+ buendel(sonden_cursor,
707
+ "cursor: Berechtigungsdatei, Ausschlussdatei, Regelendung und Sperrform des "
708
+ "Schutz-Hooks - an echten Installationen")
709
+
710
+
711
+ # --- Pruefungen 98 bis 100 und das Mandat (CR-2026-156, D-446 bis D-452) --------------
712
+ #
713
+ # Der erste Projekteinsatz (2026-09-27, devin-desktop): Der Hook sperrte nach dem INHALT
714
+ # (98), das Mandat muss dem Menschen gehoeren (99), und ein Skill mit Modellaufruf muss
715
+ # rein lesend sein (100). Das Buendel darunter misst das Mandat selbst an einer echten
716
+ # Installation - mit einem Git-Verzeichnis, denn ohne eines gibt es kein Mandat.
717
+ P98_HOOK = ".koolie/core/tests/scripts/hook-check-secrets.py".replace("/", os.sep)
718
+ P99_MANDAT = ".koolie/core/mandat.py".replace("/", os.sep)
719
+ P99_RECHTE = ".koolie/core/framework/runtime/permissions.json".replace("/", os.sep)
720
+ P100_SKILL = ".koolie/core/framework/skills/fw-docs-update/SKILL.md".replace("/", os.sep)
721
+ M98_INHALT = "weil sein Inhalt geschuetzte Pfade NENNT"
722
+ M98_ANKER = "Pruefung 98 misst"
723
+ M99_WERTE = "fuehren verschiedene Werte fuer"
724
+ M99_DENY = "sperrt das Overlay im deny-Korb"
725
+ M99_AUSKUNFT = "die Auskunft mandat.py status endet mit Exit 2"
726
+ M99_BESCHREIBUNG = "die Auskunft mit einer Beschreibung daneben endet mit Exit 2"
727
+ M99_FEHLT = "mandat.py fehlt"
728
+ M100_MODELL = "traegt den Trigger 'model', sperrt aber"
729
+
730
+ sonde("98", "Pruefung 98: der Hook misst wieder alle Zeichenketten eines Schreibwerkzeugs",
731
+ lambda r: ersetze(P(r, P98_HOOK), (" zu_pruefen = list(ziele)\r\n",
732
+ " zu_pruefen = list(strings)\r\n")),
733
+ M98_INHALT)
734
+ sonde("98a", "Pruefung 98: die Stufe der Ziele ist aus dem Hook verschwunden",
735
+ lambda r: ersetze(P(r, P98_HOOK), ("def ziele_der_schreiboperation(",
736
+ "def ziele_der_operation(", 1),
737
+ ("ziele = ziele_der_schreiboperation(tool_input)",
738
+ "ziele = ziele_der_operation(tool_input)")),
739
+ M98_ANKER)
740
+ gegenprobe("98", "Pruefung 98: der ausgelieferte Hook misst das Ziel", None, M98_INHALT)
741
+ sonde("99", "Pruefung 99: mandat.py fuehrt eine andere Hoechstdauer als der Hook",
742
+ lambda r: ersetze(P(r, P99_MANDAT), ("MANDAT_HOECHSTDAUER_MIN = 480",
743
+ "MANDAT_HOECHSTDAUER_MIN = 999")),
744
+ M99_WERTE)
745
+ sonde("99a", "Pruefung 99: die Kernquelle sperrt das Overlay wieder statisch",
746
+ lambda r: ersetze(P(r, P99_RECHTE), (
747
+ ' { "tool": "write", "pattern": "**/*.lock" },',
748
+ ' { "tool": "write", "pattern": ".koolie/project-overlay/**" },\r\n'
749
+ ' { "tool": "write", "pattern": "**/*.lock" },')),
750
+ M99_DENY)
751
+ sonde("99b", "Pruefung 99: der Hook sperrt auch die Auskunft 'mandat.py status'",
752
+ lambda r: ersetze(P(r, P98_HOOK), (
753
+ ' auskunft = verb == "exec" and nur_mandatsauskunft(tool_input)',
754
+ ' auskunft = False')),
755
+ M99_AUSKUNFT)
756
+ sonde("99d", "Pruefung 99: die Auskunft zaehlt wieder jede Zeichenkette mit 'mandat'",
757
+ lambda r: ersetze(P(r, P98_HOOK), (
758
+ ' return isinstance(befehl, str) and bool(MANDATSAUSKUNFT.match(befehl))',
759
+ ' strings = list(iter_strings(tool_input))\r\n'
760
+ ' befehle = [s for s in strings if "mandat" in s.lower()]\r\n'
761
+ ' return bool(befehle) and all(MANDATSAUSKUNFT.match(s) for s in befehle)')),
762
+ M99_BESCHREIBUNG)
763
+ sonde("99c", "Pruefung 99: mandat.py fehlt - der Hook kennt ein Mandat, das niemand erteilen kann",
764
+ lambda r: os.remove(P(r, P99_MANDAT)), M99_FEHLT)
765
+ gegenprobe("99", "Pruefung 99: Hook, mandat.py und Kernquelle passen zusammen", None, M99_WERTE)
766
+ sonde("100", "Pruefung 100: ein schreibender Skill traegt den Trigger 'model'",
767
+ lambda r: ersetze(P(r, P100_SKILL), ("triggers:\r\n - user\r\n---",
768
+ "triggers:\r\n - user\r\n - model\r\n---")),
769
+ M100_MODELL)
770
+ gegenprobe("100", "Pruefung 100: die modellaufrufbaren Skills sind rein lesend", None,
771
+ M100_MODELL)
772
+
773
+
774
+ # --- Pruefung 101 und das Mandat im Validator (CR-2026-157, D-459, D-461) -------------
775
+ #
776
+ # Die Vorpruefung zu 1.18.0 hat gemessen, dass claude-code eine Rueckfrage vor eine
777
+ # Freigabe stellt: Mit mcp__* im ask-Korb lief auch das einzeln freigegebene Lesewerkzeug
778
+ # nicht. Pruefung 101 haelt die Kernquelle frei von MCP-Freigaben und gleicht in einer
779
+ # Installation Overlay Abschnitt 13.2 mit der Berechtigungsdatei ab. Das Buendel misst an
780
+ # einer echten claude-code-Installation, weil nur dieses Pack die Regelform fuehrt.
781
+ M101_KERN = "gibt ein MCP-Werkzeug im allow-Korb frei"
782
+ M101_SCHREIB = "ein Schreibwerkzeug – es verlangt"
783
+ M101_MUSTER = "ein Muster für mehrere Werkzeuge"
784
+ M101_FEHLT = "fehlt in allow"
785
+ M101_PAUSCHAL = "steht im ask-Korb, während Overlay Abschnitt 13.2"
786
+ M461_WARN = "während eines Mandats noch nicht abgeglichen"
787
+ M461_FEHLER = "Overlay-Version widersprüchlich angegeben"
788
+
789
+ sonde("101", "Pruefung 101: die Kernquelle gibt ein MCP-Werkzeug vorab frei",
790
+ lambda r: ersetze(P(r, P99_RECHTE), (
791
+ ' { "tool": "read", "pattern": "**" },',
792
+ ' { "tool": "read", "pattern": "**" }, { "tool": "mcp", "pattern": "*" },')),
793
+ M101_KERN)
794
+ gegenprobe("101", "Pruefung 101: die ausgelieferte Kernquelle gibt kein MCP-Werkzeug frei", None,
795
+ M101_KERN)
796
+
797
+ P101_ZEILE_ALT = "| `<TBD: keine>` | – | – | – | – | – |"
798
+ P101_ZEILE = ("| `atlassian` | `<ISSUE_TRACKER>` | lesen für Planung, schreiben für Ablage | "
799
+ "`getJiraIssue`, `searchJiraIssuesUsingJql` | `createJiraIssue` | Projekt KOOL |")
800
+
801
+
802
+ def _p101_rechte(root: str, allow_dazu=(), ask_ohne=(), ask_dazu=()) -> None:
803
+ pfad = os.path.join(root, ".claude", "settings.json")
804
+ daten = json.loads(lies(pfad))
805
+ rechte = daten["permissions"]
806
+ rechte["allow"] = list(rechte["allow"]) + list(allow_dazu)
807
+ rechte["ask"] = [r for r in rechte["ask"] if r not in ask_ohne] + list(ask_dazu)
808
+ schreib(pfad, json.dumps(daten, ensure_ascii=False, indent=2) + "\n")
809
+
810
+
811
+ def sonden_mcp() -> None:
812
+ """Pruefung 101 und D-461 an einer echten claude-code-Installation."""
813
+ ziel = installation("claude-code")
814
+ try:
815
+ ov = os.path.join(ziel, ".koolie", "project-overlay", "OVERLAY.md")
816
+ ersetze(ov, (P101_ZEILE_ALT, P101_ZEILE))
817
+ rechte = os.path.join(ziel, ".claude", "settings.json")
818
+ grund = lies(rechte)
819
+ lesen = ["mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql"]
820
+
821
+ _p101_rechte(ziel, allow_dazu=["mcp__atlassian__createJiraIssue"])
822
+ melde("SONDE", "D459", M101_SCHREIB in validator_ausgabe(ziel),
823
+ "Ein Schreibwerkzeug der Freigabe steht in allow")
824
+ schreib(rechte, grund)
825
+ _p101_rechte(ziel, allow_dazu=["mcp__atlassian__*"])
826
+ melde("SONDE", "D459a", M101_MUSTER in validator_ausgabe(ziel),
827
+ "Ein Muster fuer den ganzen Server steht in allow")
828
+ schreib(rechte, grund)
829
+ melde("SONDE", "D459b", M101_FEHLT in strict_ausgabe(ziel),
830
+ "Mit strict-overlay: ein freigegebenes Lesewerkzeug fehlt in allow")
831
+ _p101_rechte(ziel, allow_dazu=lesen)
832
+ melde("SONDE", "D459c", M101_PAUSCHAL in strict_ausgabe(ziel),
833
+ "Mit strict-overlay: die pauschale MCP-Rueckfrage steht noch im ask-Korb")
834
+ schreib(rechte, grund)
835
+ _p101_rechte(ziel, allow_dazu=lesen, ask_ohne=["mcp__*"],
836
+ ask_dazu=["mcp__atlassian__createJiraIssue"])
837
+ text = strict_ausgabe(ziel)
838
+ melde("GEGENPROBE", "D459d", not any(m in text for m in (
839
+ M101_SCHREIB, M101_MUSTER, M101_FEHLT, M101_PAUSCHAL)),
840
+ "Lesewerkzeuge einzeln in allow, Schreibwerkzeug in ask, keine Pauschale")
841
+
842
+ # D-461: die Overlay-Version waehrend eines Mandats
843
+ ersetze(ov, ("| Overlay-Version | `<TBD: 0.1.0>` |", "| Overlay-Version | `0.4.2` |"))
844
+ mf = os.path.join(ziel, ".koolie", "project-overlay", "overlay-manifest.yaml")
845
+ ersetze(mf, ('overlay_version: "<TBD: 0.1.0>"', 'overlay_version: "0.4.1"'))
846
+ os.makedirs(os.path.join(ziel, ".git"))
847
+ text = validator_ausgabe(ziel)
848
+ melde("SONDE", "D461", M461_FEHLER in text and M461_WARN not in text,
849
+ "Ohne Mandat bleibt eine widerspruechliche Overlay-Version ein Fehler")
850
+ _mandat_setzen(ziel, ["overlay"])
851
+ text = validator_ausgabe(ziel)
852
+ melde("GEGENPROBE", "D461a", M461_WARN in text and M461_FEHLER not in text,
853
+ "Waehrend eines Mandats ist sie eine Warnung mit dem Befehl zum Abschluss")
854
+ _mandat_setzen(ziel, ["overlay"], minuten=-5)
855
+ melde("SONDE", "D461b", M461_FEHLER in validator_ausgabe(ziel),
856
+ "Ein abgelaufenes Mandat schwaecht die Meldung nicht ab")
857
+ finally:
858
+ aufraeumen(os.path.dirname(ziel))
859
+
860
+
861
+ def _mandat_hook(root: str, ereignis: dict) -> tuple:
862
+ """Der Schutz-Hook der Installation: (Exit, Ausgabe)."""
863
+ skript = os.path.join(root, ".koolie", "core", "tests", "scripts", "hook-check-secrets.py")
864
+ p = subprocess.run([sys.executable, skript, "--fail-closed"],
865
+ input=json.dumps(ereignis).encode("utf-8"), capture_output=True,
866
+ timeout=60, cwd=root)
867
+ return p.returncode, (p.stdout + p.stderr).decode("utf-8", "replace")
868
+
869
+
870
+ def _mandat_setzen(root: str, umfang, minuten: int = 30, projekt: str = "") -> None:
871
+ ende = (datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None)
872
+ + datetime.timedelta(minutes=minuten))
873
+ schreib(os.path.join(root, ".git", "koolie-mandat.json"), json.dumps({
874
+ "rolle": "Architekt", "umfang": umfang, "bis": ende.strftime("%Y-%m-%dT%H:%M:%SZ"),
875
+ "projekt": projekt or os.path.realpath(root)}))
876
+
877
+
878
+ def sonden_mandat() -> None:
879
+ """Das Mandat an einer echten Installation: es oeffnet, was es deckt, und nichts sonst."""
880
+ root = installation("devin-desktop")
881
+ try:
882
+ os.makedirs(os.path.join(root, ".git"))
883
+ overlay = {"tool_name": "write", "tool_input": {
884
+ "file_path": ".koolie/project-overlay/OVERLAY.md", "content": "x"}}
885
+ dokument = {"tool_name": "write", "tool_input": {
886
+ "file_path": ".koolie/project-overlay/documents/architecture/decisions/ADR-x.md",
887
+ "content": "x"}}
888
+ kern = {"tool_name": "write", "tool_input": {
889
+ "file_path": ".koolie/core/VERSION", "content": "x"}}
890
+
891
+ exit_ohne, text_ohne = _mandat_hook(root, overlay)
892
+ melde("SONDE", "D447", exit_ohne == 2 and "Gesperrt:" in text_ohne
893
+ and "Loesung:" in text_ohne and "mandat.py erteilen" in text_ohne,
894
+ "Ohne Mandat sperrt der Hook das Overlay - mit Blockade-Hinweis und Befehl")
895
+
896
+ _mandat_setzen(root, ["overlay"])
897
+ melde("GEGENPROBE", "D447a", _mandat_hook(root, overlay)[0] == 0,
898
+ "Mit gueltigem Mandat (Umfang overlay) schreibt der Client in das Overlay")
899
+ melde("SONDE", "D447b", _mandat_hook(root, kern)[0] == 2,
900
+ "Das Mandat oeffnet den Kern nicht")
901
+
902
+ _mandat_setzen(root, ["dokumente"])
903
+ melde("SONDE", "D447c", _mandat_hook(root, overlay)[0] == 2
904
+ and _mandat_hook(root, dokument)[0] == 0,
905
+ "Umfang dokumente: OVERLAY.md bleibt gesperrt, documents/ ist offen")
906
+
907
+ _mandat_setzen(root, ["overlay"], minuten=-5)
908
+ melde("SONDE", "D447d", _mandat_hook(root, overlay)[0] == 2,
909
+ "Ein abgelaufenes Mandat oeffnet nichts")
910
+ _mandat_setzen(root, ["overlay"], minuten=2000)
911
+ melde("SONDE", "D447e", _mandat_hook(root, overlay)[0] == 2,
912
+ "Ein Mandat ueber der Hoechstdauer oeffnet nichts")
913
+ _mandat_setzen(root, ["overlay"], projekt=os.path.dirname(root))
914
+ melde("SONDE", "D447f", _mandat_hook(root, overlay)[0] == 2,
915
+ "Ein Mandat eines anderen Projekts oeffnet nichts")
916
+ os.remove(os.path.join(root, ".git", "koolie-mandat.json"))
917
+
918
+ # Der Abgleich (D-452): Werte aus OVERLAY.md in die Laufzeitfassung.
919
+ ov = os.path.join(root, ".koolie", "project-overlay", "OVERLAY.md")
920
+ rt = os.path.join(root, ".devin", "rules", "20-project-overlay.md")
921
+ ersetze(ov, ("| Overlay-Version | `<TBD: 0.1.0>` |", "| Overlay-Version | `0.4.2` |"))
922
+ p = unterprozess([sys.executable, os.path.join(root, ".koolie", "core", "mandat.py"),
923
+ "abgleichen"])
924
+ text = lies(rt)
925
+ melde("SONDE", "D452", "Overlay-Version: `0.4.2`" in text
926
+ and "Overlay-Version -> 0.4.2" in (p.stdout or ""),
927
+ "mandat.py abgleichen uebernimmt die Overlay-Version in die Laufzeitfassung")
928
+ vorher = text
929
+ unterprozess([sys.executable, os.path.join(root, ".koolie", "core", "mandat.py"),
930
+ "abgleichen"])
931
+ melde("GEGENPROBE", "D452a", lies(rt) == vorher,
932
+ "Ein zweiter Abgleich aendert nichts mehr")
933
+ finally:
934
+ aufraeumen(os.path.dirname(root))
935
+
936
+
937
+ buendel(sonden_mandat,
938
+ "Das Mandat fuer M6 an einer echten Installation: Sperre mit Hinweis, Umfang, "
939
+ "Ablauf, Hoechstdauer, fremdes Projekt und der Abgleich der Laufzeitfassung")
940
+ buendel(sonden_mcp,
941
+ "Pruefung 101 und das Mandat im Validator an einer echten claude-code-Installation: "
942
+ "Schreibwerkzeug, Servermuster, fehlende Lesewerkzeuge, Pauschale und Overlay-Version")