@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,4 @@
1
+ """Apparat und Einheiten des Sondenskripts probe-pruefungen.py (1.19.1, K-174).
2
+
3
+ Der Einstieg ist probe-pruefungen.py; dieses Paket hat keinen eigenen Aufruf.
4
+ """
@@ -0,0 +1,653 @@
1
+ """Der Apparat des Sondenlaufs: Befehlszeile, Kopien, Einheiten und ihre Anmeldung,
2
+ Praeparationswaechter, Aufraeumer, nebenlaeufige Bahnen und Auswertung.
3
+
4
+ Teil des Sondenskripts probe-pruefungen.py, seit 1.19.1 in Module geteilt (K-174). Die
5
+ Einheiten melden sich beim Laden dieses Moduls an; der Einstieg laedt die Module in der
6
+ Reihenfolge ihrer Nummer, und das ist die Reihenfolge der Ausgabe (D-49). Ein Modul
7
+ liest nur aus dem Apparat und aus frueheren Teilen."""
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import io
12
+ import os
13
+ import shutil
14
+ import stat
15
+ import subprocess
16
+ import sys
17
+ import tempfile
18
+ import threading
19
+ import time
20
+ import traceback
21
+ from concurrent.futures import ThreadPoolExecutor
22
+
23
+
24
+ BAHNEN_VORGABE = 8
25
+
26
+
27
+ def argumente(argv: list) -> tuple:
28
+ """Pfad und Bahnenzahl aus der Befehlszeile - mehr Schalter gibt es nicht.
29
+
30
+ Die Vorgabe ist eine feste Zahl und NICHT die Kernzahl dieser Maschine. Eine
31
+ Vorgabe, die vom Rechner abhaengt, macht zwei Laufzeiten unvergleichbar - und der
32
+ Engpass ist ohnehin nicht die Rechenzeit: Jede Einheit legt eine eigene Kopie des
33
+ Repositoriums an und startet mindestens einen Unterprozess darauf.
34
+
35
+ `--bahnen 1` ist der serielle Lauf, Einheit fuer Einheit in der Reihenfolge dieser
36
+ Datei. Er ist der Rueckfallweg, wenn ein Befund sich nur seriell zeigt.
37
+ """
38
+ pfad, bahnen, rest = ".", BAHNEN_VORGABE, list(argv)
39
+ nur, liste = [], False
40
+ while rest:
41
+ wort = rest.pop(0)
42
+ if wort == "--bahnen":
43
+ if not rest or not rest[0].isdigit() or int(rest[0]) < 1:
44
+ sys.exit("--bahnen erwartet eine Zahl ab 1")
45
+ bahnen = int(rest.pop(0))
46
+ elif wort == "--nur":
47
+ if not rest or rest[0].startswith("--"):
48
+ sys.exit("--nur erwartet Kennungen, durch Komma getrennt (z. B. --nur 44,62)")
49
+ nur = [x.strip().lower() for x in rest.pop(0).split(",") if x.strip()]
50
+ elif wort == "--liste":
51
+ liste = True
52
+ elif wort.startswith("--"):
53
+ sys.exit("Unbekannter Schalter: %s (bekannt sind --bahnen N, --nur A,B "
54
+ "und --liste)" % wort)
55
+ else:
56
+ pfad = wort
57
+ return os.path.abspath(pfad), bahnen, nur, liste
58
+
59
+
60
+ QUELLE, BAHNEN, NUR, LISTE = argumente(sys.argv[1:])
61
+ VALIDATOR = ".koolie/core/tests/scripts/validate-framework.py"
62
+
63
+
64
+ def kopie() -> str:
65
+ ziel = tempfile.mkdtemp(prefix="lw-sonde-")
66
+ shutil.copytree(QUELLE, os.path.join(ziel, "repo"),
67
+ ignore=shutil.ignore_patterns(".git", "__pycache__", "out"))
68
+ return os.path.join(ziel, "repo")
69
+
70
+
71
+ def baumhash(root: str) -> str:
72
+ """Fingerabdruck des Baums - er entscheidet, ob eine Sonde etwas gesetzt hat.
73
+
74
+ Ohne ihn ist ein Suchtext, der nicht mehr passt, von einer Pruefung, die nicht
75
+ meldet, nicht zu unterscheiden: Beides sieht aus wie eine gescheiterte Sonde.
76
+ """
77
+ h = hashlib.sha256()
78
+ for dirpath, dirnames, filenames in os.walk(root):
79
+ dirnames[:] = sorted(d for d in dirnames if d != "__pycache__")
80
+ for fn in sorted(filenames):
81
+ pfad = os.path.join(dirpath, fn)
82
+ h.update(os.path.relpath(pfad, root).encode("utf-8", "replace"))
83
+ try:
84
+ with open(pfad, "rb") as fh:
85
+ h.update(fh.read())
86
+ except OSError:
87
+ pass
88
+ return h.hexdigest()
89
+
90
+
91
+ def unterprozess(argv: list, **kw):
92
+ """Unterprozess mit fester Kodierung auf beiden Seiten.
93
+
94
+ Ohne beides haengt das Ergebnis von der aufrufenden Umgebung ab: Der Kindprozess
95
+ schreibt unter Windows in der Konsolenkodierung, solange PYTHONIOENCODING nicht
96
+ gesetzt ist, und diese Seite dekodiert mit der Locale-Vorgabe, solange encoding
97
+ fehlt. Ein Diagnosetext mit Umlaut kommt dann veraendert zurueck und trifft keinen
98
+ Suchtext mehr.
99
+
100
+ Bei einer Sonde faellt das auf - sie sucht den Text und meldet, dass er fehlt. Bei
101
+ einer Gegenprobe nicht: Ein zerschossener Text ist abwesend, die Gegenprobe besteht
102
+ klaglos, und niemand erfaehrt etwas. Genau der Befundtyp, gegen den D-23 gebaut ist.
103
+
104
+ Aufgefallen am 2026-09-12: Derselbe Sondenlauf wurde mit PYTHONIOENCODING=utf-8 in
105
+ der Elternumgebung rot und ohne sie gruen - also gerade bei der Konfiguration, die
106
+ fuer Unterprozesse empfohlen ist. Von 28 Aufrufen der generischen Runner trug
107
+ genau einer einen Suchtext mit Umlaut; die uebrigen 27 warteten darauf
108
+ (CR-2026-049, D-49).
109
+
110
+ Diese Funktion ist deshalb der einzige Weg, auf dem dieses Skript einen Prozess
111
+ startet. Zwei Aufrufe trugen die Korrektur, fuenf nicht - das war kein Muster,
112
+ sondern die Reihenfolge ihrer Entstehung.
113
+ """
114
+ kodierung = kw.pop("kodierung", "utf-8")
115
+ umgebung = dict(kw.pop("env", None) or os.environ, PYTHONIOENCODING=kodierung)
116
+ return subprocess.run(argv, capture_output=True, text=True, encoding=kodierung,
117
+ errors="replace", env=umgebung, **kw)
118
+
119
+
120
+ def lauf(root: str) -> str:
121
+ p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
122
+ "--root", root])
123
+ return (p.stdout or "") + (p.stderr or "")
124
+
125
+
126
+ def lies(pfad: str) -> str:
127
+ return io.open(pfad, encoding="utf-8", newline="").read()
128
+
129
+
130
+ def schreib(pfad: str, text: str) -> None:
131
+ io.open(pfad, "w", encoding="utf-8", newline="").write(text)
132
+
133
+
134
+ class Praeparationsfehler(Exception):
135
+ """Ein Suchtext einer Praeparation trifft nicht (mehr) - CR-2026-060, D-74.
136
+
137
+ Der Unterschied zu einem gewoehnlichen Fehlschlag ist die Zurechnung: Hier hat die
138
+ SONDE ihren Gegenstand verloren, nicht die Pruefung ihre Wirkung. Beides sah bis
139
+ 0.37.0 gleich aus, und bei einer mehrteiligen Praeparation sah es sogar aus wie ein
140
+ echter Befund im Repositorium.
141
+ """
142
+
143
+
144
+ def ersetzt(text: str, *paare, quelle: str = "") -> str:
145
+ """Textersetzungen mit geprueften Trefferzahlen - jede einzeln.
146
+
147
+ Ein Paar ist (alt, neu) oder (alt, neu, anzahl); die Voreinstellung ist genau ein
148
+ Treffer. Weicht die tatsaechliche Zahl ab, wird NICHTS ersetzt und der Aufruf
149
+ scheitert mit dem Suchtext, der nicht mehr passt.
150
+
151
+ WARUM DAS NOETIG IST: baumhash() ist ein Alles-oder-nichts-Waechter. Bei n
152
+ Ersetzungen belegt er "mindestens eine hat gegriffen", nie "alle". Am 2026-09-13
153
+ wurde das gemessen: Auf einem Baum mit einem zwanzigsten Grenzfall traf die erste
154
+ Ersetzung der Gegenprobe 30 nicht, die zweite schon - der Baum aenderte sich, die
155
+ Gegenprobe lief und fiel mit "21 Grenzfallzeilen, der Steckbrief nennt 20". Wer das
156
+ liest, sucht den Fehler in EDGE_CASES.md. Dort ist keiner.
157
+
158
+ WAS SIE NICHT LEISTET: Sie deckt den Suchtext, nicht die Absicht. Eine Ersetzung,
159
+ die trifft und das Falsche tut, findet sie nicht.
160
+ """
161
+ for paar in paare:
162
+ alt, neu = paar[0], paar[1]
163
+ anzahl = paar[2] if len(paar) > 2 else 1
164
+ tatsaechlich = text.count(alt)
165
+ if tatsaechlich != anzahl:
166
+ raise Praeparationsfehler(
167
+ "%sSuchtext trifft %dx statt %dx: %r"
168
+ % (quelle + ": " if quelle else "", tatsaechlich, anzahl, alt[:70]))
169
+ text = text.replace(alt, neu, anzahl)
170
+ return text
171
+
172
+
173
+ def ersetze(pfad: str, *paare) -> None:
174
+ """ersetzt() auf einer Datei - lesen, alle Paare pruefen, dann erst schreiben."""
175
+ schreib(pfad, ersetzt(lies(pfad), *paare, quelle=os.path.basename(pfad)))
176
+
177
+
178
+ def zeile_nach(pfad: str, anker: str, neu: str) -> None:
179
+ """Eine Zeile hinter die eine Zeile einfuegen, die mit `anker` beginnt.
180
+
181
+ Der Anker muss genau einmal am Zeilenanfang stehen; sonst ist nicht entschieden,
182
+ wohin eingefuegt wuerde, und die Praeparation scheitert statt zu raten.
183
+ """
184
+ zeilen = lies(pfad).split("\r\n")
185
+ treffer = [i for i, z in enumerate(zeilen) if z.startswith(anker)]
186
+ if len(treffer) != 1:
187
+ raise Praeparationsfehler(
188
+ "%s: Anker %r steht %dx am Zeilenanfang, erwartet genau einmal"
189
+ % (os.path.basename(pfad), anker, len(treffer)))
190
+ zeilen.insert(treffer[0] + 1, neu)
191
+ schreib(pfad, "\r\n".join(zeilen))
192
+
193
+
194
+ def frei(pfad: str, *kennungen: str) -> None:
195
+ """Eine synthetische Kennung darf im Zieldokument noch nicht vergeben sein.
196
+
197
+ Am 2026-09-13 trug die Gegenprobe 30 als synthetische Kennung ausgerechnet G-18 -
198
+ dieselbe, die 0.36.0 wirklich vergeben hat. Die Falle stand in der Uebergabe
199
+ benannt, und sie ist trotzdem zugeschnappt; eine benannte Falle, in die man zweimal
200
+ tritt, gehoert in den Code (CR-2026-060 E3).
201
+
202
+ Der Waechter prueft Abwesenheit, nicht Eignung: Er ist genau so klug wie die
203
+ Kennung, die man ihm gibt.
204
+
205
+ NICHT als Vergabe zaehlt die Zeile, die eine Kennung ausdruecklich als synthetisch
206
+ und nie vergeben AUSWEIST (Decision Log, Ausnahmemenge von Pruefung 50). Ohne diese
207
+ Trennung haette der Absatz, der die synthetischen Kennungen schuetzt, sie fuer
208
+ diesen Waechter zu vergebenen gemacht - gemessen am 2026-09-18 an Gegenprobe 46b.
209
+ """
210
+ text = "\n".join(z for z in lies(pfad).splitlines()
211
+ if not z.lstrip().startswith("**Belegte synthetische Kennungen"))
212
+ for kennung in kennungen:
213
+ if kennung in text:
214
+ raise Praeparationsfehler(
215
+ "%s: Die synthetische Kennung %r ist dort bereits vergeben. Eine "
216
+ "Gegenprobe, die eine echte Kennung doppelt, misst nicht mehr ihren "
217
+ "Fall - eine neue synthetische Kennung waehlen"
218
+ % (os.path.basename(pfad), kennung))
219
+
220
+
221
+ # --- Der Ausfuehrungsplan: erst anmelden, dann fahren -----------------------------
222
+ #
223
+ # Bis 0.45.0 lief jede Sonde in dem Augenblick, in dem der Auslegeteil dieser Datei ihre
224
+ # Zeile erreichte: alle Einheiten streng nacheinander, jede mit einer eigenen Kopie des
225
+ # Repositoriums und mindestens einem Validatorlauf darauf. Seit 0.46.0 melden sonde(),
226
+ # sonde_ohne_wert(), gegenprobe() und buendel() ihre Einheit nur noch an; gefahren wird
227
+ # am Ende, auf mehreren Bahnen (CR-2026-068, D-94 bis D-96).
228
+ #
229
+ # DREI ZUSAGEN, die dieser Umbau halten muss - alle drei waren hier schon einmal teuer:
230
+ #
231
+ # 1. DIE SCHREIBWEISE BLEIBT. Pruefung 40 rechnet die Sondenmenge aus zwei woertlichen
232
+ # Mustern dieser Datei aus: dem Aufruf `sonde(` mit seiner Kennung und `melde(` mit
233
+ # der Art SONDE und ihr. Ein Umbau auf ein Register mit eigener Schreibweise haette
234
+ # die Sonden fuer Pruefung 40 unsichtbar gemacht - und die Pruefung haette leise
235
+ # bestanden, weil eine leere Menge keine Abweichung ist. Beide Muster stehen
236
+ # deshalb unveraendert an ihren Aufrufstellen; geaendert hat sich allein, WANN der
237
+ # Aufruf seine Arbeit tut.
238
+ # 2. DIE AUSGABE BLEIBT ZEILENGLEICH. D-49 nimmt den Lauf in beiden
239
+ # Kodierungsumgebungen ab, und zwar zeilenweise. Eine nebenlaeufige Einheit
240
+ # schreibt deshalb nicht selbst auf die Standardausgabe, sondern sammelt ihre
241
+ # Zeilen; ausgegeben werden sie in der Reihenfolge der ANMELDUNG, nicht in der der
242
+ # Fertigstellung. Die Laufzeiten stehen unterhalb der Trennlinie und sind
243
+ # ausdruecklich nicht Teil dieses Vergleichs - eine Laufzeit ist nie zweimal
244
+ # dieselbe, und eine Abnahmeform, die einen Filter braucht, ist keine mehr.
245
+ # 3. EIN BUENDEL IST DIE KLEINSTE EINHEIT, NIE SEINE TEILE. Seine Faelle bauen
246
+ # aufeinander auf: eine Installation, Schritt fuer Schritt praepariert und wieder
247
+ # zurueckgesetzt. INNERHALB eines Buendels bleibt es streng seriell; nebenlaeufig
248
+ # sind allein die Einheiten gegeneinander.
249
+
250
+ EINHEITEN = []
251
+ _ORT = threading.local()
252
+
253
+ SATZ_MIN = 5
254
+ SATZ_MAX = 30
255
+
256
+
257
+ def worte(satz: str) -> int:
258
+ return len(satz.split())
259
+
260
+
261
+ def zahl(wert: float) -> str:
262
+ """Eine Zahl mit einer Nachkommastelle und Dezimalkomma - deutsch wie der Rest."""
263
+ return ("%.1f" % wert).replace(".", ",")
264
+
265
+
266
+ def kurz(satz: str, breite: int) -> str:
267
+ return satz if len(satz) <= breite else satz[:breite - 3] + "..."
268
+
269
+
270
+ class Einheit:
271
+ """Eine Sonde, eine Gegenprobe oder ein Buendel - mit Name, Satz und Laufzeit.
272
+
273
+ `kennung` ist der Name: bei einer Einzelsonde ihre Pruefungsnummer, bei einem
274
+ Buendel der Name seiner Funktion. `satz` ist der Beschreibungssatz, den die
275
+ Selbstprobe B1 nachzaehlt.
276
+ """
277
+
278
+ def __init__(self, art: str, kennung: str, satz: str, arbeit) -> None:
279
+ self.art = art
280
+ self.kennung = kennung
281
+ self.satz = satz
282
+ self.arbeit = arbeit
283
+ self.zeilen = []
284
+ self.fehler = 0
285
+ self.dauer = 0.0
286
+
287
+ def eintrag(self, art: str, kennung: str, ok: bool, was: str) -> None:
288
+ if not ok:
289
+ self.fehler += 1
290
+ self.zeilen.append(f"{art:10s} {kennung:4s} {'OK ' if ok else 'FEHL'} {was}")
291
+
292
+ def anmerkung(self, *teile) -> None:
293
+ self.zeilen.append(" ".join(str(t) for t in teile))
294
+
295
+ def fahren(self) -> None:
296
+ """Die Einheit fahren und dabei ihre Laufzeit nehmen.
297
+
298
+ Ein unerwarteter Fehler bricht nicht den ganzen Lauf ab, sondern faellt dieser
299
+ einen Einheit zur Last - mit Rueckverfolgung in den Anmerkungen. Der Grund ist
300
+ derselbe wie bei buendel(): Ein Abbruch, der 127 ungefahrene Einheiten
301
+ mitnimmt, verbirgt mehr, als er zeigt.
302
+ """
303
+ _ORT.einheit = self
304
+ beginn = time.perf_counter()
305
+ try:
306
+ self.arbeit()
307
+ except Exception as exc: # absichtlich breit - siehe Kopfkommentar
308
+ self.eintrag(self.art, self.kennung, False,
309
+ "Abbruch der Einheit: %s: %s" % (type(exc).__name__, exc))
310
+ self.anmerkung(" " + traceback.format_exc().rstrip().replace(
311
+ "\n", "\n "))
312
+ finally:
313
+ self.dauer = time.perf_counter() - beginn
314
+ _ORT.einheit = None
315
+
316
+ def ausgeben(self) -> None:
317
+ # 🔴 KODIERUNGSFEST, UND DER ANLASS IST GEMESSEN (2026-09-19, CR-2026-092):
318
+ # Bricht eine Praeparation, nennt die Meldung ihren Suchtext - und der stammt
319
+ # aus einem Traeger mit echten Sonderzeichen. In der cp1252-Umgebung, die D-49
320
+ # ausdruecklich verlangt, hat ein einziges '→' den GANZEN Lauf mit einem
321
+ # UnicodeEncodeError abgebrochen, nach 53 von 61 Pruefungen. Der Apparat konnte
322
+ # seinen eigenen Befund dort nicht berichten.
323
+ for zeile in self.zeilen:
324
+ try:
325
+ print(zeile)
326
+ except UnicodeEncodeError:
327
+ kodierung = getattr(sys.stdout, "encoding", None) or "ascii"
328
+ print(zeile.encode(kodierung, "backslashreplace").decode(kodierung))
329
+
330
+
331
+ def eintragen(art: str, kennung: str, satz: str, arbeit) -> None:
332
+ """Eine Einheit in den Ausfuehrungsplan aufnehmen, statt sie sofort zu fahren."""
333
+ EINHEITEN.append(Einheit(art, kennung, satz, arbeit))
334
+
335
+
336
+ def melde(art: str, nummer: str, ok: bool, was: str) -> None:
337
+ """Eine Ergebniszeile - sie geht in die Sammlung der gerade laufenden Einheit."""
338
+ _ORT.einheit.eintrag(art, nummer, ok, was)
339
+
340
+
341
+ def notiz(*teile) -> None:
342
+ """Eine Erlaeuterungszeile unter einer Ergebniszeile.
343
+
344
+ Sie steht an der Stelle, an der bis 0.45.0 print() stand. Der Unterschied zaehlt
345
+ erst seit der Nebenlaeufigkeit: print() schriebe sofort und mitten in die Zeilen
346
+ einer anderen Einheit hinein, und die Ausgabe waere nicht mehr zeilengleich
347
+ reproduzierbar - der Lauf haette seine Abnahmeform verloren (D-49).
348
+ """
349
+ _ORT.einheit.anmerkung(*teile)
350
+
351
+
352
+ AUFRAEUM_VERSUCHE = 3
353
+ AUFRAEUM_PAUSE = 0.5
354
+
355
+
356
+ def schreibschutz_loesen(pfad: str) -> None:
357
+ """Den Schreibschutz im ganzen Baum wegnehmen - leise, Datei fuer Datei.
358
+
359
+ Sie meldet nichts: Ob das Loesen gelingt, ist nicht die Frage; die Frage ist, ob
360
+ danach geloescht werden kann, und die beantwortet der naechste Loeschversuch. Eine
361
+ Meldung von hier wuerde derselben Stoerung zwei Zeilen geben.
362
+
363
+ Bewusst ohne onerror/onexc von shutil.rmtree: Die beiden Namen haben sich zwischen
364
+ den Python-Fassungen abgeloest, und ein Nachweiswerkzeug, das an der Fassung seines
365
+ Interpreters haengt, ist genau das, was D-49 abgeschafft hat.
366
+ """
367
+ for wurzel, verzeichnisse, dateien in os.walk(pfad):
368
+ for name in verzeichnisse + dateien:
369
+ try:
370
+ os.chmod(os.path.join(wurzel, name), stat.S_IWRITE | stat.S_IREAD)
371
+ except OSError:
372
+ pass
373
+
374
+
375
+ def aufraeumen(pfad: str) -> None:
376
+ """Ein Arbeitsverzeichnis loeschen - und das Scheitern MELDEN, nicht verschlucken.
377
+
378
+ Bis 0.45.0 stand an den vierzehn Aufraeumstellen dieses Skripts
379
+ `shutil.rmtree(..., ignore_errors=True)`. Das ist der Befundtyp, gegen den dieses
380
+ Repositorium gebaut ist: eine Zusage - "gearbeitet wird auf einer Kopie; das
381
+ Repositorium selbst bleibt unberuehrt" - mit einem Ausfallpfad, der nichts sagt. Ein
382
+ Lauf, der fuer jede Einheit ein eigenes Arbeitsverzeichnis anlegt und einige davon
383
+ liegen laesst, sah genau so aus wie einer, der aufgeraeumt hat - und die Platte
384
+ fuellte sich stumm.
385
+
386
+ WARUM DREI VERSUCHE UND NICHT EINER: Unter Windows haelt ein gerade beendeter
387
+ Unterprozess - oder ein Virenscanner, der ihm nachsieht - eine Datei noch einen
388
+ Augenblick fest. Ein einziger Versuch meldete dann eine Stoerung, die eine halbe
389
+ Sekunde spaeter keine mehr ist; und eine Meldung, die auch ohne Anlass kommt, wird
390
+ binnen eines Releases abgeschaltet.
391
+
392
+ WARUM AUSSERDEM DER SCHREIBSCHUTZ FAELLT (0.47.0): Warten hilft gegen eine gehaltene
393
+ Datei und **gar nichts** gegen eine schreibgeschuetzte. Gemessen am 2026-09-15, beim
394
+ ersten echten Fall dieses Aufraeumers: Die Sonde zu Pruefung 45 legt ein
395
+ Repositorium an, git schreibt seine Objektdateien schreibgeschuetzt, und drei
396
+ Versuche ueber anderthalb Sekunden endeten dreimal mit demselben
397
+ "[WinError 5] Zugriff verweigert". **Der Aufraeumer hatte recht und war trotzdem
398
+ nutzlos** - er meldete einen Zustand, den er selbst haette aufloesen koennen. Seit
399
+ diesem Release nimmt jeder Versuch ab dem zweiten zuerst den Schreibschutz weg.
400
+
401
+ WAS SIE NICHT LEISTET: Sie raeumt auf, was ihr genannt wird. Ein Verzeichnis, dessen
402
+ Pfad niemand weitergibt, bleibt liegen und wird von ihr nicht vermisst.
403
+ """
404
+ letzter = None
405
+ for _ in range(AUFRAEUM_VERSUCHE):
406
+ if not os.path.isdir(pfad):
407
+ return
408
+ try:
409
+ shutil.rmtree(pfad)
410
+ return
411
+ except OSError as exc:
412
+ letzter = exc
413
+ schreibschutz_loesen(pfad)
414
+ time.sleep(AUFRAEUM_PAUSE)
415
+ if not os.path.isdir(pfad):
416
+ return
417
+ einheit = getattr(_ORT, "einheit", None)
418
+ melde("AUFRAEUMER", "-", False,
419
+ "%s: %s bleibt liegen" % (einheit.kennung if einheit else "-", pfad))
420
+ notiz(" " + str(letzter))
421
+ notiz(" %d Versuche ueber %s s, danach aufgegeben."
422
+ % (AUFRAEUM_VERSUCHE,
423
+ zahl(AUFRAEUM_VERSUCHE * AUFRAEUM_PAUSE)))
424
+
425
+
426
+ def buendel(fn, satz: str) -> None:
427
+ """Eine Funktion, die mehrere Sonden in EINER Installation faehrt.
428
+
429
+ Diese Funktionen melden selbst ueber melde() und haben deshalb keinen
430
+ baumhash-Waechter. Faellt eine ihrer Praeparationen aus, bricht das Buendel hier ab:
431
+ laut, mit dem Suchtext, und ohne dass der Rest als bestanden erscheint
432
+ (CR-2026-060 E2).
433
+
434
+ Der Beschreibungssatz ist seit 0.46.0 Pflicht und steht als Kopfzeile ueber den
435
+ Zeilen des Buendels. Bis dahin hatte jede Einzelsonde einen erklaerenden Text und
436
+ das Buendel keinen - man sah eine Folge von Meldungen und nicht, was sie zusammen
437
+ belegen sollten.
438
+ """
439
+ def arbeit() -> None:
440
+ notiz("BUENDEL %s - %s" % (fn.__name__, satz))
441
+ try:
442
+ fn()
443
+ except Praeparationsfehler as exc:
444
+ melde("BUENDEL", "-", False, fn.__name__ + " [Praeparation gebrochen]")
445
+ notiz(" " + str(exc))
446
+ notiz(" Gemessen wurde nichts - der Rest des Buendels ist nicht gelaufen.")
447
+
448
+ eintragen("BUENDEL", fn.__name__, satz, arbeit)
449
+
450
+
451
+ def sonde(nummer: str, was: str, praeparieren, erwartet: str) -> None:
452
+ def arbeit() -> None:
453
+ root = kopie()
454
+ try:
455
+ vorher = baumhash(root)
456
+ try:
457
+ praeparieren(root)
458
+ except Praeparationsfehler as exc:
459
+ melde("SONDE", nummer, False, was + " [Praeparation gebrochen]")
460
+ notiz(" " + str(exc))
461
+ return
462
+ if baumhash(root) == vorher:
463
+ melde("SONDE", nummer, False, was + " [nichts praepariert]")
464
+ notiz(" Der Baum ist unveraendert - vermutlich passt der Suchtext "
465
+ "der Sonde nicht mehr. Gemessen wuerde sonst die Sonde, nicht die Pruefung.")
466
+ return
467
+ ausgabe = lauf(root)
468
+ melde("SONDE", nummer, erwartet in ausgabe, was)
469
+ if erwartet not in ausgabe:
470
+ notiz(" Ausgabe:", " | ".join(ausgabe.splitlines()[:6]))
471
+ finally:
472
+ aufraeumen(os.path.dirname(root))
473
+
474
+ eintragen("SONDE", nummer, was, arbeit)
475
+
476
+
477
+ def fehlerfrei(ausgabe: str) -> bool:
478
+ """Endet der Validatorlauf ohne Fehler? Gelesen an der Ergebniszeile.
479
+
480
+ Bis 1.21.0 stand hier `"0 Fehler" in ausgabe` - das trifft auch "10 Fehler" und
481
+ "20 Fehler". Gemessen am 2026-09-30: Die Gegenprobe zu Pruefung 112 bestand an einem
482
+ Baum mit zehn offenen Fehlern (D-522). Sonde 112f haelt die Unterscheidung fest."""
483
+ return "Ergebnis: 0 Fehler," in ausgabe
484
+
485
+
486
+ def gegenprobe(nummer: str, was: str, praeparieren, verboten: str) -> None:
487
+ def arbeit() -> None:
488
+ root = kopie()
489
+ try:
490
+ if praeparieren:
491
+ vorher = baumhash(root)
492
+ try:
493
+ praeparieren(root)
494
+ except Praeparationsfehler as exc:
495
+ melde("GEGENPROBE", nummer, False,
496
+ was + " [Praeparation gebrochen]")
497
+ notiz(" " + str(exc))
498
+ return
499
+ if baumhash(root) == vorher:
500
+ melde("GEGENPROBE", nummer, False, was + " [nichts praepariert]")
501
+ return
502
+ ausgabe = lauf(root)
503
+ ok = verboten not in ausgabe and fehlerfrei(ausgabe)
504
+ melde("GEGENPROBE", nummer, ok, was)
505
+ if not ok:
506
+ notiz(" Ausgabe:", " | ".join(ausgabe.splitlines()[:6]))
507
+ finally:
508
+ aufraeumen(os.path.dirname(root))
509
+
510
+ eintragen("GEGENPROBE", nummer, was, arbeit)
511
+
512
+
513
+ P = lambda root, *teile: os.path.join(root, *teile)
514
+
515
+
516
+ def installation(pack: str) -> str:
517
+ """Frische Installation eines Packs samt Kern - das Ziel der Aktivierungspruefung."""
518
+ ziel = tempfile.mkdtemp(prefix="lw-inst-")
519
+ root = os.path.join(ziel, "projekt")
520
+ os.makedirs(root)
521
+ unterprozess([sys.executable, os.path.join(QUELLE, ".koolie/core", "install.py"),
522
+ "--client", pack, "--root", root])
523
+ shutil.copytree(os.path.join(QUELLE, ".koolie/core"),
524
+ os.path.join(root, ".koolie/core"),
525
+ ignore=shutil.ignore_patterns(".git", "__pycache__", "out"))
526
+ return root
527
+
528
+
529
+ def strict_ausgabe(root: str) -> str:
530
+ """Ausgabe der Aktivierungspruefung.
531
+
532
+ Die Kodierung besorgt unterprozess(); dort steht auch, warum sie noetig ist.
533
+ """
534
+ p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
535
+ "--root", root, "--strict-overlay"])
536
+ return (p.stdout or "") + (p.stderr or "")
537
+
538
+
539
+
540
+ def validator_ausgabe(root: str) -> str:
541
+ """Ausgabe eines gewoehnlichen Validatorlaufs gegen eine Installation."""
542
+ p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
543
+ "--root", root])
544
+ return (p.stdout or "") + (p.stderr or "")
545
+
546
+
547
+ def _p(root, rel):
548
+ return P(root, rel.replace("/", os.sep))
549
+
550
+
551
+ # --- Der Filter: eine Schleife ist kein Abnahmelauf (D-191) -----------------------
552
+ #
553
+ # ANLASS. Der Lauf faehrt 237 Einheiten, jede mit eigener Kopie des Repositoriums und
554
+ # eigenem Validatorlauf - rund 2300 s Rechenzeit, und zweimal je Release (D-49). Wer
555
+ # eine einzelne Pruefung aendert, bezahlte bis 0.68.0 den ganzen Apparat, um eine
556
+ # Meldung zu sehen. Ein Werkzeug, das vor jedem Schritt fuenf Minuten kostet, wird
557
+ # seltener gefahren, als es soll.
558
+ #
559
+ # 🔴 DIE GEFAHR IST NICHT DIE GESCHWINDIGKEIT, SONDERN DIE VERWECHSLUNG. Ein Teillauf,
560
+ # der aussieht wie ein Abnahmelauf, ist die Bauform "die Null durch Konstruktion"
561
+ # (0.59.1): gruen, weil nichts gefahren wurde. Deshalb sagt der Teillauf es dreimal -
562
+ # im Kopf, in der Ergebniszeile und im Abschlusssatz - und D-23 bleibt unberuehrt: Die
563
+ # Sonde existiert weiter, gekuerzt wird die SCHLEIFE, nicht der Nachweis.
564
+ def waehle(einheiten: list, nur: list) -> list:
565
+ """Die Einheiten, deren Kennung mit einer der genannten Marken beginnt.
566
+
567
+ `--nur 44` nimmt 44a bis 44f, `--nur 62,48b` nimmt beide Blocke der Pruefung 62 und
568
+ genau eine Gegenprobe. Verglichen wird kleingeschrieben und am ANFANG der Kennung:
569
+ Eine Marke, die nichts trifft, ist ein Abbruch und kein leerer Lauf - sonst meldete
570
+ ein Tippfehler "alle bestanden".
571
+ """
572
+ if not nur:
573
+ return list(einheiten)
574
+ gewaehlt, ohne_treffer = [], []
575
+ for marke in nur:
576
+ treffer = [e for e in einheiten if e.kennung.lower().startswith(marke)]
577
+ if not treffer:
578
+ ohne_treffer.append(marke)
579
+ for e in treffer:
580
+ if e not in gewaehlt:
581
+ gewaehlt.append(e)
582
+ if ohne_treffer:
583
+ sys.exit("--nur: keine Einheit zu %s (bekannt: %s ... ; --liste zeigt alle)"
584
+ % (", ".join(ohne_treffer),
585
+ ", ".join(e.kennung for e in einheiten[:6])))
586
+ return [e for e in einheiten if e in gewaehlt]
587
+
588
+ # --- Der Laeufer ------------------------------------------------------------------
589
+
590
+ def bahnfolge(einheiten: list) -> list:
591
+ """Reihenfolge der Einreichung - Buendel zuerst, danach wie angemeldet.
592
+
593
+ Die AUSGABE folgt der Anmeldereihenfolge; diese Folge hier bestimmt allein, welche
594
+ Einheit zuerst eine freie Bahn bekommt. Buendel sind die langen Stuecke - sie legen
595
+ echte Installationen an und fahren mehrere Validatorlaeufe nacheinander -, und ein
596
+ langes Stueck, das zuletzt beginnt, bestimmt allein das Ende des Laufs.
597
+
598
+ Sie ist fest und nicht gemessen: Eine Einreihung, die von der Laufzeit des letzten
599
+ Laufs abhinge, machte zwei Laeufe unvergleichbar und die Ausgabe von der Maschine
600
+ abhaengig.
601
+ """
602
+ return ([e for e in einheiten if e.art == "BUENDEL"]
603
+ + [e for e in einheiten if e.art != "BUENDEL"])
604
+
605
+
606
+ def fahren(einheiten: list, bahnen: int) -> int:
607
+ """Alle Einheiten fahren; ausgegeben wird in der Reihenfolge der Anmeldung.
608
+
609
+ Der Unterschied zwischen beiden Zweigen ist die Laufzeit, nicht die Ausgabe: Bei
610
+ `--bahnen 1` faellt der Ausfuehrer weg, und die Einheiten laufen in genau der
611
+ Reihenfolge, in der sie in dieser Datei stehen. Dass beide Zweige dieselben Zeilen
612
+ erzeugen, ist die Zusage dieses Umbaus - der Wirkungsnachweis dazu steht im
613
+ Protokoll zu 0.46.0.
614
+ """
615
+ if bahnen == 1:
616
+ for einheit in einheiten:
617
+ einheit.fahren()
618
+ einheit.ausgeben()
619
+ return sum(e.fehler for e in einheiten)
620
+ with ThreadPoolExecutor(max_workers=bahnen) as ausfuehrer:
621
+ auftraege = {id(e): ausfuehrer.submit(e.fahren) for e in bahnfolge(einheiten)}
622
+ for einheit in einheiten:
623
+ auftraege[id(einheit)].result()
624
+ einheit.ausgeben()
625
+ return sum(e.fehler for e in einheiten)
626
+
627
+
628
+ TRENNLINIE = ("--- Auswertung: Name und Laufzeit je Einheit, langsamste zuerst "
629
+ "(nicht Teil der zeilengleichen Abnahme nach D-49) ---")
630
+
631
+
632
+ def auswertung(einheiten: list, wanduhr: float, bahnen: int) -> None:
633
+ """Die Laufzeiten - unterhalb der Trennlinie und ausserhalb der Abnahme.
634
+
635
+ Sie stehen hier und nicht in den Ergebniszeilen, weil D-49 den Lauf in beiden
636
+ Kodierungsumgebungen ZEILENGLEICH abnimmt. Eine Laufzeit ist nie zweimal dieselbe;
637
+ stuende sie in der Ergebniszeile, brauchte der Vergleich einen Filter - und eine
638
+ Abnahmeform, die einen Filter braucht, ist keine mehr.
639
+
640
+ Die Rechenzeit ist die Summe der Einzellaufzeiten, die Wanduhr die vergangene Zeit.
641
+ Ihr Verhaeltnis ist der einzige Messwert, der etwas ueber die Nebenlaeufigkeit sagt.
642
+ """
643
+ print()
644
+ print(TRENNLINIE)
645
+ for einheit in sorted(einheiten, key=lambda e: e.dauer, reverse=True):
646
+ print("%8s s %-10s %-32s %s"
647
+ % (zahl(einheit.dauer), einheit.art, einheit.kennung,
648
+ kurz(einheit.satz, 44)))
649
+ rechenzeit = sum(e.dauer for e in einheiten)
650
+ print("Gesamt %s s Rechenzeit in %s s Wanduhr auf %d Bahn%s%s."
651
+ % (zahl(rechenzeit), zahl(wanduhr), bahnen, "" if bahnen == 1 else "en",
652
+ "" if bahnen == 1 or wanduhr <= 0
653
+ else " (Faktor %s)" % zahl(rechenzeit / wanduhr)))