@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,999 @@
1
+ """Sonden zu den Pruefungen 6, 14 und 18 bis 25, zum Schutz-Hook und zu install.py
2
+ (Skillliste, Aktivierungspruefung, Clientwahl, Erstinstallation, ignorierte Kerndateien,
3
+ Kennzeichen im Projekt, Schritte je Pack) und zur Mermaid-Umgebung.
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 io
12
+ import json
13
+ import os
14
+ import re
15
+ import shutil
16
+ import sys
17
+ import tempfile
18
+
19
+ from .apparat import (
20
+ aufraeumen, baumhash, buendel, eintragen, ersetze, gegenprobe, installation, kopie,
21
+ lauf, lies, melde, notiz, P, Praeparationsfehler, QUELLE, schreib, sonde,
22
+ strict_ausgabe, unterprozess, validator_ausgabe)
23
+
24
+
25
+ # --- 14: der Clientname im Kern ------------------------------------------------------
26
+ #
27
+ # Pruefung 14 gibt es seit 0.20.0 und sie hatte bis 0.57.1 KEINE Sonde - sie lag
28
+ # ausserhalb der Spanne "6 und 18 bis 47". Nach D-23 galt sie damit als nicht
29
+ # vorhanden. Wer sie aendert, baut sie nach; diese vier Einheiten holen das nach und
30
+ # belegen zugleich die Verschaerfung von D-129.
31
+ #
32
+ # Die Sonden lesen den Namen aus den Manifesten der Kopie, statt ihn zu schreiben:
33
+ # Eine Sonde, die einen Produktnamen raet, misst den geratenen Namen.
34
+ M14_NAME = "nennt ein Client-Produkt"
35
+ M14_PLATZHALTER = "traegt den Clientnamen"
36
+ M14_ANKER = "kein Client Pack mit manifest.json gefunden"
37
+ P14_WURZELQUELLE = ".koolie/core/framework/runtime/root-instruction.md".replace("/", os.sep)
38
+ P14_CHRONIK = ".koolie/core/tests/protocols/2026-09-18-sonde-14.md".replace("/", os.sep)
39
+
40
+
41
+ def _14_produktname(root: str) -> str:
42
+ """Kapitalisierter Produktname eines Packs - aus dessen Kennung, nicht geraten."""
43
+ base = P(root, ".koolie/core", "clients")
44
+ for name in sorted(os.listdir(base)):
45
+ if name.startswith("_"):
46
+ continue
47
+ mp = os.path.join(base, name, "manifest.json")
48
+ if os.path.exists(mp):
49
+ kennung = json.loads(lies(mp))["client"]
50
+ return " ".join(w.capitalize() for w in kennung.split("-"))
51
+ raise Praeparationsfehler(
52
+ "Kein Client Pack mit manifest.json unter clients/ - die Sonden zu 14 leiten "
53
+ "den Produktnamen von dort ab")
54
+
55
+
56
+ def _14_datei(root: str, name: str, inhalt: str) -> None:
57
+ """Eine neue Prompt-Datei mit vollstaendigem Steckbrief und der Inhaltszeile."""
58
+ schreib(P(root, (".koolie/core/prompts/" + name).replace("/", os.sep)),
59
+ "# Sondenvorlage\r\n\r\n"
60
+ "| Attribut | Wert |\r\n|---|---|\r\n"
61
+ "| ID | `FW-PR-015` |\r\n| Version | `0.1.0` |\r\n"
62
+ "| Status | `pilot` |\r\n"
63
+ "| Owner (Rolle) | `<FRAMEWORK_OWNER>` |\r\n\r\n"
64
+ + inhalt + "\r\n")
65
+
66
+
67
+ def _14_produktname_mit_zusatz(root: str) -> None:
68
+ """Der Produktname MIT ZUSATZ in einem Kerntraeger - bis 0.57.0 zulaessig.
69
+
70
+ Genau die Form, die D-28 erlaubte und die in fuenfzehn Fundstellen stand.
71
+ """
72
+ _14_datei(root, "15-sonde-produktname.md",
73
+ "Zugang zu %s ist Voraussetzung fuer die Uebung." % _14_produktname(root))
74
+
75
+
76
+ def _14_blosser_name(root: str) -> None:
77
+ """Der blosse Name als Handelnder - der Fall, den D-28 schon immer verbot.
78
+
79
+ Sie belegt, dass die Verschaerfung den ALTEN Gegenstand nicht verloren hat: Eine
80
+ neue Pruefung darf den Fall ihrer Vorgaengerin nicht mitnehmen.
81
+ """
82
+ _14_datei(root, "15-sonde-akteur.md",
83
+ "%s entscheidet, welche Datei geoeffnet wird."
84
+ % _14_produktname(root).split()[0])
85
+
86
+
87
+ def _14_platzhalter_mit_namen(root: str) -> None:
88
+ """Ein Platzhalter, der den Clientnamen traegt - der Fall aus CR-2026-070.
89
+
90
+ Der Marker stand acht Releases im Kern, weil die Akteurspruefung den
91
+ kapitalisierten Namen sucht und der Marker ihn GROSS schreibt.
92
+ """
93
+ _14_datei(root, "15-sonde-platzhalter.md",
94
+ "Stand: <VERIFY AGAINST CURRENT %s DOCUMENTATION>."
95
+ % _14_produktname(root).split()[0].upper())
96
+
97
+
98
+ def _14_anker_verlieren(root: str) -> None:
99
+ """Ohne manifest.json unter clients/ hat Pruefung 14 keine Namen mehr.
100
+
101
+ Bis 0.57.1 stieg sie an dieser Stelle STILL aus (`if not namen: return`) - eine
102
+ Pruefung, die ihren Gegenstand verliert und nichts sagt, ist nach D-23 keine.
103
+ """
104
+ base = P(root, ".koolie/core", "clients")
105
+ getroffen = 0
106
+ for name in sorted(os.listdir(base)):
107
+ mp = os.path.join(base, name, "manifest.json")
108
+ if os.path.exists(mp):
109
+ os.remove(mp)
110
+ getroffen += 1
111
+ if not getroffen:
112
+ raise Praeparationsfehler(
113
+ "Kein manifest.json unter clients/ - die Ankersonde zu 14 haette nichts "
114
+ "zu entfernen")
115
+
116
+
117
+ def _14_chronik(root: str) -> None:
118
+ """Ein Produktname in einem Protokoll bleibt zulaessig - es berichtet eine Messung."""
119
+ schreib(P(root, P14_CHRONIK),
120
+ "# Sondenprotokoll\r\n\r\nDer Lauf ist gegen %s gefahren worden.\r\n"
121
+ % _14_produktname(root))
122
+
123
+
124
+ def _14_platzhalter_gerendert(root: str) -> None:
125
+ """<CLIENT_NAME> in einer gerenderten Quelle - der einzige Weg, der offen bleibt.
126
+
127
+ Die Wurzel-Anweisungsdatei traegt ihn seit 0.7.0 im Titel und ist damit der einzige
128
+ angewandte Fall im ganzen Bestand. Die Gegenprobe legt einen zweiten daneben und
129
+ belegt, dass die verschaerfte Pruefung ihn nicht mitnimmt.
130
+ """
131
+ pfad = P(root, P14_WURZELQUELLE)
132
+ schreib(pfad, lies(pfad).rstrip("\r\n")
133
+ + "\r\n\r\nDiese Anweisung gilt fuer <CLIENT_NAME>.\r\n")
134
+
135
+
136
+ sonde("14a", "Der Produktname MIT ZUSATZ in einem Kerntraeger wird gemeldet - die "
137
+ "Ausnahme, die D-129 abgeschafft hat", _14_produktname_mit_zusatz, M14_NAME)
138
+
139
+ sonde("14b", "Der blosse Name als Handelnder wird weiterhin gemeldet - die Verschaerfung "
140
+ "hat den alten Gegenstand nicht verloren", _14_blosser_name, M14_NAME)
141
+
142
+ sonde("14c", "Ein Platzhalter mit Clientnamen wird gemeldet - er steht gross und entgeht "
143
+ "der Namenssuche", _14_platzhalter_mit_namen, M14_PLATZHALTER)
144
+
145
+ sonde("14d", "Ohne manifest.json unter clients/ meldet Pruefung 14 den verlorenen "
146
+ "Gegenstand, statt still auszusteigen", _14_anker_verlieren, M14_ANKER)
147
+
148
+ gegenprobe("14a", "Das unveraenderte Repositorium bleibt unbeanstandet - die fuenfzehn "
149
+ "Nennungen sind aufgeloest", None, M14_NAME)
150
+
151
+ gegenprobe("14b", "Ein Produktname in einem Protokoll bleibt zulaessig - Chronik "
152
+ "berichtet einen vergangenen Stand", _14_chronik, M14_NAME)
153
+
154
+ gegenprobe("14c", "<CLIENT_NAME> in einer gerenderten Quelle bleibt zulaessig - das ist "
155
+ "der Weg, den D-129 offen laesst", _14_platzhalter_gerendert, M14_NAME)
156
+
157
+
158
+ # --- 18: verwaister Hook-Dateiname in einer root-template-Vorlage -----------------
159
+ sonde("18b", "Verwaiste Hook-Datei als geliefertes Artefakt in der Vorlage",
160
+ lambda r: schreib(
161
+ P(r, ".koolie/core/clients/devin-desktop/root-template/.devin/README.md".replace("/", os.sep)),
162
+ lies(P(r, ".koolie/core/clients/devin-desktop/root-template/.devin/README.md".replace("/", os.sep)))
163
+ .replace("| `config.json` |", "| `hooks.v1.json` | Lebenszyklus-Hooks | `[DOK]` |\r\n| `config.json` |", 1)),
164
+ "hooks.v1.json")
165
+
166
+ gegenprobe("18b", "Erklaerende Nennung im Fliesstext bleibt unbeanstandet", None, "FEHLER")
167
+
168
+ # --- 19: Auskunftsabschnitt ------------------------------------------------------
169
+ def _entferne_abschnitt(root: str) -> None:
170
+ pfad = P(root, ".koolie/core/clients/devin-desktop/CLIENT_PACK.md".replace("/", os.sep))
171
+ text = lies(pfad)
172
+ start = text.index("## 7. Anweisungs- und Konfigurationsquellen")
173
+ ende = text.index("## 8. Änderungsverlauf")
174
+ schreib(pfad, text[:start] + text[ende:])
175
+
176
+
177
+ sonde("19", "Ein Pack ohne den Abschnitt ueber Anweisungs- und Konfigurationsquellen "
178
+ "ausserhalb des Projekts wird gemeldet", _entferne_abschnitt,
179
+ "Anweisungs- und Konfigurationsquellen außerhalb des Projekts' fehlt")
180
+
181
+
182
+ def _datum_entfernen(root: str) -> None:
183
+ pfad = P(root, ".koolie/core/clients/claude-code/CLIENT_PACK.md".replace("/", os.sep))
184
+ text = lies(pfad)
185
+ start = text.index("## 8. Anweisungs- und Konfigurationsquellen")
186
+ ende = text.index("## 9. Änderungsverlauf")
187
+ mitte = re.sub(r"\d{4}-\d{2}-\d{2}", "neulich", text[start:ende])
188
+ schreib(pfad, text[:start] + mitte + text[ende:])
189
+
190
+
191
+ sonde("19", "Eine Auskunft ohne Erhebungsdatum ist eine Behauptung ohne Stand und wird gemeldet", _datum_entfernen, "nennt keinen Erhebungsstand")
192
+ gegenprobe("19", "Vorlage mit <TBD>-Erhebungsstand laeuft durch", None, "Erhebungsstand")
193
+
194
+ # --- 20: Dokumenttabellen gegen Manifest -----------------------------------------
195
+ sonde("20", "Verfaelschter Wert in der Registrierungstabelle",
196
+ lambda r: schreib(P(r, ".koolie/core/docs/PLACEHOLDER_REGISTRY.md".replace("/", os.sep)),
197
+ lies(P(r, ".koolie/core/docs/PLACEHOLDER_REGISTRY.md".replace("/", os.sep)))
198
+ .replace("| `<SKILLS_DIR>` | Skill-Ablage | `.devin/skills`",
199
+ "| `<SKILLS_DIR>` | Skill-Ablage | `.devin/faehigkeiten`", 1)),
200
+ "<SKILLS_DIR> steht fuer 'devin-desktop'")
201
+
202
+ sonde("20", "Ein verfaelschter Pfad im Laufzeitglossar weicht vom Manifest des Packs ab und "
203
+ "wird gemeldet",
204
+ lambda r: schreib(P(r, ".koolie/core/docs/RUNTIME_GLOSSARY.md".replace("/", os.sep)),
205
+ lies(P(r, ".koolie/core/docs/RUNTIME_GLOSSARY.md".replace("/", os.sep)))
206
+ .replace("| **Agentenprofile** | Verzeichnis der Subagentenprofile | `.devin/agents/`",
207
+ "| **Agentenprofile** | Verzeichnis der Subagentenprofile | `.devin/profile/`", 1)),
208
+ "'Agentenprofile' steht fuer 'devin-desktop'")
209
+
210
+ gegenprobe("20", "Begriff ohne Manifestfeld und eingebettete Hook-Datei bleiben unbeanstandet",
211
+ None, "das Manifest fuehrt")
212
+
213
+ # D-421: Ein Pack ohne Spalte fiel still aus dem Abgleich - mit 1.13.0 fuehrten beide
214
+ # Tabellen kiro nicht. Die Sonde benennt die Spalte um; der Wert darunter bleibt stehen.
215
+ sonde("20", "Eine Tabelle ohne Spalte fuer ein Pack mit Manifest wird gemeldet",
216
+ lambda r: schreib(P(r, ".koolie/core/docs/RUNTIME_GLOSSARY.md".replace("/", os.sep)),
217
+ lies(P(r, ".koolie/core/docs/RUNTIME_GLOSSARY.md".replace("/", os.sep)))
218
+ .replace("| `openai-codex` | `kiro` |", "| `openai-codex` | `kiro-alt` |", 1)),
219
+ "die Tabelle fuehrt keine Spalte fuer 'kiro'")
220
+
221
+ gegenprobe("20", "Beide Tabellen fuehren je Pack eine Spalte", None, "fuehrt keine Spalte")
222
+
223
+ # --- 21: Hook-Skripte neutral ----------------------------------------------------
224
+ sonde("21", "Eine clientgebundene Umgebungsvariable im gemeinsamen Hook-Skript bindet es an "
225
+ "ein Pack und wird gemeldet",
226
+ lambda r: schreib(P(r, ".koolie/core/tests/scripts/hook-overlay-status.py".replace("/", os.sep)),
227
+ lies(P(r, ".koolie/core/tests/scripts/hook-overlay-status.py".replace("/", os.sep)))
228
+ .replace("root = argumente[0] if argumente else os.getcwd()",
229
+ 'root = argumente[0] if argumente else os.environ.get("DEVIN_PROJECT_DIR", os.getcwd())', 1)),
230
+ "ist die Umgebungsvariable des Packs")
231
+
232
+ sonde("21", "Laufzeitpfad eines Packs in der Pfadbildung",
233
+ lambda r: schreib(P(r, ".koolie/core/tests/scripts/hook-overlay-status.py".replace("/", os.sep)),
234
+ lies(P(r, ".koolie/core/tests/scripts/hook-overlay-status.py".replace("/", os.sep)))
235
+ .replace('candidates.append(os.path.join(root, ".koolie/project-overlay", "OVERLAY.md"))',
236
+ 'candidates.append(os.path.join(root, ".devin", "rules", "20-project-overlay.md"))', 1)),
237
+ "Hier wird ein Pfad aus")
238
+
239
+ gegenprobe("21", "Schutzmuster in hook-check-secrets.py bleiben unbeanstandet",
240
+ None, "hook-check-secrets.py")
241
+
242
+ # --- 22: Importsteuerung ---------------------------------------------------------
243
+ def _steuerung_verfaelschen(root: str) -> None:
244
+ # Seit 1.12.1 steht windsurf auf true (K-156, D-411); verfaelscht wird cursor.
245
+ pfad = P(root, ".devin", "config.json")
246
+ schreib(pfad, lies(pfad).replace('"cursor": false', '"cursor": true', 1))
247
+
248
+
249
+ sonde("22", "Ein verfaelschter Wert der Importsteuerung read_config_from weicht vom Manifest "
250
+ "ab und wird gemeldet", _steuerung_verfaelschen,
251
+ "die Importsteuerung 'read_config_from' steht als".replace("die ", "Die "))
252
+
253
+
254
+ def _steuerung_entfernen(root: str) -> None:
255
+ import json
256
+ pfad = P(root, ".devin", "config.json")
257
+ d = json.loads(lies(pfad))
258
+ d.pop("read_config_from", None)
259
+ schreib(pfad, json.dumps(d, indent=2, ensure_ascii=False) + "\n")
260
+
261
+
262
+ sonde("22", "Eine fehlende Importsteuerung read_config_from laesst offen, welche fremden "
263
+ "Konfigurationen der Client liest", _steuerung_entfernen,
264
+ "Die Importsteuerung 'read_config_from' fehlt")
265
+
266
+ gegenprobe("22", "Pack ohne import_control laeuft durch", None, "Importsteuerung")
267
+
268
+ # --- 23: normative Schluesselwoerter im HTML-Kommentar ---------------------------
269
+ sonde("23", "Normativer Satz im Kopfkommentar der Wurzel-Anweisungsdatei",
270
+ lambda r: schreib(P(r, ".koolie/core/framework/runtime/root-instruction.md".replace("/", os.sep)),
271
+ lies(P(r, ".koolie/core/framework/runtime/root-instruction.md".replace("/", os.sep)))
272
+ .replace("Was gilt, steht im Fließtext",
273
+ "Diese Datei darf nur über den Änderungsprozess geändert werden. "
274
+ "Was gilt, steht im Fließtext", 1)),
275
+ "steht in einem HTML-Kommentar")
276
+
277
+ sonde("23", "Normatives MUSS im Kommentar einer installierten Regeldatei",
278
+ lambda r: schreib(P(r, ".devin", "rules", "00-framework-core.md"),
279
+ "<!-- Herkunft: Ebene 3. Diese Regel MUSS geladen werden. -->\r\n"
280
+ + lies(P(r, ".devin", "rules", "00-framework-core.md"))),
281
+ "'MUSS' steht in einem HTML-Kommentar")
282
+
283
+ gegenprobe("23", "Herkunftsangaben im Kommentar bleiben unbeanstandet", None,
284
+ "HTML-Kommentar")
285
+
286
+ # --- 24: Nicht-Regeltexte in der Vorlage der Regelablage -------------------------
287
+ def _fremddatei(root: str) -> None:
288
+ basis = P(root, ".koolie/core/clients/devin-desktop/root-template/.devin/rules".replace("/", os.sep))
289
+ os.makedirs(basis, exist_ok=True)
290
+ schreib(os.path.join(basis, "README.md"), "# Erklaerender Text\r\n")
291
+
292
+
293
+ sonde("24", "Erklaerender Text in der Vorlage der Regelablage", _fremddatei, "kein Regeltext")
294
+
295
+
296
+ def _echte_regel(root: str) -> None:
297
+ basis = P(root, ".koolie/core/clients/devin-desktop/root-template/.devin/rules".replace("/", os.sep))
298
+ os.makedirs(basis, exist_ok=True)
299
+ schreib(os.path.join(basis, "40-tech-beispiel.md"), "---\r\ntrigger: glob\r\n---\r\n")
300
+
301
+
302
+ gegenprobe("24", "Regeltext nach Nummernschema bleibt unbeanstandet", _echte_regel,
303
+ "kein Regeltext")
304
+
305
+ # --- 6 (B03, D-39): Die Inhaltspruefung meldet die Fundstelle, nicht den Wert -----
306
+ #
307
+ # Diese Sonden pruefen **zwei** Bedingungen statt einer. Die erste - der Befund wird
308
+ # gemeldet - haette auch die alte Fassung bestanden: Sie meldete ja, und zwar mitsamt dem
309
+ # gefundenen Wert. Die zweite ist die eigentliche und der Grund dieses Blocks: Der
310
+ # Markerwert darf in der gesamten Ausgabe des Laufs nicht vorkommen.
311
+ #
312
+ # Die Marker sind bewusst eindeutig gewaehlt, damit ihr Fehlen etwas bedeutet. Ein Marker,
313
+ # der auch sonst im Repositorium vorkommen koennte, wuerde die zweite Bedingung entwerten -
314
+ # man wuesste nicht, ob er aus der Sonde stammt oder von woanders.
315
+ #
316
+ # Nicht abgedeckt: der Mermaid-Fehlerpfad. Er verlangt einen fehlschlagenden Lauf des
317
+ # externen Renderers; `mmdc` ist in dieser Umgebung nicht vorhanden. Die Stelle ist
318
+ # geaendert, aber unbelegt - das ist nach D-23 ein offener Punkt, kein erledigter.
319
+
320
+ B03_ZIEL = ".koolie/core/docs/ROADMAP.md".replace("/", os.sep)
321
+ B03_MAIL = "b03messmarke@sondenlauf-b03.test"
322
+ B03_IP = "10.203.44.91"
323
+ B03_HOST = "sondenlauf-b03.internal"
324
+ B03_URL = "https://sondenlauf-b03.example.net/b03"
325
+ B03_TERM = "Sondenlauf-B03-Sperrbegriff"
326
+ B03_SECRET = "AKIAB03MESSMARKE0000"
327
+
328
+
329
+ def _b03_anhaengen(*zeilen: str):
330
+ """Haengt Text an eine gepruefte Datei der Kopie - der Ort ist beliebig, der Wert nicht."""
331
+ def tun(root: str) -> None:
332
+ pfad = P(root, B03_ZIEL)
333
+ schreib(pfad, lies(pfad) + "\r\n" + "\r\n".join(zeilen) + "\r\n")
334
+ return tun
335
+
336
+
337
+ def _b03_term(root: str) -> None:
338
+ """Sperrbegriff: Er muss in die Liste **und** in eine gepruefte Datei.
339
+
340
+ Die schaerfste der sechs Kategorien. forbidden-terms.txt ist von der Inhaltspruefung
341
+ ausgenommen, weil dort reale Namen stehen - und die Diagnose schrieb den Namen dann
342
+ doch in die Ausgabe.
343
+ """
344
+ liste = P(root, ".koolie/project-overlay", "forbidden-terms.txt")
345
+ schreib(liste, lies(liste).rstrip("\r\n") + "\r\n" + B03_TERM + "\r\n")
346
+ _b03_anhaengen(f"Sondenzeile: {B03_TERM} steht hier absichtlich.")(root)
347
+
348
+
349
+ def sonde_ohne_wert(nummer: str, was: str, praeparieren, erwartet: str, marker: str) -> None:
350
+ """Sonde mit doppelter Bedingung: gemeldet **und** der Wert nicht in der Ausgabe.
351
+
352
+ Die Ausgabe wird bei einer Abweichung nur **bereinigt** gezeigt. Andernfalls truege die
353
+ Fehlermeldung dieser Sonde den Wert weiter, den die Sonde gerade als weitergetragen
354
+ beanstandet - derselbe Fehler eine Ebene hoeher.
355
+ """
356
+ def arbeit() -> None:
357
+ root = kopie()
358
+ try:
359
+ vorher = baumhash(root)
360
+ try:
361
+ praeparieren(root)
362
+ except Praeparationsfehler as exc:
363
+ melde("SONDE", nummer, False, was + " [Praeparation gebrochen]")
364
+ notiz(" " + str(exc))
365
+ return
366
+ if baumhash(root) == vorher:
367
+ melde("SONDE", nummer, False, was + " [nichts praepariert]")
368
+ return
369
+ ausgabe = lauf(root)
370
+ gemeldet = erwartet in ausgabe
371
+ verschwiegen = marker not in ausgabe
372
+ melde("SONDE", nummer, gemeldet and verschwiegen, was)
373
+ if not gemeldet:
374
+ bereinigt = ausgabe.replace(marker, "<Marker entfernt>")
375
+ notiz(" Befund nicht gemeldet. Ausgabe:",
376
+ " | ".join(bereinigt.splitlines()[:6]))
377
+ if not verschwiegen:
378
+ notiz(f" Der Markerwert steht in der Ausgabe - das ist B03 selbst. "
379
+ f"Erwartete Kennung: {erwartet}")
380
+ finally:
381
+ aufraeumen(os.path.dirname(root))
382
+
383
+ eintragen("SONDE", nummer, was, arbeit)
384
+
385
+
386
+ sonde_ohne_wert("6", "E-Mail-Adresse: gemeldet, Wert nicht ausgegeben",
387
+ _b03_anhaengen(f"Sondenzeile: {B03_MAIL}"),
388
+ "FW-CONTENT-EMAIL", B03_MAIL)
389
+
390
+ sonde_ohne_wert("6", "IP-Adresse: gemeldet, Wert nicht ausgegeben",
391
+ _b03_anhaengen(f"Sondenzeile: {B03_IP}"),
392
+ "FW-CONTENT-IP", B03_IP)
393
+
394
+ sonde_ohne_wert("6", "Interner Hostname: gemeldet, Wert nicht ausgegeben",
395
+ _b03_anhaengen(f"Sondenzeile: {B03_HOST}"),
396
+ "FW-CONTENT-HOST", B03_HOST)
397
+
398
+ sonde_ohne_wert("6", "URL ausserhalb der Allowlist: gemeldet, Wert nicht ausgegeben",
399
+ _b03_anhaengen(f"Sondenzeile: {B03_URL}"),
400
+ "FW-CONTENT-URL", B03_URL)
401
+
402
+ sonde_ohne_wert("6", "Gesperrter Begriff: gemeldet, Begriff nicht ausgegeben",
403
+ _b03_term, "FW-CONTENT-TERM", B03_TERM)
404
+
405
+ sonde_ohne_wert("6", "Secret-Muster: gemeldet mit Fundstelle, Wert nicht ausgegeben",
406
+ _b03_anhaengen(f"Sondenzeile: {B03_SECRET}"),
407
+ "FW-CONTENT-SECRET", B03_SECRET)
408
+
409
+
410
+ def _b03_erlaubte_faelle(root: str) -> None:
411
+ """Die Gegenprobe: dieselben Kategorien in ihrer erlaubten Gestalt.
412
+
413
+ Ohne sie belegt der Block nur, dass die Pruefung meldet - nicht, dass sie das Richtige
414
+ meldet. Eine Pruefung, die jede Adresse beanstandet, besteht alle sechs Sonden oben.
415
+ """
416
+ _b03_anhaengen(
417
+ "Gegenprobe: kontakt@example.com ist eine Dokumentationsadresse.",
418
+ "Gegenprobe: 203.0.113.7 stammt aus dem Dokumentationsbereich.",
419
+ "Gegenprobe: https://docs.devin.ai/ steht auf der Allowlist.",
420
+ )(root)
421
+
422
+
423
+ gegenprobe("6", "Dokumentationsadresse, Dokumentations-IP und Allowlist-URL bleiben unbeanstandet",
424
+ _b03_erlaubte_faelle, "FW-CONTENT-")
425
+
426
+
427
+ def _gitignore_beilage(root: str) -> None:
428
+ """Eine ignorierte Datei mit einem Befund - und eine gleichartige daneben.
429
+
430
+ 🔴 Der Gegenstand von D-215: Was die `.gitignore` als einfachen Dateinamen
431
+ fuehrt, ist nicht eingecheckt und damit kein Bestandteil des Repositoriums.
432
+ Gemessen am 2026-09-20 an der lokalen Beilage der Uebergabe, die Servername
433
+ und Konto traegt und deshalb ueberhaupt existiert.
434
+ """
435
+ gi = os.path.join(root, ".gitignore")
436
+ alt = io.open(gi, encoding="utf-8", newline="").read()
437
+ daten = (alt.rstrip("\r\n") + "\r\nPROBE-IGNORIERT.md\r\n").encode("utf-8")
438
+ io.open(gi, "wb").write(daten)
439
+ # Die ignorierte Datei traegt einen Befund, der ohne D-215 gemeldet wuerde.
440
+ inhalt = ("# Probe\r\n\r\nServer: 10.11.12.13\r\n").encode("utf-8")
441
+ io.open(os.path.join(root, "PROBE-IGNORIERT.md"), "wb").write(inhalt)
442
+
443
+
444
+ def _gitignore_nicht_gefuehrt(root: str) -> None:
445
+ """Dieselbe Datei unter einem Namen, den die .gitignore NICHT fuehrt."""
446
+ inhalt = ("# Probe\r\n\r\nServer: 10.11.12.13\r\n").encode("utf-8")
447
+ io.open(os.path.join(root, "PROBE-GEFUEHRT.md"), "wb").write(inhalt)
448
+
449
+
450
+ sonde("6i", "Eine NICHT ignorierte Datei mit IP-Adresse wird weiter gemeldet",
451
+ _gitignore_nicht_gefuehrt, "FW-CONTENT-IP")
452
+ gegenprobe("6i", "Eine in der .gitignore gefuehrte Datei wird uebersprungen "
453
+ "(D-215)",
454
+ _gitignore_beilage, "FW-CONTENT-IP")
455
+
456
+ def sonde_hook_zusatzmuster() -> None:
457
+ """Dieselbe Regel im ausgelieferten Hook - ohne Validatorlauf, weil keiner noetig ist.
458
+
459
+ Ein ungueltiges Zusatzmuster wurde bis 0.26.0 mitsamt seinem Wert nach stderr
460
+ geschrieben. Projektspezifische Pfadmuster tragen Projekt-, Kunden- und Hostnamen.
461
+ """
462
+ marker = "b03hookmarke.internal"
463
+ umgebung = dict(os.environ, FW_HOOK_EXTRA_PATH_PATTERNS=marker + "/[")
464
+ p = unterprozess(
465
+ [sys.executable, os.path.join(QUELLE, ".koolie/core", "tests", "scripts",
466
+ "hook-check-secrets.py")],
467
+ input='{"tool_name": "Read", "tool_input": {"file_path": "beispiel.txt"}}',
468
+ env=umgebung)
469
+ ausgabe = (p.stdout or "") + (p.stderr or "")
470
+ gemeldet = "Ungueltiges Zusatzmuster an Position 1" in ausgabe
471
+ verschwiegen = marker not in ausgabe
472
+ melde("SONDE", "6h", gemeldet and verschwiegen,
473
+ "Hook: ungueltiges Zusatzmuster gemeldet, Wert nicht ausgegeben")
474
+ if not gemeldet:
475
+ notiz(" Meldung fehlt. Ausgabe:",
476
+ " | ".join(ausgabe.replace(marker, "<Marker entfernt>").splitlines()[:4]))
477
+ if not verschwiegen:
478
+ notiz(" Der Markerwert steht in der Ausgabe - das ist B03 im Hook.")
479
+
480
+
481
+ buendel(sonde_hook_zusatzmuster,
482
+ "Der ausgelieferte Hook meldet ein ungueltiges Zusatzmuster, ohne dessen Wert "
483
+ "auszugeben - projektspezifische Pfadmuster tragen Projekt-, Kunden- und Hostnamen")
484
+
485
+
486
+ # --- 25 (D-41): Ein Ausfall ohne benannten Ersatz -------------------------------
487
+ #
488
+ # Die Sonde nimmt der S5-Zeile das Wort, auf das die Pruefung sieht. Das ist die ganze
489
+ # Bauart der Pruefung - sie kann nicht beurteilen, ob ein Ersatz taugt, nur dass jemand
490
+ # die Frage beantwortet hat.
491
+
492
+ def _b40_ersatz_entfernen(root: str) -> None:
493
+ pfad = P(root, ".koolie/core/clients/claude-code/CLIENT_PACK.md".replace("/", os.sep))
494
+ schreib(pfad, lies(pfad).replace("Ersatz", "Behelf"))
495
+
496
+
497
+ sonde("25", "Zeile auf [NICHT ABBILDBAR] ohne benannten Ersatz",
498
+ _b40_ersatz_entfernen, "Zeile S5 steht auf [NICHT ABBILDBAR]")
499
+
500
+ # Die Zusammenfassungstabelle desselben Dokuments fuehrt dieselbe Klasse als
501
+ # Zeilenbeschriftung und nennt keinen Ersatz. Eine Pruefung, die jede Zeile mit der Klasse
502
+ # meldet, beanstandet sie - und besteht die Sonde darueber trotzdem.
503
+ gegenprobe("25", "Klassenzeile der Zusammenfassungstabelle bleibt unbeanstandet",
504
+ None, "steht auf [NICHT ABBILDBAR]")
505
+
506
+
507
+ # --- 25b (D-480): die Kennung mit zwei Buchstaben ------------------------------------
508
+ #
509
+ # Bis 1.19.1 las Pruefung 25 die Zeilenkennung mit dem Muster von Pruefung 31, das nur
510
+ # EINEN Buchstaben kennt: Dieselbe Konstante stand zweimal im Validator, und die spaetere
511
+ # Bindung galt fuer beide. Gefunden hat es die Aufteilung, nicht ein Lauf - heute fuehrt
512
+ # kein Pack eine solche Zeile. Die Sonde legt eine an, die keinen Ersatz nennt.
513
+ P25B_PACK = ".koolie/core/clients/claude-code/CLIENT_PACK.md"
514
+
515
+
516
+ def _25b_zwei_buchstaben(root: str) -> None:
517
+ pfad = P(root, P25B_PACK.replace("/", os.sep))
518
+ text = lies(pfad)
519
+ zeilen = [z for z in text.split("\n") if z.startswith("| S5 |")]
520
+ if len(zeilen) != 1:
521
+ raise Praeparationsfehler("Sonde 25b: die Zeile S5 steht %dmal im Pack"
522
+ % len(zeilen))
523
+ neu = zeilen[0].replace("| S5 |", "| SX5 |", 1).replace("Ersatz", "Behelf")
524
+ schreib(pfad, text.replace(zeilen[0], zeilen[0] + "\n" + neu, 1))
525
+
526
+
527
+ sonde("25b", "Eine Zeile mit zwei Buchstaben in der Kennung auf [NICHT ABBILDBAR] ohne "
528
+ "Ersatz wird gemeldet - bis 1.19.1 sah Pruefung 25 sie nicht",
529
+ _25b_zwei_buchstaben, "Zeile SX5 steht auf [NICHT ABBILDBAR]")
530
+
531
+
532
+ # --- E3 (D-42): install.py --list-skills -----------------------------------------
533
+ #
534
+ # Kein Validatorlauf: Der Gegenstand ist ein Kommando, kein Artefakt. Gemessen wird an
535
+ # seiner Ausgabe.
536
+
537
+ def sonde_list_skills() -> None:
538
+ """Wirkungsnachweis fuer den Ersatz, den D-42 an die Stelle der Clientauskunft setzt.
539
+
540
+ Drei Bedingungen, und die dritte ist die, an der dieses Projekt seine Befunde findet:
541
+ Eine Teilauskunft, die ihre Grenze nicht nennt, verspricht mehr, als sie leistet.
542
+ """
543
+ root = kopie()
544
+ try:
545
+ ablage = P(root, ".devin", "skills")
546
+ # Sonde: ein Skill, den keine Kernquelle liefert - Herkunft muss 'Projekt' sein.
547
+ os.makedirs(os.path.join(ablage, "sonde-d41-projektskill"), exist_ok=True)
548
+ schreib(os.path.join(ablage, "sonde-d41-projektskill", "SKILL.md"),
549
+ "---\r\nname: sonde-d41-projektskill\r\ntriggers:\r\n - user\r\n---\r\n")
550
+ # Gegenprobe: ein Verzeichnis ohne SKILL.md ist kein Skill.
551
+ os.makedirs(os.path.join(ablage, "sonde-d41-kein-skill"), exist_ok=True)
552
+
553
+ p = unterprozess([sys.executable, os.path.join(root, ".koolie/core", "install.py"),
554
+ "--client", "devin-desktop", "--root", root, "--list-skills"])
555
+ ausgabe = (p.stdout or "") + (p.stderr or "")
556
+
557
+ gefuehrt = "sonde-d41-projektskill" in ausgabe
558
+ herkunft = bool(re.search(r"sonde-d41-projektskill\s+Projekt\s+nur Nutzer", ausgabe))
559
+ melde("SONDE", "D41", gefuehrt and herkunft,
560
+ "Skill ohne Kernquelle: gefuehrt, Herkunft 'Projekt', Aufrufbarkeit gelesen")
561
+ if not (gefuehrt and herkunft):
562
+ notiz(" Ausgabe:", " | ".join(ausgabe.splitlines()[:8]))
563
+
564
+ melde("GEGENPROBE", "D41", "sonde-d41-kein-skill" not in ausgabe,
565
+ "Verzeichnis ohne SKILL.md wird nicht als Skill gefuehrt")
566
+
567
+ melde("SONDE", "D41", "kein vollstaendiger Ersatz" in ausgabe,
568
+ "Die Auskunft nennt ihre eigene Grenze in der Ausgabe")
569
+ finally:
570
+ aufraeumen(os.path.dirname(root))
571
+
572
+
573
+ buendel(sonde_list_skills,
574
+ "Die Skillauskunft von install.py fuehrt einen Projektskill mit richtiger Herkunft, "
575
+ "uebergeht ein Verzeichnis ohne SKILL.md und nennt ihre eigene Grenze")
576
+
577
+
578
+ # --- strict-overlay (D-44): Aktivierungspruefung, dieselben Faelle je Pack --------
579
+ #
580
+ # Diese Sonden brauchen eine **Installation**, keine Kopie des Repositoriums: Die
581
+ # Aktivierungspruefung liest die Laufzeitschicht eines Projekts. Das macht sie teurer als
582
+ # alle uebrigen - und es ist der Grund, warum der Befund so lange unbemerkt blieb. Eine
583
+ # Sonde, die nur im Repositorium laeuft, kann ihn nicht finden.
584
+ #
585
+ # Der Kern des Nachweises ist die Wiederholung je Pack. B02 war nicht, dass eine Pruefung
586
+ # falsch prueft, sondern dass sie **einen Client gar nicht sieht**. Das faellt nur auf, wenn
587
+ # derselbe Fall in jeder Installation laeuft.
588
+
589
+ SO_STATUSFORMEN = (
590
+ (re.compile(r"^(\|\s*Overlay-Status\s*\|\s*)`?[^`|]+`?", re.M), r"\1`{}`"),
591
+ (re.compile(r"^(-\s*Overlay-Status:\s*)`?[^`\n]+`?", re.M), r"\1`{}`"),
592
+ )
593
+ SO_PLATZHALTER = re.compile(r"<[A-Z][A-Z0-9_]{2,}>|<TBD[^>]*>")
594
+
595
+
596
+ def _so_status(pfad: str, wert: str) -> None:
597
+ t = lies(pfad)
598
+ for muster, ersatz in SO_STATUSFORMEN:
599
+ t = muster.sub(ersatz.format(wert), t)
600
+ schreib(pfad, t)
601
+
602
+
603
+ def sonden_aktivierungspruefung() -> None:
604
+ """Dieselben Faelle in jeder Installation (B02, D-44)."""
605
+ for pack in ("claude-code", "devin-desktop"):
606
+ root = installation(pack)
607
+ try:
608
+ man = json.loads(lies(os.path.join(QUELLE, ".koolie/core", "clients", pack,
609
+ "manifest.json")))
610
+ regel = os.path.join(root, *man["pack_runtime_dir"].split("/"),
611
+ "20-project-overlay.md")
612
+ rechte = os.path.join(root, *man["permissions_file"].split("/"))
613
+ overlay = os.path.join(root, ".koolie/project-overlay", "OVERLAY.md")
614
+
615
+ # --- Status: 'aktiv' ist aktiv, alles andere nicht ---------------------
616
+ for pfad in (regel, overlay):
617
+ _so_status(pfad, "aktiv")
618
+ aus = strict_ausgabe(root)
619
+ melde("GEGENPROBE", "SO", "Overlay-Status ist nicht" not in aus,
620
+ f"Status 'aktiv' bleibt unbeanstandet ({pack})")
621
+
622
+ # 'aktivierung-ausstehend' bestand bis 0.27.0 die Pruefung - der Vergleich
623
+ # war ein Praefixvergleich. Ein Wert, der sagt, dass die Aktivierung
624
+ # aussteht, liess den Fehler sogar verschwinden.
625
+ _so_status(regel, "aktivierung-ausstehend")
626
+ aus = strict_ausgabe(root)
627
+ melde("SONDE", "SO", "sondern 'aktivierung-ausstehend'" in aus,
628
+ f"Status 'aktivierung-ausstehend' wird gemeldet ({pack})")
629
+ _so_status(regel, "aktiv")
630
+
631
+ # --- Berechtigungsdatei: Platzhalter ------------------------------------
632
+ schreib(rechte, SO_PLATZHALTER.sub("platzhalterfrei", lies(rechte)))
633
+ aus = strict_ausgabe(root)
634
+ melde("GEGENPROBE", "SO", "enthält noch Platzhalter" not in aus,
635
+ f"Bereinigte Berechtigungsdatei bleibt unbeanstandet ({pack})")
636
+
637
+ ersetze(rechte,
638
+ ('"permissions"',
639
+ '"_sonde": "<TBD: offen>",\r\n "permissions"'))
640
+ aus = strict_ausgabe(root)
641
+ melde("SONDE", "SO", "enthält noch Platzhalter" in aus,
642
+ f"Platzhalter in der Berechtigungsdatei wird gemeldet ({pack})")
643
+
644
+ # --- Fehlender sicherheitsrelevanter Abschnitt ---------------------------
645
+ # Bis 0.27.0 stand ein Overlay ohne Abschnitt 13 besser da als eines mit
646
+ # einem offenen Wert darin: Die Pruefung sah nur in vorhandene Abschnitte.
647
+ t = lies(overlay)
648
+ start = t.index("## 13.")
649
+ ende = t.index("## 14.")
650
+ schreib(overlay, t[:start] + t[ende:])
651
+ aus = strict_ausgabe(root)
652
+ melde("SONDE", "SO", "Abschnitt ## 13. fehlt" in aus,
653
+ f"Fehlender sicherheitsrelevanter Abschnitt wird gemeldet ({pack})")
654
+ finally:
655
+ aufraeumen(os.path.dirname(root))
656
+
657
+
658
+ buendel(sonden_aktivierungspruefung,
659
+ "Die Aktivierungspruefung gegen je eine frische Installation beider Packs: "
660
+ "Overlay-Status, Platzhalter in der Berechtigungsdatei, fehlender Abschnitt 13")
661
+
662
+
663
+ # --- B10 (D-45): Die Aktualisierung trifft das installierte Pack -----------------
664
+ #
665
+ # Kein Validatorlauf: Der Gegenstand ist das Installationswerkzeug. Gemessen wird an dem,
666
+ # was es anlegt - und vor allem an dem, was es **nicht** anlegt.
667
+ #
668
+ # Die Gegenprobe ist hier die wichtigere Haelfte. Dass eine Aktualisierung das richtige
669
+ # Pack trifft, sagt noch nicht, dass ein falsches abgewiesen wird; bis 0.27.0 wurde es
670
+ # stillschweigend ausgefuehrt und legte 60 Dateien an.
671
+
672
+ def sonden_clientwahl() -> None:
673
+ """Wirkungsnachweis fuer die Erkennung des installierten Packs (B10, D-45)."""
674
+ fremde_schicht = {"claude-code": ".devin", "devin-desktop": ".claude"}
675
+ for pack, fremd in fremde_schicht.items():
676
+ root = installation(pack)
677
+ try:
678
+ werkzeug = os.path.join(root, ".koolie/core", "install.py")
679
+
680
+ p = unterprozess([sys.executable, werkzeug, "--update", "--root", root])
681
+ aus = (p.stdout or "") + (p.stderr or "")
682
+ getroffen = f"Client: {pack}" in aus
683
+ keine_zweite = not os.path.isdir(os.path.join(root, fremd))
684
+ melde("SONDE", "B10", getroffen and keine_zweite,
685
+ f"Aktualisierung ohne --client trifft das installierte Pack ({pack})")
686
+ if not (getroffen and keine_zweite):
687
+ notiz(" Ausgabe:", " | ".join(aus.splitlines()[:6]))
688
+
689
+ anderes = "devin-desktop" if pack == "claude-code" else "claude-code"
690
+ q = unterprozess([sys.executable, werkzeug, "--update", "--root", root,
691
+ "--client", anderes])
692
+ abgewiesen = q.returncode == 1
693
+ unberuehrt = not os.path.isdir(os.path.join(root, fremd))
694
+ melde("GEGENPROBE", "B10", abgewiesen and unberuehrt,
695
+ f"Widersprechendes --client bricht ab statt anzulegen ({pack} statt {anderes})")
696
+ finally:
697
+ aufraeumen(os.path.dirname(root))
698
+
699
+
700
+ buendel(sonden_clientwahl,
701
+ "Die Aktualisierung erkennt das installierte Pack und weist ein fremdes ab, ohne "
702
+ "dabei eine einzige Datei anzulegen")
703
+
704
+
705
+ # --- D-46: Die Erstinstallation ueberschreibt keine Projektdatei -----------------
706
+ #
707
+ # Die Sonde braucht weder Repositoriumskopie noch Installation, sondern ein leeres
708
+ # Verzeichnis mit **einer** fremden Datei darin. Das ist der Fall, den ein aufnehmendes
709
+ # Projekt mitbringt - und bis 0.28.0 verlor es sie beim ersten Befehl des Leitfadens.
710
+ #
711
+ # Doppelte Bedingung, und die zweite ist die eigentliche: Ein Abbruch, der erst nach dem
712
+ # Schreiben kommt, ist keiner.
713
+
714
+ def sonden_erstinstallation() -> None:
715
+ """Wirkungsnachweis fuer den Schutz der Projektdateien (CR-2026-046, D-46)."""
716
+ ziel = tempfile.mkdtemp(prefix="lw-erst-")
717
+ werkzeug = os.path.join(QUELLE, ".koolie/core", "install.py")
718
+ man = json.loads(lies(os.path.join(QUELLE, ".koolie/core", "clients", "claude-code",
719
+ "manifest.json")))
720
+ wurzeldatei = man["root_instruction_file"]
721
+ try:
722
+ # --- Sonde: der Name ist belegt, der Inhalt gehoert dem Projekt ----------
723
+ projekt = os.path.join(ziel, "belegt")
724
+ os.makedirs(projekt)
725
+ eigen = os.path.join(projekt, wurzeldatei)
726
+ inhalt = ("# Projektwissen\r\n\r\nDiese Datei gehoert dem Projekt und darf bei einer\r\n"
727
+ "Erstinstallation nicht verlorengehen.\r\n")
728
+ schreib(eigen, inhalt)
729
+
730
+ p = unterprozess([sys.executable, werkzeug, "--client", "claude-code",
731
+ "--root", projekt])
732
+ abgebrochen = p.returncode == 1
733
+ unberuehrt = lies(eigen) == inhalt
734
+ nichts_geschrieben = not os.path.isdir(os.path.join(projekt, man["runtime_dir"]))
735
+ melde("SONDE", "D46", abgebrochen and unberuehrt and nichts_geschrieben,
736
+ "Erstinstallation bricht ab, Projektdatei und Verzeichnis unberuehrt")
737
+ if not unberuehrt:
738
+ notiz(" Die Projektdatei wurde veraendert - das ist der Befund selbst.")
739
+ elif not (abgebrochen and nichts_geschrieben):
740
+ notiz(" Ausgabe:", " | ".join(
741
+ ((p.stdout or "") + (p.stderr or "")).splitlines()[:6]))
742
+
743
+ # --- Gegenprobe: ein freies Verzeichnis laeuft durch ---------------------
744
+ # Ohne sie belegt die Sonde nur, dass etwas abbricht - nicht, dass die
745
+ # Erstinstallation ueberhaupt noch funktioniert.
746
+ leer = os.path.join(ziel, "leer")
747
+ os.makedirs(leer)
748
+ q = unterprozess([sys.executable, werkzeug, "--client", "claude-code",
749
+ "--root", leer])
750
+ melde("GEGENPROBE", "D46",
751
+ q.returncode == 0 and os.path.isfile(os.path.join(leer, wurzeldatei)),
752
+ "Erstinstallation in ein freies Verzeichnis laeuft durch")
753
+ finally:
754
+ aufraeumen(ziel)
755
+
756
+
757
+ buendel(sonden_erstinstallation,
758
+ "Die Erstinstallation bricht vor einer vorhandenen Projektdatei ab, statt sie zu "
759
+ "ueberschreiben - und schreibt dabei nichts")
760
+
761
+
762
+ # --- D-349/D-352: die Auskunft ueber ignorierte Kerndateien -----------------------
763
+ #
764
+ # 🔴 DIE AUSKUNFT AUS 1.4.0 HATTE KEINE SONDE, UND SIE ZAEHLTE UNTER WINDOWS ZU WENIG.
765
+ # `ignorierte_kerndateien()` gab die Pfade mit `text=True` an `git check-ignore --stdin`;
766
+ # unter Windows kam jeder mit angehaengtem `\r` an. Ein Verzeichnismuster (`build/`)
767
+ # traf trotzdem - der Fall, an dem die Auskunft gebaut wurde -, ein DATEImuster (`*.md`)
768
+ # nie. Gemessen am 2026-09-24: git meldet zwei ignorierte Dateien, die Funktion null
769
+ # (CR-2026-135).
770
+ #
771
+ # DREI EINHEITEN, JEDE MIT EINER UNABHAENGIG GEZAEHLTEN ERWARTUNG. Die Zahl im Hinweis
772
+ # wird gegen einen `os.walk` ueber den Kern gehalten, nicht gegen eine gepflegte Zahl:
773
+ # D349 (Sonde) - `*.md`: jede Markdown-Datei des Kerns wird gezaehlt. Gegen den
774
+ # Vorstand faellt sie unter Windows mit 0.
775
+ # D349a (Gegenprobe) - `build/`: das Verzeichnismuster, der Anlassfall von K-117,
776
+ # zaehlt weiter genau die Dateien unter `build/`.
777
+ # D349b (Gegenprobe) - ein Muster, das nichts trifft: kein Hinweis. Eine Auskunft,
778
+ # die immer etwas meldet, besteht jede Sonde.
779
+ M349_HINWEIS = re.compile(r"HINWEIS \((\d+)\): Dieses Projekt IGNORIERT Kerndateien")
780
+
781
+
782
+ def _349_kern(root: str, passt) -> int:
783
+ """Die Kerndateien, die ein Muster treffen sollte - gezaehlt, nicht gepflegt."""
784
+ kern = os.path.join(root, ".koolie", "core")
785
+ n = 0
786
+ for dirpath, dirnames, filenames in os.walk(kern):
787
+ dirnames[:] = [d for d in dirnames if d != "__pycache__"]
788
+ for fn in filenames:
789
+ rel = os.path.relpath(os.path.join(dirpath, fn), kern).replace(os.sep, "/")
790
+ n += 1 if passt(rel) else 0
791
+ return n
792
+
793
+
794
+ def sonden_ignorierte_kerndateien() -> None:
795
+ """Wirkungsnachweis fuer die Auskunft aus D-349 an einem echten Repositorium."""
796
+ root = installation("claude-code")
797
+ try:
798
+ if unterprozess(["git", "init", "-q", root]).returncode != 0:
799
+ melde("BUENDEL", "-", False,
800
+ "sonden_ignorierte_kerndateien [git nicht erreichbar]")
801
+ notiz(" Ohne git gibt die Auskunft bewusst nichts aus - nicht messbar.")
802
+ return
803
+ werkzeug = os.path.join(root, ".koolie", "core", "install.py")
804
+ faelle = (
805
+ ("SONDE", "D349", "*.md", lambda rel: rel.endswith(".md"),
806
+ "Ein Dateimuster im Projekt-.gitignore wird gezaehlt - jede Markdown-Datei "
807
+ "des Kerns, auch unter Windows"),
808
+ ("GEGENPROBE", "D349a", "build/", lambda rel: rel.startswith("build/"),
809
+ "Ein Verzeichnismuster zaehlt weiter genau die Dateien darunter - der "
810
+ "Anlassfall der Auskunft bleibt erhalten"),
811
+ ("GEGENPROBE", "D349b", "*.sonde-trifft-nichts", lambda rel: False,
812
+ "Ein Muster, das keine Kerndatei trifft, erzeugt keinen Hinweis"),
813
+ )
814
+ for art, kennung, muster, passt, was in faelle:
815
+ schreib(os.path.join(root, ".gitignore"), muster + "\n")
816
+ p = unterprozess([sys.executable, werkzeug, "--update", "--root", root])
817
+ aus = (p.stdout or "") + (p.stderr or "")
818
+ soll = _349_kern(root, passt)
819
+ treffer = M349_HINWEIS.search(aus)
820
+ ist = int(treffer.group(1)) if treffer else 0
821
+ melde(art, kennung, p.returncode == 0 and ist == soll, was)
822
+ if p.returncode != 0 or ist != soll:
823
+ notiz(" Muster %s: gemeldet %d, gezaehlt %d, Exit %d"
824
+ % (muster, ist, soll, p.returncode))
825
+ finally:
826
+ aufraeumen(os.path.dirname(root))
827
+
828
+
829
+ buendel(sonden_ignorierte_kerndateien,
830
+ "Die Auskunft ueber ignorierte Kerndateien zaehlt Datei- und Verzeichnismuster "
831
+ "richtig und schweigt, wenn nichts ignoriert wird")
832
+
833
+
834
+ # --- D-354: das Kennzeichen des Quellrepositoriums in einem Projekt ---------------
835
+ #
836
+ # 🔴 WER GANZ `.koolie/` KOPIERT, NIMMT DAS KENNZEICHEN MIT - aus dem Arbeitsbaum wie
837
+ # aus dem Release-Archiv, denn es ist versioniert. Danach haelt der Validator das
838
+ # Projekt fuer das Quellrepositorium, und keine seiner Meldungen nennt den Grund.
839
+ # Gemessen am 2026-09-24 (CR-2026-137): unverfolgt 1 Fehler (Pruefung 79, Lizenz in
840
+ # der Projektwurzel), committet 80 (dazu Pruefung 81 an 79 Projekttraegern).
841
+ #
842
+ # ZWEI EINHEITEN, UND DIE SONDE HAELT ZWEI STELLEN GEGENEINANDER. `install.py` und der
843
+ # Validator fuehren den Pfad des Kennzeichens je fuer sich; die Sonde verlangt, dass an
844
+ # derselben Datei BEIDE anschlagen - die Auskunft und Pruefung 79. Wandert eine der
845
+ # beiden Konstanten, faellt sie.
846
+ # D354 (Sonde) - Kennzeichen liegt: Hinweis, Exit 0, und Pruefung 79 verlangt
847
+ # die Lizenz in der Wurzel. Gegen den Vorstand faellt sie.
848
+ # D354a (Gegenprobe) - ohne Kennzeichen: kein Hinweis und keine Lizenzmeldung. Eine
849
+ # Auskunft, die immer etwas meldet, besteht jede Sonde.
850
+ M354_HINWEIS = "das Kennzeichen des Framework-Repositoriums selbst"
851
+ M354_VALIDATOR = "LICENSE: fehlt"
852
+
853
+
854
+ def sonden_kennzeichen_im_projekt() -> None:
855
+ """Wirkungsnachweis fuer die Auskunft aus D-354 an einer echten Installation."""
856
+ root = installation("claude-code")
857
+ try:
858
+ werkzeug = os.path.join(root, ".koolie", "core", "install.py")
859
+ kennzeichen = os.path.join(root, ".koolie", "QUELLREPOSITORIUM.md")
860
+ faelle = (
861
+ ("SONDE", "D354", True,
862
+ "Ein mitkopiertes Kennzeichen wird gemeldet, ohne die Installation "
863
+ "anzuhalten - und der Validator erkennt dieselbe Datei"),
864
+ ("GEGENPROBE", "D354a", False,
865
+ "Ohne Kennzeichen kein Hinweis, und der Validator prueft als Projekt"),
866
+ )
867
+ for art, kennung, liegt, was in faelle:
868
+ if liegt:
869
+ shutil.copyfile(os.path.join(QUELLE, ".koolie", "QUELLREPOSITORIUM.md"),
870
+ kennzeichen)
871
+ elif os.path.exists(kennzeichen):
872
+ os.remove(kennzeichen)
873
+ p = unterprozess([sys.executable, werkzeug, "--update", "--root", root])
874
+ aus = (p.stdout or "") + (p.stderr or "")
875
+ hinweis = M354_HINWEIS in aus
876
+ validator = M354_VALIDATOR in validator_ausgabe(root)
877
+ ok = p.returncode == 0 and hinweis == liegt and validator == liegt
878
+ melde(art, kennung, ok, was)
879
+ if not ok:
880
+ notiz(" Exit %d, Hinweis %s, Pruefung 79 %s (erwartet je %s)"
881
+ % (p.returncode, hinweis, validator, liegt))
882
+ finally:
883
+ aufraeumen(os.path.dirname(root))
884
+
885
+
886
+ buendel(sonden_kennzeichen_im_projekt,
887
+ "Ein mitkopiertes Kennzeichen des Quellrepositoriums wird bei der Installation "
888
+ "gemeldet, und install.py und Validator erkennen es an derselben Stelle")
889
+
890
+
891
+ # --- D-395: die Schritte nach Installation und Hebung je Pack (K-123) -------------
892
+ #
893
+ # 🔴 BEI `openai-codex` TRAEGT OHNE VERTRAUEN NICHTS VON ABSCHNITT B, UND DER HOOK
894
+ # BRAUCHT NACH JEDER HEBUNG NEUES VERTRAUEN - und `install.py` nannte keins von beidem.
895
+ # Seine Schritte waren packneutral und verlangten dazu, `_core_rules_integrity` stehen
896
+ # zu lassen, einen Block, den die TOML-Datei dieses Packs nicht fuehrt. Jetzt nennt das
897
+ # Manifest die Schritte (post_install_steps, post_update_steps), und den Integritaetsblock
898
+ # nennt das Werkzeug nur bei einer Berechtigungsdatei im JSON-Format.
899
+ # D395 (Sonde) - openai-codex: Installation nennt das Projekt- und das
900
+ # Hook-Vertrauen und nicht den Integritaetsblock; die Hebung
901
+ # nennt das erneute Hook-Vertrauen. Gegen den Vorstand faellt sie.
902
+ # D395a (Gegenprobe) - claude-code: Integritaetsblock genannt, kein Vertrauensschritt,
903
+ # kein Zusatzblock bei der Hebung. Ein Werkzeug, das jedem Pack
904
+ # die Schritte eines Packs nennt, besteht die Sonde auch.
905
+ M395_INSTALL = "als vertraut eintragen"
906
+ M395_HOOK = "Dem Schutz-Hook einzeln vertrauen"
907
+ M395_UPDATE = "Dem Schutz-Hook ERNEUT vertrauen"
908
+ M395_BLOCK = "_core_rules_integrity"
909
+
910
+
911
+ def sonden_schritte_je_pack() -> None:
912
+ """Wirkungsnachweis fuer die packeigenen Schritte aus D-395 an echten Installationen."""
913
+ faelle = (
914
+ ("SONDE", "D395", "openai-codex", True,
915
+ "openai-codex: Installation und Hebung nennen die Vertrauensschritte, "
916
+ "nicht den Integritaetsblock"),
917
+ ("GEGENPROBE", "D395a", "claude-code", False,
918
+ "claude-code: der Integritaetsblock wird genannt, kein Vertrauensschritt"),
919
+ )
920
+ werkzeug = os.path.join(QUELLE, ".koolie", "core", "install.py")
921
+ for art, kennung, pack, codex, was in faelle:
922
+ ziel = tempfile.mkdtemp(prefix="lw-inst-")
923
+ root = os.path.join(ziel, "projekt")
924
+ os.makedirs(root)
925
+ try:
926
+ p = unterprozess([sys.executable, werkzeug, "--client", pack, "--root", root])
927
+ ein = (p.stdout or "") + (p.stderr or "")
928
+ q = unterprozess([sys.executable, werkzeug, "--update", "--root", root])
929
+ heb = (q.stdout or "") + (q.stderr or "")
930
+ ist = (M395_INSTALL in ein, M395_HOOK in ein, M395_BLOCK in ein,
931
+ M395_UPDATE in heb)
932
+ soll = (codex, codex, not codex, codex)
933
+ ok = p.returncode == 0 and q.returncode == 0 and ist == soll
934
+ melde(art, kennung, ok, was)
935
+ if not ok:
936
+ notiz(" Exit %d/%d, (Projekt, Hook, Block, erneut) = %s, erwartet %s"
937
+ % (p.returncode, q.returncode, ist, soll))
938
+ finally:
939
+ aufraeumen(ziel)
940
+
941
+
942
+ buendel(sonden_schritte_je_pack,
943
+ "install.py nennt nach Installation und Hebung die Schritte, die das Manifest "
944
+ "des Packs fuehrt, und den Integritaetsblock nur, wo es ihn gibt")
945
+
946
+
947
+ # --- D-398: der Mermaid-Renderer scheitert an der Umgebung, nicht am Diagramm (K-145) --
948
+ #
949
+ # 🔴 OHNE DEN BROWSER VON PUPPETEER MELDETE `--mermaid` JEDEN BLOCK ALS UNGUELTIG - auch
950
+ # unveraenderte -, waehrend der Bau im selben Arbeitsgang alle Diagramme renderte. Der
951
+ # Validator nimmt jetzt Browser und Konfiguration des Baus (`mermaid_renderer.py`) und
952
+ # erkennt an der Fehlerausgabe, ob der Renderer an der Umgebung gescheitert ist; dann
953
+ # warnt er einmal, statt ueber die Diagramme zu urteilen. Den Renderer selbst ruft keine
954
+ # Sonde auf - er ist eine Vorbedingung des Arbeitsplatzes, und eine Sonde, die an ihm
955
+ # haengt, bestuende auf einem Arbeitsplatz und fiele auf dem naechsten. Gemessen wird die
956
+ # Unterscheidung und die Verdrahtung.
957
+ # D398 (Sonde) - die Meldung, mit der der Renderer am 2026-09-25 ohne Browser
958
+ # scheiterte, gilt als Umgebungsfehler, und der Validator ruft
959
+ # den Renderer mit der Konfiguration aus diesem Modul auf.
960
+ # D398a (Gegenprobe) - ein Syntaxfehler des Diagramms gilt NICHT als Umgebungsfehler:
961
+ # Eine Unterscheidung, die alles zur Umgebung erklaert, machte aus
962
+ # der Pruefung eine Warnung, die nie mehr einen Fehler meldet.
963
+ M398_UMGEBUNG = ("Error: Could not find chrome-headless-shell (ver. 153.0.8010.36). "
964
+ "This can occur if either")
965
+ M398_SYNTAX = ("Error: Parse error on line 2: ...t TD A[Start --> B{{{ "
966
+ "Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', got 'DIAMOND_START'")
967
+
968
+
969
+ def sonden_mermaid_umgebung() -> None:
970
+ """Wirkungsnachweis fuer die Unterscheidung aus D-398, ohne den Renderer."""
971
+ skripte = os.path.join(QUELLE, ".koolie", "core", "tests", "scripts")
972
+ code = ("import sys; sys.path.insert(0, sys.argv[1]); import mermaid_renderer as m; "
973
+ "print(m.ist_umgebungsfehler(sys.argv[2]), m.ist_umgebungsfehler(sys.argv[3]))")
974
+ p = unterprozess([sys.executable, "-c", code, skripte, M398_UMGEBUNG, M398_SYNTAX])
975
+ ist = (p.stdout or "").split()
976
+ # Der Validator ist seit 1.19.1 Einstieg und Paket (K-174); gelesen wird beides.
977
+ validator = "".join(lies(os.path.join(skripte, name)) for name in
978
+ ["validate-framework.py"] + sorted(
979
+ os.path.join("pruefungen", n) for n in
980
+ os.listdir(os.path.join(skripte, "pruefungen"))
981
+ if n.endswith(".py")))
982
+ verdrahtet = ("mermaid_renderer.puppeteer_konfiguration(" in validator
983
+ and '"-p", pptr' in validator)
984
+ ok = p.returncode == 0 and ist[:1] == ["True"] and verdrahtet
985
+ melde("SONDE", "D398", ok,
986
+ "Die Meldung ohne Browser gilt als Umgebungsfehler, und der Validator "
987
+ "uebergibt die Konfiguration des Baus")
988
+ if not ok:
989
+ notiz(" Exit %d, Ausgabe %r, verdrahtet %s" % (p.returncode, ist, verdrahtet))
990
+ ok = p.returncode == 0 and ist[1:2] == ["False"]
991
+ melde("GEGENPROBE", "D398a", ok,
992
+ "Ein Syntaxfehler des Diagramms bleibt ein Fehler des Diagramms")
993
+ if not ok:
994
+ notiz(" Exit %d, Ausgabe %r" % (p.returncode, ist))
995
+
996
+
997
+ buendel(sonden_mermaid_umgebung,
998
+ "--mermaid unterscheidet einen Renderer ohne Browser von einem ungueltigen "
999
+ "Diagramm und ruft ihn wie der Bau auf")