@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,784 @@
1
+ """Gemeinsame Grundlage der Pruefungen: Bericht (err, warn, hinweis), Lesen,
2
+ Tabellenzellen, Dateibestand, Clienterkennung und alles, was mehr als ein Gegenstand
3
+ braucht.
4
+
5
+ Teil des Validators validate-framework.py, seit 1.19.1 nach Gegenstand in Module geteilt
6
+ (K-174). Das Register aller Pruefungen steht im Kopfkommentar des Einstiegs, die Grenze
7
+ jeder einzelnen in ihrem Kopfkommentar hier."""
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import os
12
+ import re
13
+ import subprocess
14
+ import sys
15
+
16
+
17
+ try:
18
+ import yaml # type: ignore
19
+ except ImportError: # pragma: no cover
20
+ yaml = None
21
+
22
+ # Name des Kernverzeichnisses. Er steht hier einmal statt an drei Stellen im Skript.
23
+ KERN = ".koolie/core"
24
+
25
+ # Seit 1.19.1 liegt der Code der beiden Pruefskripte in einem Paket neben seinem
26
+ # Einstieg (K-174). Wer ihren Quelltext liest - Pruefung 40 das Register und
27
+ # die Sondenmenge, Pruefung 104 die Verdrahtung -, liest den Einstieg UND sein Paket, den Einstieg zuerst: Sein
28
+ # Kopfkommentar ist das Register.
29
+ PAKET_JE_SKRIPT = {"tests/scripts/validate-framework.py": "tests/scripts/pruefungen",
30
+ "tests/scripts/probe-pruefungen.py": "tests/scripts/sonden"}
31
+
32
+
33
+ def paketquelltext(root: str, rel: str) -> str:
34
+ """Der Quelltext des Pakets zu einem Einstieg, Modul fuer Modul nach Namen."""
35
+ paket = PAKET_JE_SKRIPT.get(rel)
36
+ ordner = os.path.join(root, KERN, *paket.split("/")) if paket else ""
37
+ if not ordner or not os.path.isdir(ordner):
38
+ return ""
39
+ return "".join("\n" + read(os.path.join(ordner, name))
40
+ for name in sorted(os.listdir(ordner)) if name.endswith(".py"))
41
+
42
+
43
+ # ---------------------------------------------------------------------------
44
+ # AUSGABEFORM DER BERECHTIGUNGSDATEI - UND DIE PRUEFUNGEN, DIE AN IHR HAENGEN
45
+ # ---------------------------------------------------------------------------
46
+ # ANLASS (CR-2026-133, D-346). Bis 1.3.0 hatte jedes Client Pack dieselbe Ausgabeform:
47
+ # eine JSON-Datei mit den Koerben deny/ask/allow aus Regeln der Gestalt
48
+ # Werkzeug(Muster). Zwoelf Pruefungen lesen sie so. Das dritte Pack hat diese Gestalt
49
+ # nicht - es bindet Pfade an Zugriffsarten in einer TOML-Tabelle und Befehle in einer
50
+ # eigenen Regelsprache.
51
+ #
52
+ # EINE PRUEFUNG, DIE EINE FREMDE FORM LIEST, MELDET EINEN FEHLER, DEN ES NICHT GIBT;
53
+ # EINE, DIE SIE STILL UEBERSPRINGT, MISST EIN PACK NICHT UND SAGT ES NICHT.
54
+ # ➡️ Deshalb steht die Menge hier, sie wird benannt, und Pruefung 87 haelt sie gegen den
55
+ # Abschnitt 5 des betroffenen Packs. Aus einer stillen Luecke wird eine erklaerte.
56
+ #
57
+ # Ein Pack sagt seine Form im Manifest (permissions_format); der Standard ist "json" -
58
+ # eine Form wird gesagt, nicht durch Schweigen geerbt.
59
+ #
60
+ # SEIT 1.13.0 NENNT JEDER EINTRAG DIE FORMEN, DIE ER ERREICHT (CR-2026-150, D-416).
61
+ # Bis dahin war die Menge an genau eine Frage gebunden - "json oder nicht" -, und zwei
62
+ # Dinge stimmten nicht: (1) Sie fuehrte als Nummer 76 "Das Pack steht im eigenen
63
+ # Korb"; Pruefung 76 ist die Kernlage und laeuft bei jeder Form. Gemeint war 72, und
64
+ # die enthielt sich bei openai-codex nicht, weil sie hier stand, sondern weil
65
+ # json.loads an der TOML-Datei scheiterte - still. (2) Vier dieser Pruefungen (37, 42,
66
+ # 43, 54, 72) hatten gar keinen Schutz; sie lasen eine Datei, die bei TOML nicht
67
+ # einlesbar war. Das dritte JSON-Format (das Agentenprofil von kiro) IST einlesbar, und
68
+ # dieselben Pruefungen meldeten 64 Fehler, die es nicht gab. Jede Pruefung der Menge
69
+ # fragt deshalb jetzt ausdruecklich formatgebunden() - und 72 erreicht das
70
+ # Agentenprofil, weil sie dort liest, was sie braucht.
71
+ FORMATGEBUNDENE_PRUEFUNGEN = {
72
+ 2: ("Berechtigungsdatei als JSON, Kernregeln unter _core_rules_integrity", {"json"}),
73
+ 37: ("Die drei Koerbe der installierten Datei gegen die Kernquelle", {"json"}),
74
+ 42: ("Der Befehlsschlitz traegt den Befehl, den das Overlay erklaert", {"json"}),
75
+ 43: ("Die Berechtigungsdatei traegt den Hook, den das Pack dort fuehrt", {"json"}),
76
+ 54: ("Deklarierte Zusatzschluessel stehen auf ihrer Ebene", {"json"}),
77
+ 59: ("Gegenstand (c): die ausgeschlossenen Pfade im deny-Korb", {"json"}),
78
+ 72: ("Jeder installierte Skill steht in der Berechtigungsdatei",
79
+ {"json", "kiro-agent"}),
80
+ 89: ("Gegenstand (c): die Nur-Lese-Pfade im deny-Korb", {"json"}),
81
+ }
82
+
83
+
84
+ def formatgebunden(man: dict, nummer: int) -> bool:
85
+ """Wahr, wenn diese Pruefung die Ausgabeform dieses Packs nicht erreicht. Der
86
+ Aufrufer kehrt dann zurueck, ohne zu melden - die Auslassung steht in
87
+ FORMATGEBUNDENE_PRUEFUNGEN und wird von Pruefung 87 eingefordert."""
88
+ if nummer not in FORMATGEBUNDENE_PRUEFUNGEN:
89
+ raise KeyError(
90
+ f"Pruefung {nummer} beruft sich auf die Ausgabeform, steht aber nicht in "
91
+ f"FORMATGEBUNDENE_PRUEFUNGEN. Eine Auslassung, die nirgends steht, ist die "
92
+ f"stille Luecke, die D-346 abgestellt hat")
93
+ return man.get("permissions_format", "json") not in FORMATGEBUNDENE_PRUEFUNGEN[nummer][1]
94
+
95
+ ERRORS: list[str] = []
96
+ WARNINGS: list[str] = []
97
+ # Seit 1.8.0 (D-367): Zeilen, die eine reduzierte Installation erklaeren - was sie nicht
98
+ # mitliefert und welche Pruefung deshalb nichts zu pruefen hat. Sie zaehlen weder als
99
+ # Fehler noch als Warnung; eine reduzierte Installation ist kein Mangel. Stumm bleiben
100
+ # duerfen sie nicht: Eine Luecke, die nur besteht, ist ein blinder Fleck (D-346).
101
+ HINWEISE: list[str] = []
102
+
103
+ # ".cmd" und ".command" seit 1.7.0: die Starter des Installers (D-365). Ohne sie lasen
104
+ # weder die Neutralitaets- noch die Zeilenendepruefungen diese Traeger.
105
+ TEXT_EXT = {".md", ".json", ".yaml", ".yml", ".txt", ".py", ".template", ".example",
106
+ ".cmd", ".command"}
107
+ SKIP_DIRS = {".git", "build", "node_modules", "__pycache__", "target", "dist", ".venv"}
108
+ SKILL_STATUS = {"entwurf", "pilot", "aktiv", "veraltet", "zurückgezogen"}
109
+ PLACEHOLDER_RE = re.compile(r"<([A-Z][A-Z0-9_]{2,})>")
110
+ TBD_RE = re.compile(r"<TBD[:>]")
111
+
112
+ # --- Zellen einer Markdown-Tabellenzeile (CR-2026-060, D-75) --------------------
113
+ # GFM trennt Zellen am Strich; ein Strich INNERHALB einer Zelle wird maskiert (\\|)
114
+ # und bleibt Inhalt. Eine Zerlegung, die das nicht kennt, beanstandet einen korrekten
115
+ # Text - gemessen an Pruefung 30, die eine Grenzfallzeile mit maskiertem Strich als
116
+ # neunspaltig meldete, obwohl sie siebenspaltig rendert. D-69 des Decision Logs
117
+ # traegt genau diese Schreibweise seit 0.36.0.
118
+ #
119
+ # Die Zerlegung lag bis 0.37.0 VIERMAL eigenhaendig im Validator. Sie liegt jetzt
120
+ # einmal: vier Gelegenheiten fuer denselben Fehler sind eine.
121
+ ZELLTRENNER_RE = re.compile(r"(?<!\\)\|")
122
+
123
+
124
+ def tabellenzellen(zeile: str) -> list:
125
+ """Die Zellen einer Tabellenzeile, maskierte Striche als Inhalt.
126
+
127
+ Erwartet eine Zeile, die mit '|' beginnt; die aeusseren Striche sind Rahmen und
128
+ zaehlen nicht als Zellen. Fuer eine Zeile ohne Rahmen liefert sie die Felder
129
+ zwischen den Trennern.
130
+ """
131
+ z = zeile.strip()
132
+ teile = ZELLTRENNER_RE.split(z)
133
+ if z.startswith("|"):
134
+ teile = teile[1:]
135
+ if z.endswith("|") and not z.endswith("\\|") and teile:
136
+ teile = teile[:-1]
137
+ return [t.strip() for t in teile]
138
+
139
+
140
+ def err(msg: str) -> None:
141
+ ERRORS.append(msg)
142
+
143
+
144
+ def warn(msg: str) -> None:
145
+ WARNINGS.append(msg)
146
+
147
+
148
+ def hinweis(msg: str) -> None:
149
+ if msg not in HINWEISE:
150
+ HINWEISE.append(msg)
151
+
152
+
153
+ def read(path: str) -> str:
154
+ with open(path, encoding="utf-8") as fh:
155
+ return fh.read()
156
+
157
+
158
+ def _gitignore_namen(root: str) -> set:
159
+ """Die DATEINAMEN, die die .gitignore der Wurzel als nicht zu teilend fuehrt.
160
+
161
+ 🔴 WARUM DER VALIDATOR SIE UEBERSPRINGT (D-215, CR-2026-106): Was nicht
162
+ eingecheckt wird, ist kein Bestandteil des Repositoriums - und eine Pruefung,
163
+ die es trotzdem meldet, prueft am Gegenstand vorbei. Gemessen am 2026-09-20:
164
+ Die lokale Beilage der Uebergabe traegt Servername und Konto, steht in der
165
+ .gitignore, und der Validator meldete gegen sie zwei Fehler. Sie existiert
166
+ gerade deshalb, damit diese Angaben NICHT im Repositorium stehen.
167
+
168
+ 🔴 BEWUSST NUR EINFACHE DATEINAMEN, keine Muster und keine Pfade. Ein
169
+ `*`-Muster oder ein Verzeichnis liesse sich hier eintragen, um eine echte
170
+ Pruefung stillzulegen - `.koolie/core/**` wuerde den halben Kern
171
+ ausblenden, und niemand saehe es. Ein Dateiname trifft eine Datei, und die
172
+ Liste ist kurz genug zum Lesen. Zeilen mit `/`, `*`, `?`, `[` oder `!`
173
+ werden ignoriert.
174
+ """
175
+ pfad = os.path.join(root, ".gitignore")
176
+ namen = set()
177
+ if not os.path.isfile(pfad):
178
+ return namen
179
+ # `read` ist die Leseroutine dieses Moduls; ein eigener `io`-Import waere ein
180
+ # zweiter Weg zum selben Zweck.
181
+ try:
182
+ roh = read(pfad)
183
+ except OSError:
184
+ return namen
185
+ for zeile in roh.splitlines():
186
+ z = zeile.strip()
187
+ if not z or z.startswith("#"):
188
+ continue
189
+ if any(c in z for c in "/*?[!"):
190
+ continue
191
+ namen.add(z)
192
+ return namen
193
+
194
+
195
+ def _walk_text_files(start: str, ignoriert: set = frozenset()):
196
+ for dirpath, dirnames, filenames in os.walk(start):
197
+ dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS]
198
+ for fn in filenames:
199
+ if fn in ignoriert:
200
+ continue
201
+ ext = os.path.splitext(fn)[1]
202
+ if ext in TEXT_EXT or fn in ("VERSION", ".gitignore"):
203
+ yield os.path.join(dirpath, fn)
204
+
205
+
206
+ def iter_text_files(root: str):
207
+ ignoriert = _gitignore_namen(root)
208
+ yield from _walk_text_files(root, ignoriert)
209
+ # 'build' steht in SKIP_DIRS, weil dort die Erzeugnisse eines Projekts liegen. Die
210
+ # handgeschriebenen Quellen des Hauptdokuments liegen aber darunter und gehoeren
211
+ # geprueft - gerade weil aus ihnen ein Lieferbestandteil entsteht. Vier Backticks
212
+ # brechen genau hier die Assemblierung, und ein Secret erschiene im ausgelieferten
213
+ # Dokument.
214
+ #
215
+ # 🔴 BIS 0.89.0 STAND HIER NUR build/doc - UND DIE DREI TRAEGER DANEBEN ERREICHTE
216
+ # KEINE EINZIGE PRUEFUNG (D-313, CR-2026-125): assemble.py, build-docx.py und
217
+ # build/README.md. Begruendet war das mit EINER Frage - die Werkzeuge fuehren eigene
218
+ # Marker in spitzen Klammern, die keine Framework-Platzhalter sind. Gewirkt hat es auf
219
+ # ZWOELF Pruefungen, die ueber diesen Iterator laufen. Gemessen beim Oeffnen am
220
+ # 2026-09-23: zwei Fehler und zwei Warnungen. Die zwei Warnungen SIND die Begruendung
221
+ # und haben jetzt eine eigene, benannte Ausnahme bei der einen Frage, fuer die sie
222
+ # gilt (OHNE_PLATZHALTERREGISTER). Die zwei Fehler sind Pruefung 14 am Erzeuger der
223
+ # Word-Fassung: Er haette den ueberholten Dokumenttitel samt CLIENTNAMEN in die
224
+ # Dokumenteigenschaften der Lieferung gestempelt.
225
+ # ➡️ Dieselbe Auflösung wie bei D-311: eine benannte Ausnahme ueber benannte Traeger
226
+ # statt einer stummen ueber ein Verzeichnis. EINE AUSNAHME GILT SO WEIT WIE IHRE
227
+ # BEGRUENDUNG UND NICHT SO WEIT WIE IHR MECHANISMUS.
228
+ #
229
+ # `out/` bleibt aussen vor und das ist kein Versehen: Es ist das ERZEUGNIS, steht in
230
+ # der .gitignore und ist in einer frischen Auscheckung nicht da. Eine Pruefung dagegen
231
+ # waere im Framework gruen und in jeder Installation rot - der Konstruktionsfehler,
232
+ # den Pruefung 75 mit 0.88.0 zweimal bezahlt hat.
233
+ bau = os.path.join(root, KERN, "build")
234
+ if os.path.isdir(bau):
235
+ for pfad in _walk_text_files(bau, ignoriert):
236
+ if os.path.relpath(pfad, bau).replace(os.sep, "/").startswith("out/"):
237
+ continue
238
+ yield pfad
239
+
240
+
241
+ def parse_frontmatter(text: str):
242
+ if not text.startswith("---"):
243
+ return None, text
244
+ parts = text.split("---", 2)
245
+ if len(parts) < 3:
246
+ return None, text
247
+ fm_text, body = parts[1], parts[2]
248
+ if yaml is None:
249
+ return {"_raw": fm_text}, body
250
+ try:
251
+ data = yaml.safe_load(fm_text) or {}
252
+ except yaml.YAMLError as exc: # type: ignore[attr-defined]
253
+ return {"_error": str(exc)}, body
254
+ return data, body
255
+
256
+
257
+ # --- Clienterkennung (Client Packs) -------------------------------------------
258
+ # Der Validator lief frueher fest gegen .devin/. Seit es mehrere Client Packs gibt,
259
+ # wird die Laufzeitschicht erkannt: Jedes Pack beschreibt seine Pfade in
260
+ # clients/<name>/manifest.json; geprueft wird das Pack, dessen runtime_dir im
261
+ # Zielverzeichnis tatsaechlich liegt.
262
+ MANIFEST_FALLBACK = {
263
+ "client": "unbekannt", "runtime_dir": ".devin", "root_instruction_file": "AGENTS.md",
264
+ "permissions_file": ".devin/config.json", "skills_dir": ".devin/skills",
265
+ "agents_dir": ".devin/agents", "pack_runtime_dir": ".devin/rules",
266
+ "has_rule_triggers": True,
267
+ }
268
+
269
+
270
+ def detect_client(root: str) -> dict:
271
+ """Manifest des installierten Client Packs. Fallback, wenn keines zutrifft."""
272
+ base = os.path.join(root, KERN, "clients")
273
+ treffer = []
274
+ if os.path.isdir(base):
275
+ for name in sorted(os.listdir(base)):
276
+ mp = os.path.join(base, name, "manifest.json")
277
+ if not os.path.exists(mp):
278
+ continue
279
+ try:
280
+ man = json.loads(read(mp))
281
+ except json.JSONDecodeError as exc:
282
+ err(f"clients/{name}/manifest.json ist kein gültiges JSON: {exc}")
283
+ continue
284
+ if os.path.isdir(os.path.join(root, *man.get("runtime_dir", "").split("/"))):
285
+ # <CORE_DIR> ist die LAGE des Kerns unter der Projektwurzel, nicht der
286
+ # Name eines Verzeichnisses. Bis 0.87.0 stand hier os.path.basename()
287
+ # ueber drei dirname-Aufrufe; seit der Kern zwei Segmente tief liegt,
288
+ # lieferte das "core" statt ".koolie/core" - und der Validator haette
289
+ # denselben falschen Wert gebunden wie install.py und deshalb nichts
290
+ # gemeldet (D-299).
291
+ man.setdefault("runtime_placeholders", {})["<CORE_DIR>"] = KERN
292
+ treffer.append(man)
293
+ if len(treffer) > 1:
294
+ namen = ", ".join(m["client"] for m in treffer)
295
+ err(f"Mehrere Laufzeitschichten gleichzeitig vorhanden ({namen}). "
296
+ f"Ein Projekt nutzt genau ein Client Pack.")
297
+ return treffer[0] if treffer else MANIFEST_FALLBACK
298
+
299
+
300
+ def regel_endung(man: dict) -> str:
301
+ """Die Endung der Regeldateien dieses Packs (cursor: .mdc, CR-2026-155) - dieselbe
302
+ Auskunft wie clientmap.regel_endung(), hier ohne Import, weil die Pruefungen auch
303
+ ohne das Abbildungsmodul laufen muessen."""
304
+ return man.get("rule_file_ext", ".md")
305
+
306
+
307
+ def regeldatei(man: dict, name: str) -> str:
308
+ """'20-project-overlay.md' in der Schreibweise der Regelablage dieses Packs."""
309
+ endung = regel_endung(man)
310
+ return name[:-3] + endung if endung != ".md" and name.endswith(".md") else name
311
+
312
+
313
+ # ---------------------------------------------------------------------------
314
+ # 37: Die drei Koerbe der Berechtigungsdatei gegen die Kernquelle
315
+ # ---------------------------------------------------------------------------
316
+ #
317
+ # Anlass ist eine Messung vom 2026-09-13 (CR-2026-061, D-77): Die erzeugte Datei traegt
318
+ # 65 Regeln, geprueft waren dreizehn. Ein Projekt konnte 41 deny-Regeln loeschen, den
319
+ # ask-Korb leeren und eine allow-Zeile ergaenzen, ohne dass ein Lauf davon Notiz nahm -
320
+ # und install.py --update fasst die Datei nie an, --check nennt sie nicht einmal.
321
+ #
322
+ # Die Pruefung ist das Verschaerfungsprinzip, mechanisch angewandt
323
+ # (PRIORITY_HIERARCHY.md Regel 2.1), in zwei Saetzen:
324
+ # Fehlt eine erzeugte Regel, ist es ein Fehler - in jedem Korb.
325
+ # Steht eine Regel zu viel, entscheidet der Korb: in deny zulaessig (Verschaerfung),
326
+ # in ask und allow ein Fehler (Ausweitung) - abzueglich der Platzhalterschlitze
327
+ # UND der Skillfreigaben aktivierter Packs (D-243, siehe skillfreigaben()).
328
+ PROJEKTPLATZHALTER = re.compile(r"<[A-Z][A-Z0-9_]*>")
329
+
330
+
331
+ def korb_zerlegung(ist: list, soll_korb: list) -> tuple:
332
+ """Ein Korb in Pflicht, Schlitze, gefuellte Schlitze und Ueberschuss.
333
+
334
+ Die Zerlegung lag bis 0.43.0 in check_berechtigungskoerbe und wurde fuer Pruefung 42
335
+ ein zweites Mal gebraucht. Sie liegt jetzt einmal: zwei Gelegenheiten fuer denselben
336
+ Fehler sind eine - dieselbe Begruendung wie bei tabellenzellen() mit 0.37.0.
337
+
338
+ pflicht Regeln ohne Projektplatzhalter; sie muessen dastehen.
339
+ schlitze Regeln mit Projektplatzhalter; sie gehoeren dem Projekt.
340
+ ungefuellt Schlitze, die woertlich in der Datei stehen. Sie sind noch offen.
341
+ zusatz Regeln der Datei, die weder Pflicht noch ein offener Schlitz sind - ein
342
+ gefuellter Schlitz steht hier ebenso wie eine hinzugefuegte Freigabe.
343
+ WELCHE von beiden, sagt diese Funktion nicht und kann es nicht sagen;
344
+ das ist der Gegenstand von Pruefung 42.
345
+ """
346
+ pflicht = [r for r in soll_korb if not PROJEKTPLATZHALTER.search(r)]
347
+ schlitze = [r for r in soll_korb if PROJEKTPLATZHALTER.search(r)]
348
+ ungefuellt = [s for s in schlitze if s in ist]
349
+ zusatz = [r for r in ist if r not in pflicht and r not in schlitze]
350
+ return pflicht, schlitze, ungefuellt, zusatz
351
+
352
+
353
+ def fremde_praefixe(root: str) -> list:
354
+ """Die zulaessig deklarierten Praefixe fremder Skills (1.21.0, K-31, Pruefung 111).
355
+
356
+ Fehlt koexistenz.py (etwa in einer Teilkopie des Kerns), gilt nichts als deklariert -
357
+ die Skills werden dann wie bisher als Koolie-Skills geprueft, strenger und nicht lockerer.
358
+ """
359
+ kern = os.path.join(root, KERN)
360
+ if not os.path.isdir(kern):
361
+ return []
362
+ if kern not in sys.path:
363
+ sys.path.insert(0, kern)
364
+ try:
365
+ import koexistenz
366
+ except ImportError:
367
+ return []
368
+ return [p for p in koexistenz.deklariert(root) if koexistenz.zulaessig(p)]
369
+
370
+
371
+ def soll_korbregeln(root: str, man: dict) -> dict | None:
372
+ """Die drei Koerbe in der Schreibweise dieses Clients, aus der Kernquelle.
373
+
374
+ Dieselbe Quelle wie soll_kernregeln, nur ohne die Einschraenkung auf 'core': true.
375
+ Fehlt das Abbildungsmodul, unterbleibt die Pruefung - check_config hat dafuer bereits
376
+ gewarnt, und eine zweite Warnung ueber dieselbe Tatsache waere Laerm.
377
+ """
378
+ kern = os.path.join(root, KERN)
379
+ if not os.path.isdir(kern):
380
+ return None
381
+ if kern not in sys.path:
382
+ sys.path.insert(0, kern)
383
+ try:
384
+ import clientmap
385
+ except ImportError:
386
+ return None
387
+ # Sonde auf den verlorenen Anker (seit 0.32.0): Diese Pruefung findet ihren
388
+ # Gegenstand ueber einen Funktionsnamen. Geht er bei einem Umbau verloren, bestuende
389
+ # sie leise - deshalb meldet sie sein Fehlen selbst.
390
+ if not hasattr(clientmap, "basket_rules"):
391
+ err(f"{KERN}/clientmap.py: Funktion 'basket_rules(' fehlt – Prüfung 37 hat ihren "
392
+ f"Gegenstand verloren und würde sonst leise bestehen")
393
+ return None
394
+ try:
395
+ quelle = json.loads(clientmap.load_source(kern, "permissions.json"))
396
+ return {korb: clientmap.basket_rules(quelle, man, korb)
397
+ for korb in ("deny", "ask", "allow")}
398
+ except (OSError, ValueError) as exc:
399
+ err(f"Kernquelle der Berechtigungen nicht auswertbar: {exc}")
400
+ return None
401
+
402
+
403
+ def skill_dirs(root: str, man: dict) -> list[tuple[str, str]]:
404
+ """Alle Skill-Ablagen: die aktivierte Laufzeitschicht und die Quellablagen der Packs.
405
+
406
+ Pack-Skills liegen unter framework/{role,tech}-packs/<pack>/skills/ und werden erst zur
407
+ Aktivierung nach .devin/skills/ kopiert. Ohne diese Ablagen wuerde ein fehlerhafter
408
+ Pack-Skill erst im uebernehmenden Projekt auffallen - also nach der Auslieferung.
409
+ """
410
+ out: list[tuple[str, str]] = []
411
+ runtime = os.path.join(root, *man["skills_dir"].split("/"))
412
+ if os.path.isdir(runtime):
413
+ out.append((runtime, man["skills_dir"]))
414
+ # Gemeinsame Quelle der Framework-Skills (seit 0.5.0). Sie wird streng geprueft;
415
+ # die installierte Fassung ist daraus erzeugt.
416
+ quelle = os.path.join(root, ".koolie/core", "framework", "skills")
417
+ if os.path.isdir(quelle):
418
+ out.append((quelle, ".koolie/core/framework/skills"))
419
+ for kind in ("role-packs", "tech-packs"):
420
+ base = os.path.join(root, ".koolie/core", "framework", kind)
421
+ if not os.path.isdir(base):
422
+ continue
423
+ for pack in sorted(os.listdir(base)):
424
+ src = os.path.join(base, pack, "skills")
425
+ if os.path.isdir(src):
426
+ out.append((src, f".koolie/core/framework/{kind}/{pack}/skills"))
427
+ return out
428
+
429
+
430
+ # --- Ausnahmen der Werkzeugneutralitaet (D-128, D-129) ----------------------------
431
+ #
432
+ # EINE Menge fuer BEIDE Pruefungen, die den Kern auf Clientbindung halten: Pruefung 14
433
+ # (der Produktname) und Pruefung 48 (der Pfad). Bis 0.57.0 fuehrten sie zwei Mengen -
434
+ # und die waren schon auseinandergelaufen: docs/ROADMAP.md stand nur in einer von
435
+ # beiden. Zwei Listen fuer denselben Gegenstand driften; eine tut es nicht.
436
+ #
437
+ # Die Gattungen und ihre Begruendung stehen in docs/RUNTIME_GLOSSARY.md, nicht hier -
438
+ # eine Ausnahme, die nur im Quelltext steht, ist keine Regel, sondern eine
439
+ # Voreinstellung.
440
+ NEUTRAL_CHRONIK = (
441
+ KERN + "/CHANGELOG.md",
442
+ KERN + "/governance/change-requests/",
443
+ KERN + "/governance/DECISION_LOG.md",
444
+ KERN + "/tests/protocols/",
445
+ KERN + "/docs/ROADMAP.md",
446
+ )
447
+ # Jeder Aenderungsverlauf ist ein historisches Dokument, nicht nur der des Frameworks.
448
+ NEUTRAL_CHRONIK_BASENAMES = ("CHANGELOG.md",)
449
+ # DIE BEFRISTETE AUSNAHME FUER build/ IST MIT 0.89.0 GEFALLEN (AP11, D-311).
450
+ #
451
+ # Sie galt fuer das GANZE Verzeichnis, mit der Begruendung, es halte die Quellen des
452
+ # Hauptdokuments, das mit AP11 neu gesetzt werde. Gemessen beim Neusetzen: Von 36
453
+ # Fundstellen lagen 27 in den beiden ANHANG- und ABSCHLUSSTRAEGERN - der Quellenliste
454
+ # JE CLIENT PACK und dem konsolidierten Verifikationsbedarf EINES Packs. Das ist
455
+ # dieselbe Gattung, die NEUTRAL_ABBILDUNG seit 0.57.1 dauerhaft ausnimmt, und
456
+ # CR-2026-025 E3 hatte sie 2026-09-11 auch schon ausdruecklich ausgewiesen
457
+ # ("die Anhaenge beschreiben teils Pruefpunkte gegen die Dokumentation eines konkreten
458
+ # Clients"). EINE FRIST UEBER EINEN GEGENSTAND, DER DIE AUSNAHME DAUERHAFT BRAUCHT,
459
+ # KANN NICHT ABLAUFEN - sie sieht nur zwanzig Releases lang so aus, als lehne sie an.
460
+ #
461
+ # Die uebrigen neun Fundstellen lagen in den Kapiteln und sind mit 0.89.0 aufgeloest.
462
+ # Was bleibt, ist eine Dauerausnahme ueber DREI benannte Traeger, nicht ueber ein
463
+ # Verzeichnis:
464
+ # 29-grenzen.md Zeitdokument des Stands vom 2026-09-01, ausdruecklich nicht
465
+ # fortgeschrieben - Chronik wie CHANGELOG.md und DECISION_LOG.md
466
+ # 31-anhaenge.md Quellenliste JE CLIENT PACK und Verifikationsbedarf EINES Packs
467
+ # 32-abschluss.md Chronik der Releases und die Aussagen des Auftrags UEBER die
468
+ # Produktnennung selbst ("der Hersteller-/Produktbezug ist fuer
469
+ # Phase 3 erforderlich")
470
+ NEUTRAL_DOKUMENT = (
471
+ KERN + "/build/doc/29-grenzen.md",
472
+ KERN + "/build/doc/31-anhaenge.md",
473
+ KERN + "/build/doc/32-abschluss.md",
474
+ )
475
+
476
+
477
+ # Pruefung 15: Der Interpreter der Hook-Aufrufe startet auf dieser Maschine wirklich
478
+ # Python. Geprueft wird die Wirkung, nicht die Anwesenheit des Namens (AP2-CC-13).
479
+ HOOK_SONDE = "KOOLIE-INTERPRETER-OK"
480
+
481
+
482
+ def _client_packs(root: str) -> list[tuple[str, str, dict]]:
483
+ """(Kennung, Verzeichnis, Manifest) je Client Pack; OHNE die Vorlage `_template`.
484
+
485
+ 🔴 D-336: Bis 1.2.0 stand hier "_template ohne Manifest" - eine Annahme, keine
486
+ Ausnahme. `_template` traegt eine CLIENT_PACK.md und stand damit in dieser Menge;
487
+ was es vor allen Pruefungen schuetzte, war allein sein fehlendes `manifest.json`.
488
+ Gemessen am 2026-09-23 mit einem Probemanifest: drei Packs mit Manifest, Validator
489
+ 0 Fehler. Und `clients/README.md` Schritt 5 verlangt genau dieses Manifest fuer
490
+ jedes neue Pack.
491
+ ➡️ Eine Vorlage, die nur durch ihre Unvollstaendigkeit ungeprueft bleibt, ist nicht
492
+ ausgenommen. Die Ausnahme steht seit D-336 HIER, wo die Packmenge entsteht - und
493
+ Pruefung 84 haelt fest, was sie voraussetzt.
494
+ """
495
+ raus: list[tuple[str, str, dict]] = []
496
+ cdir = os.path.join(root, KERN, "clients")
497
+ if not os.path.isdir(cdir):
498
+ return raus
499
+ for name in sorted(os.listdir(cdir)):
500
+ if name == "_template":
501
+ continue # die Vorlage ist kein Pack (D-336, Pruefung 84)
502
+ pdir = os.path.join(cdir, name)
503
+ if not os.path.isdir(pdir):
504
+ continue
505
+ if not os.path.isfile(os.path.join(pdir, "CLIENT_PACK.md")):
506
+ continue
507
+ mf = os.path.join(pdir, "manifest.json")
508
+ man: dict = {}
509
+ if os.path.isfile(mf):
510
+ try:
511
+ man = json.loads(read(mf))
512
+ except Exception:
513
+ man = {}
514
+ raus.append((name, pdir, man))
515
+ return raus
516
+
517
+
518
+ def _hook_interpreter() -> str | None:
519
+ """Der erste Interpretername, der auf dieser Maschine wirklich Python startet."""
520
+ for kandidat in ("python3", "python", "py"):
521
+ try:
522
+ lauf = subprocess.run([kandidat, "-c", "import sys; sys.stdout.write('%s')" % HOOK_SONDE],
523
+ capture_output=True, text=True, timeout=15)
524
+ if lauf.returncode == 0 and HOOK_SONDE in (lauf.stdout or ""):
525
+ return kandidat
526
+ except (OSError, subprocess.SubprocessError):
527
+ continue
528
+ return None
529
+
530
+
531
+ def _hook_lauf(interpreter: str, skript: str, eingabe: str) -> int:
532
+ """Ruft den Schutz-Hook mit --fail-closed auf und liefert den Exit-Code."""
533
+ try:
534
+ lauf = subprocess.run([interpreter, skript, "--fail-closed"], input=eingabe,
535
+ capture_output=True, text=True, timeout=20,
536
+ env={k: v for k, v in os.environ.items()
537
+ if k != "FW_HOOK_FAIL_CLOSED"})
538
+ except (OSError, subprocess.SubprocessError):
539
+ return -1
540
+ return lauf.returncode
541
+
542
+
543
+ # Pruefung 38: Eine Quelle, ein Vokabular - und die Sperrliste ist nie enger als die
544
+ # Vorabfreigabe (CR-2026-062, D-78 bis D-80).
545
+ #
546
+ # ANLASS. Ein Manifest fuehrt VIER Werkzeugabbildungen, nicht zwei: skill_frontmatter.
547
+ # tool_names, agent_frontmatter.tool_names, hook_tools und permission_tools - dazu
548
+ # agent_start_tools daneben. Drei Vokabulare stossen darin aufeinander: das der Quelle
549
+ # (read, grep, glob, edit, exec), das des Hooks (read, search, exec, write) und das der
550
+ # Berechtigungsdatei (read, search, write, exec, fetch, mcp).
551
+ #
552
+ # Gemessen am 2026-09-13 (tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md):
553
+ # DREI der vier Abbildungen brechen ab, wenn ihnen ein Verb fehlt - die vierte reichte
554
+ # es woertlich durch, und sie kommt zweimal vor. Eine geleerte tool_names-Abbildung
555
+ # lieferte 'tools: read, grep, glob' im Agentenprofil fw-reviewer, also drei Namen, die
556
+ # dieser Client nicht kennt (M16); ein 'permissions.deny: glob' erzeugte lautlos keine
557
+ # Sperre, und der Validator meldete 0 Fehler (M6).
558
+ #
559
+ # VIER GEGENSTAENDE:
560
+ # 1. Der verlorene Anker. Fehlen clientmap.FRONTMATTER_VERBEN oder VERB_BRUECKE,
561
+ # meldet diese Pruefung das selbst - sonst bestuende sie leise (D-23).
562
+ # 2. Die Deklaration je Pack. Jedes Verb des Vokabulars ist in tool_names abgebildet
563
+ # ODER in tool_names_unmapped erklaert, samt nicht leerer _tool_names_unmapped_note;
564
+ # beides zugleich ist ein Widerspruch, ein Schluessel ausserhalb des Vokabulars ein
565
+ # Schreibfehler. Bauform wie Pruefung 26 (hook_tools_absent, D-47) und Pruefung 34.
566
+ # 3. Die RICHTUNG zwischen Vorabfreigabe und Sperre. Fuer jedes Verbpaar der Bruecke
567
+ # muss hook_tools mindestens so weit sein wie tool_names. Heute ist es das bei allen
568
+ # fuenf; die Abweichung, die es gibt, geht in die zulaessige Richtung
569
+ # (tool_names.edit fuehrt Edit und Write, hook_tools.write zusaetzlich NotebookEdit).
570
+ # Umgekehrt waere sie eine Luecke: Ein Skill, der 'edit' vorab freigibt und 'edit'
571
+ # sperrt, bekaeme ein Werkzeug freigegeben, das die Sperre nicht erfasst.
572
+ # 4. Die Quellen. Kein ausgeliefertes SKILL.md und kein Agentenprofil nennt in
573
+ # allowed-tools oder permissions.deny ein Verb ausserhalb des Vokabulars.
574
+ #
575
+ # WAS SIE HEUTE FAENGT: bei den beiden Packs nichts - sie sind in Ordnung, seit
576
+ # devin-desktop seine fuenf nicht abgebildeten Verben deklariert. Gegenstand 3 ist eine
577
+ # VERANKERUNG wie Pruefung 35 und 36; Gegenstand 2 faengt gegen 0.39.0 zehn Fundstellen,
578
+ # Gegenstand 4 keine. Das steht so im Wirkungsnachweis und ist kein Abzaehlen von
579
+ # Befunden, sondern eines von Deklarationen.
580
+ #
581
+ # WAS SIE NICHT LEISTET: Sie belegt nicht, dass die Werkzeugnamen eines Packs RICHTIG
582
+ # sind - das kann nur eine Erhebung, und fuer devin-desktop steht sie aus. Sie belegt,
583
+ # dass jedes Verb des Vokabulars eine Antwort hat und dass die beiden Listen nicht in
584
+ # die gefaehrliche Richtung auseinanderlaufen.
585
+ FRONTMATTER_BLOECKE = ("skill_frontmatter", "agent_frontmatter")
586
+
587
+
588
+ # ---------------------------------------------------------------------------
589
+ # Pruefung 40: Die Register des Pruefapparats werden nachgezaehlt
590
+ # ---------------------------------------------------------------------------
591
+ #
592
+ # ANLASS. Gemessen am 2026-09-14 (tests/protocols/2026-09-14-gegenpruefung-pruefregister.md,
593
+ # CR-2026-064): FUENF Aussagen ueber den eigenen Pruefstand, keine davon richtig. Das
594
+ # Register im Kopfkommentar dieser Datei fuehrte die Pruefungen 1 bis 38, waehrend 39
595
+ # lief; der Satz zum Wirkungsnachweis nannte "18 bis 30"; der Kopfsatz des Sondenskripts
596
+ # war eine Release-Chronik, die bei 0.29.0 endete; FW-KO-01 nannte "6, 18 bis 31" und
597
+ # FW-KO-05 zwoelf Grenzfaelle, wo es zwanzig sind. KEINE der fuenf war falsch
598
+ # geschrieben - alle fuenf waren bei ihrer Einfuehrung richtig und sind stehen geblieben,
599
+ # waehrend ihr Gegenstand wuchs. In zehn von zwoelf Releases hat sich mindestens eine der
600
+ # drei Zahlen bewegt; deshalb ist die Behebung eine Pruefung und keine Textaenderung.
601
+ #
602
+ # VIER GEGENSTAENDE:
603
+ # 1. Der verlorene Anker. Fuenf Ankertexte in vier Dateien. Geht einer verloren,
604
+ # bestuende diese Pruefung leise - sie meldet sein Fehlen deshalb selbst (D-23).
605
+ # 2. Das Register ist lueckenlos von 1 bis zu seiner hoechsten Nummer, und diese
606
+ # hoechste Nummer ist die hoechste, die in den beiden Pruefskripten ueberhaupt
607
+ # genannt wird. In beide Richtungen: eine Pruefung ohne Eintrag ist ein Fehler, ein
608
+ # Eintrag ohne Nennung im Code auch.
609
+ # 3. Die Sondenmenge steht an DREI Stellen in derselben, ausgerechneten Schreibweise -
610
+ # im Satz unter dem Register, im Kopfsatz von probe-pruefungen.py und in der
611
+ # Pruefmittelspalte von FW-KO-01. Der Vergleich ist woertlich, und die Fehlermeldung
612
+ # nennt die richtige Zeichenkette (D-86).
613
+ # 4. Die Grenzfallanzahl in FW-KO-05 ist die gezaehlte. Pruefung 30 rechnet sie
614
+ # INNERHALB von EDGE_CASES.md nach; ausserhalb nennt sie nur dieses Testblatt, und
615
+ # dort als Arbeitsanweisung: Wer FW-KO-05 heute faehrt, prueft zwoelf von zwanzig
616
+ # Grenzfaellen und meldet ihn bestanden.
617
+ #
618
+ # WARUM NICHT DIE KOPFKOMMENTARE ALS ANKER (CR-2026-064 E2). Gemessen tragen sie drei
619
+ # Formen - "# Pruefung N:", "# N:" und "# Pruefungen N bis M" -, und eine vierte sieht
620
+ # aus wie ein Kopf und ist keiner: "# Pruefung 37 und dieselbe Ehrlichkeit ..." im Block
621
+ # von Pruefung 39. Der erste Entwurf dieser Pruefung ist genau daran gefallen und hat
622
+ # Pruefung 37 gefunden, wo kein Kopf stand.
623
+ #
624
+ # WARUM NUR TEST_CATALOG.md UND NICHT DAS GANZE REPOSITORIUM (D-86). docs/ROADMAP.md,
625
+ # CR-2026-052 und der Wirkungsnachweis zu 0.32.0 nennen ebenfalls zwoelf Grenzfaelle -
626
+ # und sind RICHTIG, weil sie den Stand von 0.32.0 beschreiben. Eine Nennung in der
627
+ # Vorgeschichte ist kein Register, und wer sie mitzieht, macht aus einer richtigen Zeile
628
+ # eine falsche.
629
+ #
630
+ # GRENZE. Sie zaehlt NENNUNGEN, nicht Pruefungen: Wer eine Pruefung baut und ihre Nummer
631
+ # nirgends schreibt, wird nicht gefangen - dieselbe Ehrlichkeit wie Gegenstand 2 von
632
+ # Pruefung 38, der Deklarationen zaehlt und nicht Richtigkeit. Und sie belegt die
633
+ # VOLLSTAENDIGKEIT des Registers, nicht die Richtigkeit seiner Eintraege: Ein Eintrag,
634
+ # der etwas anderes beschreibt als seine Pruefung tut, laeuft durch.
635
+ REGISTER_ANKER = "Prüft (statisch, ohne laufenden KI-Client):"
636
+ REGISTER_ENDE = "Der Wirksamkeitsnachweis nach D-23"
637
+
638
+
639
+ def _ueb_katalogdateien(root: str) -> list:
640
+ """Der Testkatalog und die dezentralen Testblaetter je Skill (Verfahren Nr. 6)."""
641
+ treffer = [os.path.join(KERN, "tests", "TEST_CATALOG.md")]
642
+ basis = os.path.join(root, KERN, "framework")
643
+ for dirpath, dirnames, filenames in os.walk(basis):
644
+ dirnames[:] = sorted(d for d in dirnames if d != "__pycache__")
645
+ if "TESTS.md" in filenames:
646
+ treffer.append(os.path.relpath(os.path.join(dirpath, "TESTS.md"), root))
647
+ return sorted(treffer)
648
+
649
+
650
+ def _verfolgte_dateien(root: str) -> list | None:
651
+ """Vom Versionsverwalter verfolgte Pfade unter <CORE_DIR>/ - oder None.
652
+
653
+ None heisst: nicht messbar. Kein git im Pfad, keine Versionierung, oder der Aufruf
654
+ ist gescheitert. Der Unterschied zu einer leeren Liste ist der ganze Punkt - eine
655
+ leere Liste ist ein Messergebnis, None ist keins.
656
+ """
657
+ try:
658
+ lauf = subprocess.run(["git", "-C", root, "ls-files", "-z", "--", KERN],
659
+ capture_output=True, text=True, encoding="utf-8",
660
+ errors="replace", timeout=30)
661
+ except (OSError, subprocess.SubprocessError):
662
+ return None
663
+ if lauf.returncode != 0:
664
+ return None
665
+ return _git_pfade(lauf.stdout)
666
+
667
+
668
+ def _git_pfade(ausgabe: str | None) -> list:
669
+ """Die Pfade einer `git ... -z`-Ausgabe (CR-2026-135, D-352).
670
+
671
+ OHNE `-z` IST DIE AUSGABE KEIN PFAD MEHR, SOBALD ER EIN NICHT-ASCII-ZEICHEN TRAEGT.
672
+ git quotet ihn dann (`core.quotePath`, Vorgabe an) - aus einem U-Umlaut wird
673
+ `"docs/\\303\\234bersicht.md"`, samt Anfuehrungszeichen. Die Pruefungen 75 und 81
674
+ fanden unter diesem Namen keine Datei und gingen LEISE weiter; 78 zaehlte ihn als
675
+ Datei, aber nicht als Markdown - das schliessende Anfuehrungszeichen steht hinter
676
+ der Endung. Gemessen: Ein Traeger mit U-Umlaut im Namen und gemischten
677
+ Zeilenenden war fuer Pruefung 81 unsichtbar (Sonde 81e). Dieselbe Ursache wie in
678
+ `install.py` - eine Pfadliste als Textzeilen statt NUL-getrennt.
679
+ """
680
+ return [z for z in (ausgabe or "").split("\0") if z]
681
+
682
+
683
+ def _tabellenspalte(kopf: str, ueberschrift: str) -> int:
684
+ """Index der Spalte mit dieser Ueberschrift - ueber die STELLUNG, nicht die Nummer.
685
+
686
+ Eine neue Spalte im Testkatalog verschiebt sonst jede Pruefung, die eine Nummer
687
+ verdrahtet hat. -1 heisst: diese Tabelle fuehrt die Spalte nicht.
688
+ """
689
+ zellen = [z.strip() for z in kopf.strip().strip("|").split("|")]
690
+ for i, z in enumerate(zellen):
691
+ if z == ueberschrift:
692
+ return i
693
+ return -1
694
+
695
+
696
+ # --- Pruefung 67: ENTFALLEN mit 1.4.1 (D-350) --------------------------------------
697
+ #
698
+ # Sie hielt die Titelzeile der Uebergabe gegen VERSION (D-216). Seit 1.4.1 ist die
699
+ # Uebergabe ein lokales Arbeitsdokument und nicht mehr versioniert; ihr Gegenstand
700
+ # fehlt in jeder frischen Auscheckung. Die Nummer bleibt im Register, damit es
701
+ # lueckenlos bleibt und keine andere Pruefung sie erbt.
702
+ #
703
+ # DAS KENNZEICHEN DES QUELLREPOSITORIUMS (D-351). Bis 1.4.0 unterschieden die
704
+ # Pruefungen 75, 78, 79 und 81 an UEBERGABE.md, ob sie im Framework-Repositorium oder
705
+ # in einem uebernehmenden Projekt laufen. Mit der Uebergabe ist dieser Anker aus dem
706
+ # Versionierten verschwunden - und die Pruefungen 75 und 81 lesen `git ls-files`:
707
+ # Sie haetten das Quellrepositorium LEISE fuer ein Projekt gehalten und nur noch das
708
+ # Ausgelieferte geprueft, auch auf dem Arbeitsplatz, der die Datei noch fuehrt.
709
+ # ➡️ Ein Anker, der nur an einem Arbeitsplatz liegt, ist keiner.
710
+ # Das Kennzeichen ist deshalb eine eigene, versionierte Datei NEBEN dem Kern: Das
711
+ # Heben kopiert nur den Kern, und install.py legt sie nicht an.
712
+ # Die Einstiegsdokumente des Quellrepositoriums in seiner Wurzel (D-437): die README,
713
+ # der Quickstart und ihre englischen Fassungen. Klasse A wie die README, und aus
714
+ # demselben Grund nur im Quellrepositorium - in einem Projekt gehoert die Wurzel dem
715
+ # Projekt (D-299). Pruefung 92 ist fuer die englischen Fassungen wirkungslos, aber
716
+ # harmlos: Ihre Stammliste ist deutsch und trifft englischen Text nicht.
717
+ DOK_WURZEL = ("README.md", "README.en.md", "QUICKSTART.md", "QUICKSTART.en.md")
718
+
719
+
720
+ QUELLREPO_KENNZEICHEN = ".koolie/QUELLREPOSITORIUM.md"
721
+
722
+
723
+ def ist_quellrepositorium(root: str) -> bool:
724
+ """Traegt dieser Baum das Kennzeichen des Framework-Repositoriums (D-351)?"""
725
+ return os.path.isfile(os.path.join(root, *QUELLREPO_KENNZEICHEN.split("/")))
726
+
727
+
728
+ # --- Pruefung 90: Der Lieferumfang einer Installation (D-367, CR-2026-141) ----------
729
+ #
730
+ # ANLASS. Seit 1.8.0 kann ein Projekt den Kern ohne die Nachweisschicht bekommen
731
+ # (install.py --target --lieferumfang nutzung). Die Nachweisschicht steht an EINER
732
+ # Stelle - clientmap.NACHWEIS_ABLAGEN -, und dieser Validator liest sie dort, statt sie
733
+ # ein zweites Mal aufzuzaehlen: zwei Listen, die einander decken sollen, sind die
734
+ # Bauform von 0.57.0.
735
+ #
736
+ # WAS SICH IN EINER REDUZIERTEN INSTALLATION AENDERT, und nur das (gemessen am
737
+ # 2026-09-25 an allen drei Packs): 70 Verweise ausgelieferter Traeger zeigen in
738
+ # tests/protocols/ - Herkunftsangaben, deren Aussage ohne die Datei steht -, und drei
739
+ # Pruefungen verlieren ihren Gegenstand: 76 (eine ihrer vier Stellen,
740
+ # tests/erhebungen/ablage.py), 77 (build/doc/00-kopf.md) und 80 (tests/protocols/).
741
+ # Alles das wird dort nicht gemeldet, sondern als HINWEIS genannt. Jede andere Zeile
742
+ # bleibt, wie sie in einer vollen Installation stuende - die Sonde L367 haelt beide
743
+ # Ausgaben zeilengleich gegeneinander.
744
+ #
745
+ # DREI GEGENSTAENDE:
746
+ # (a) LIEFERUMFANG traegt einen bekannten Wert.
747
+ # (b) "nutzung" stimmt mit dem Bestand: Keine Ablage der Nachweisschicht liegt da.
748
+ # Sonst behauptete die Datei weniger, als geliefert ist - und das naechste Heben
749
+ # loeschte es.
750
+ # (c) Das Quellrepositorium fuehrt KEINE solche Datei. Es ist keine Installation;
751
+ # eine Quelle, die "nutzung" behauptet, kann install.py keinen vollen Kern mehr
752
+ # liefern. Die Lockerung oben gilt dort ohnehin nie - was immer die Datei sagt.
753
+ # GRENZE. Ob die Nutzung ohne die Nachweisschicht auskommt, belegt nicht diese
754
+ # Pruefung, sondern der Vergleich einer reduzierten mit einer vollen Installation
755
+ # (Sonde L367). Ein Traeger, den ein Werkzeug zur Laufzeit aus der Nachweisschicht
756
+ # liest, fiele erst dort auf.
757
+ def _clientmap(root: str):
758
+ kern = os.path.join(root, KERN)
759
+ if not os.path.isdir(kern):
760
+ return None
761
+ if kern not in sys.path:
762
+ sys.path.insert(0, kern)
763
+ try:
764
+ import clientmap
765
+ except ImportError:
766
+ return None
767
+ return clientmap if hasattr(clientmap, "NACHWEIS_ABLAGEN") else None
768
+
769
+
770
+ def reduziert(root: str) -> bool:
771
+ """Liegt hier eine Installation mit Lieferumfang 'nutzung' (D-367)?"""
772
+ if ist_quellrepositorium(root):
773
+ return False
774
+ cm = _clientmap(root)
775
+ return cm is not None and cm.lieferumfang(os.path.join(root, KERN)) == "nutzung"
776
+
777
+
778
+ def nicht_geliefert(root: str, rel: str) -> bool:
779
+ """Ist rel (projektrelativ) ein Teil der Nachweisschicht, den diese reduzierte
780
+ Installation nicht mitliefert?"""
781
+ if not rel.startswith(KERN + "/") or not reduziert(root):
782
+ return False
783
+ return _clientmap(root).ist_nachweis(rel[len(KERN) + 1:])
784
+ P73_ZEILE_RE = re.compile(r"^\|\s*([RSBHAMX]\d+)\s*\|")