@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,155 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Der generische Laeufer: aufbauen, vorpruefen, fahren, auswerten, aufraeumen.
3
+
4
+ Ein Lauf faehrt genau dann, wenn (1) er noch nicht im Kontingentbuch steht, (2) der Baum
5
+ auf seinen Sollstand gebracht ist und (3) die Vorpruefung leer ist. Sonst bricht die
6
+ REIHE ab - nicht nur der Lauf: Ein Befund der Vorpruefung ist fast immer ein Befund am
7
+ Aufbau, und der naechste Lauf traege ihn mit.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import io
12
+ import json
13
+ import os
14
+ import time
15
+
16
+ from . import baum as baum_mod
17
+ from . import belege as belege_mod
18
+ from . import kontingent
19
+ from . import vorpruefung
20
+ from .clients import ADAPTER, adapter as adapter_fuer
21
+ from .reihe import laden as reihe_laden
22
+
23
+ BEKANNT = tuple(ADAPTER)
24
+
25
+
26
+ def _soll_ordner(reihe) -> str:
27
+ return os.path.join(reihe.belege, "soll")
28
+
29
+
30
+ def _soll_schreiben(reihe, schluessel: str, soll: dict) -> None:
31
+ os.makedirs(_soll_ordner(reihe), exist_ok=True)
32
+ io.open(os.path.join(_soll_ordner(reihe), schluessel + ".json"), "w",
33
+ encoding="utf-8").write(json.dumps(soll, indent=1))
34
+
35
+
36
+ def _soll_lesen(reihe, schluessel: str) -> dict:
37
+ pfad = os.path.join(_soll_ordner(reihe), schluessel + ".json")
38
+ if not os.path.isfile(pfad):
39
+ raise RuntimeError(f"kein Sollstand '{schluessel}' - erst 'aufbau'")
40
+ return json.loads(io.open(pfad, encoding="utf-8").read())
41
+
42
+
43
+ def aufbau(reihe) -> list:
44
+ """Sollstaende festhalten und Vertrauen setzen. Baut keine Basis - die sagt die Reihe."""
45
+ belege_mod.ablage_pruefen(reihe.belege)
46
+ a = adapter_fuer(reihe.client)
47
+ ohne = reihe.baum.get("ohne") or []
48
+ baeume = []
49
+ if reihe.baum["modus"] == "vorhanden":
50
+ for lauf in reihe.laeufe:
51
+ if not os.path.isdir(lauf.baum_vorhanden):
52
+ raise RuntimeError(f"{lauf.kennung}: Baum {lauf.baum_vorhanden} fehlt")
53
+ _soll_schreiben(reihe, lauf.kennung, baum_mod.sollstand(lauf.baum_vorhanden, ohne))
54
+ baeume.append(lauf.baum_vorhanden)
55
+ else:
56
+ basis = reihe.baum["basis"]
57
+ _soll_schreiben(reihe, "basis", baum_mod.sollstand(basis, ohne))
58
+ baeume = sorted({reihe.baumpfad(x) for x in reihe.laeufe})
59
+ if reihe.vorpruefung.get("vertrauen"):
60
+ a.vertrauen(baeume, True)
61
+ return baeume
62
+
63
+
64
+ def _herrichten(reihe, lauf) -> tuple:
65
+ """(Baumpfad, Sollstand fuer die Vorpruefung) - der Baum steht danach auf dem Soll."""
66
+ ohne = reihe.baum.get("ohne") or []
67
+ if reihe.baum["modus"] == "vorhanden":
68
+ soll = _soll_lesen(reihe, lauf.kennung)
69
+ return lauf.baum_vorhanden, soll
70
+ soll = _soll_lesen(reihe, "basis")
71
+ pfad = reihe.baumpfad(lauf)
72
+ baum_mod.herrichten(reihe.baum["basis"], pfad, lauf.ziel_branch(reihe), soll,
73
+ reihe.baum.get("remote"), ohne, reihe.baum.get("verbindungen"),
74
+ reihe.baum.get("remote_hooks") or "")
75
+ return pfad, soll
76
+
77
+
78
+ def vorpruefen(reihe, kennungen=None) -> dict:
79
+ """Die Vorpruefung fuer jeden Lauf, ohne zu fahren - eine Probe des ganzen Aufbaus."""
80
+ a = adapter_fuer(reihe.client)
81
+ aus = {}
82
+ for lauf in reihe.laeufe:
83
+ if kennungen and lauf.kennung not in kennungen:
84
+ continue
85
+ if kontingent.gefahren(reihe.belege, lauf.kennung):
86
+ aus[lauf.kennung] = ["(schon gefahren)"]
87
+ continue
88
+ pfad, soll = _herrichten(reihe, lauf)
89
+ aus[lauf.kennung] = vorpruefung.pruefen(reihe, lauf, a, soll, pfad)
90
+ return aus
91
+
92
+
93
+ def fahren(reihe, kennungen=None, ausgabe=print) -> int:
94
+ a = adapter_fuer(reihe.client)
95
+ version = a.version()
96
+ gefahren = 0
97
+ for lauf in reihe.laeufe:
98
+ if kennungen and lauf.kennung not in kennungen:
99
+ continue
100
+ if kontingent.gefahren(reihe.belege, lauf.kennung):
101
+ ausgabe(f"{lauf.kennung}: schon gefahren")
102
+ continue
103
+ pfad, soll = _herrichten(reihe, lauf)
104
+ befunde = vorpruefung.pruefen(reihe, lauf, a, soll, pfad)
105
+ if befunde:
106
+ raise SystemExit(f"ABBRUCH vor {lauf.kennung} - Vorpruefung:\n - " + "\n - ".join(befunde))
107
+ hash_vorher = baum_mod.baumhash(pfad, reihe.baum.get("ohne") or [])
108
+ meta = {"reihe": reihe.name, "client": reihe.client, "clientversion": version,
109
+ "gruppe": lauf.gruppe, "variante": lauf.variante, "baum": pfad,
110
+ "branch": lauf.ziel_branch(reihe), "hash_vorher": hash_vorher,
111
+ "berechtigung": reihe.berechtigung, "einstellungen": reihe.einstellungen or None,
112
+ "zusatz": reihe.zusatz or None,
113
+ "unterverzeichnis": lauf.unterverzeichnis or None,
114
+ "zeit": time.strftime("%Y-%m-%dT%H:%M:%S")}
115
+ start = os.path.join(pfad, *lauf.unterverzeichnis.split("/")) if lauf.unterverzeichnis else pfad
116
+ if not os.path.isdir(start):
117
+ raise SystemExit(f"ABBRUCH vor {lauf.kennung}: Startverzeichnis {start} fehlt im Baum")
118
+ turns = [lauf.prompt] + lauf.folgeturns
119
+ sitzung = None
120
+ summe = {"usd": 0.0, "cache_neu": 0, "cache_gelesen": 0, "abweisungen": 0, "turns": 0}
121
+ for i, prompt in enumerate(turns):
122
+ erg = a.lauf(prompt, start, lauf.modell, reihe.berechtigung, sitzung,
123
+ einstellungen=reihe.einstellungen or None, zusatz=reihe.zusatz or None)
124
+ belege_mod.sichern(reihe.belege, lauf.kennung, i, erg, dict(meta, turn=i + 1), a)
125
+ summe["usd"] += erg["usd"]
126
+ for k in ("cache_neu", "cache_gelesen", "abweisungen", "turns"):
127
+ summe[k] += int(erg.get(k) or 0)
128
+ sitzung = erg.get("sitzung") or sitzung
129
+ if erg.get("is_error"):
130
+ ausgabe(f"{lauf.kennung}: Turn {i + 1} meldet is_error - Folgeturns entfallen")
131
+ break
132
+ kontingent.eintragen(reihe.belege, lauf.kennung,
133
+ dict(meta, modell=erg.get("modell"), kosten=erg.get("kosten", "gemessen"),
134
+ **{k: round(v, 4) if k == "usd" else v for k, v in summe.items()}))
135
+ gefahren += 1
136
+ ausgabe("%-24s %.3f USD Abweisungen=%s Cache neu/gelesen=%s/%s erwartet: %s" % (
137
+ lauf.kennung, summe["usd"], summe["abweisungen"], summe["cache_neu"],
138
+ summe["cache_gelesen"], lauf.erwartung))
139
+ n, usd = kontingent.summe(reihe.belege)
140
+ ausgabe(f"Summe: {n} Laeufe, {usd:.2f} USD")
141
+ return gefahren
142
+
143
+
144
+ def aufraeumen(reihe) -> None:
145
+ """Vertrauen entfernen; die Baeume bleiben stehen (Loeschen sagt der Mensch, D-262)."""
146
+ a = adapter_fuer(reihe.client)
147
+ if reihe.baum["modus"] == "vorhanden":
148
+ baeume = [x.baum_vorhanden for x in reihe.laeufe]
149
+ else:
150
+ baeume = sorted({reihe.baumpfad(x) for x in reihe.laeufe})
151
+ a.vertrauen(baeume, False)
152
+
153
+
154
+ def laden(pfad: str):
155
+ return reihe_laden(pfad, BEKANNT)
@@ -0,0 +1,202 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Eine Reihe als Daten - und ihre Pruefung, bevor irgendetwas gebaut oder gefahren wird.
3
+
4
+ Die Reihe liegt als JSON in der Erhebungsablage, nicht im Repositorium: Prompts und
5
+ Erwartungen sind Aufzeichnung (D-222). Eine Reihe mit einem Fehler im Schema bricht beim
6
+ Laden ab - sie haette sonst die ersten Laeufe bezahlt und am fuenften gemerkt, dass eine
7
+ Kennung doppelt ist.
8
+
9
+ Form (Pflicht ist, was ohne Standard steht):
10
+
11
+ {
12
+ "name": "1190-gleich",
13
+ "client": "claude-code",
14
+ "wurzel": "Verzeichnis der Messbaeume",
15
+ "kontingent": {"laeufe": 12, "usd": 8.0, "reserve_usd": 0.8},
16
+ "baum": {"modus": "fest" | "je_lauf" | "vorhanden",
17
+ "basis": "Pfad eines hergerichteten git-Baums (fest, je_lauf)",
18
+ "branch": "main", "remote": false, "ohne": ["node_modules"],
19
+ "verbindungen": {"frontend/node_modules": "geteilter Bestand"},
20
+ "remote_hooks": "Verzeichnis mit Hooks fuer das Wegwerf-Remote"},
21
+ "berechtigung": "bypassPermissions",
22
+ "einstellungen": "Einstellungsdatei AUSSERHALB der Baeume (claude-code: --settings)",
23
+ "zusatz": ["--mcp-config", "...", "--permission-prompt-tool", "..."],
24
+ "vorpruefung": {"hook": true, "vertrauen": true, "startmeldung": []},
25
+ "laeufe": [{"kennung": "...", "prompt": "..." | "prompt_datei": "...",
26
+ "folgeturns": ["..."], "erwartung": "...",
27
+ "gruppe": "koolie" | "referenz", "modell": null,
28
+ "branch": null, "variante": null, "baum": "nur bei modus vorhanden",
29
+ "unterverzeichnis": "Startverzeichnis relativ zum Baum, sonst die Wurzel"}]
30
+ }
31
+
32
+ SEIT 1.21.0 (CR-2026-167) traegt die Reihe die Referenzgruppe der Vergleichsmessung (K-193):
33
+ Einstellungen, die der Agent nicht aendern kann, liegen ausserhalb jedes Baums; Branch-Schutz
34
+ und CI stehen als Hooks im Wegwerf-Remote; ein Lauf kann in einem Unterverzeichnis starten.
35
+ 'zusatz' reicht Argumente an den Client durch - etwa den Freigabe-Stellvertreter (freigabe.py),
36
+ der im Druckmodus jede Rueckfrage beantwortet und protokolliert.
37
+ """
38
+ from __future__ import annotations
39
+
40
+ import io
41
+ import json
42
+ import os
43
+ import re
44
+
45
+ MODI = ("fest", "je_lauf", "vorhanden")
46
+ GRUPPEN = ("koolie", "referenz")
47
+ KENNUNG_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,40}$")
48
+
49
+
50
+ class Reihenfehler(Exception):
51
+ """Die Reihe ist nicht fahrbar - gemeldet vor dem ersten Lauf."""
52
+
53
+
54
+ class Lauf:
55
+ def __init__(self, d: dict, reihe: "Reihe") -> None:
56
+ self.kennung = d.get("kennung", "")
57
+ self.erwartung = d.get("erwartung", "")
58
+ self.gruppe = d.get("gruppe", "koolie")
59
+ self.modell = d.get("modell") or reihe.modell
60
+ self.branch = d.get("branch")
61
+ self.variante = d.get("variante")
62
+ self.unterverzeichnis = (d.get("unterverzeichnis") or "").replace("\\", "/").strip("/")
63
+ self.baum_vorhanden = d.get("baum")
64
+ self.folgeturns = list(d.get("folgeturns") or [])
65
+ if "prompt_datei" in d:
66
+ pfad = d["prompt_datei"]
67
+ if not os.path.isabs(pfad):
68
+ pfad = os.path.join(reihe.ablage, pfad)
69
+ self.prompt = io.open(pfad, encoding="utf-8").read() if os.path.isfile(pfad) else ""
70
+ self.prompt_quelle = pfad
71
+ else:
72
+ self.prompt = d.get("prompt", "")
73
+ self.prompt_quelle = "reihe"
74
+
75
+ def ziel_branch(self, reihe: "Reihe") -> str:
76
+ return self.branch or reihe.baum.get("branch", "main")
77
+
78
+
79
+ class Reihe:
80
+ def __init__(self, d: dict, ablage: str) -> None:
81
+ self.roh = d
82
+ self.ablage = ablage
83
+ self.name = d.get("name", "")
84
+ self.client = d.get("client", "")
85
+ self.wurzel = d.get("wurzel", "")
86
+ self.modell = d.get("modell")
87
+ k = d.get("kontingent") or {}
88
+ self.max_laeufe = int(k.get("laeufe", 0))
89
+ self.max_usd = float(k.get("usd", 0))
90
+ self.reserve_usd = float(k.get("reserve_usd", 0.8))
91
+ self.baum = dict(d.get("baum") or {})
92
+ self.baum.setdefault("branch", "main")
93
+ self.baum.setdefault("remote", False)
94
+ self.baum.setdefault("ohne", ["node_modules"])
95
+ self.baum.setdefault("verbindungen", {})
96
+ self.baum.setdefault("remote_hooks", "")
97
+ self.berechtigung = d.get("berechtigung", "default")
98
+ self.einstellungen = d.get("einstellungen") or ""
99
+ self.zusatz = [str(x) for x in d.get("zusatz") or []]
100
+ if self.einstellungen and not os.path.isabs(self.einstellungen):
101
+ self.einstellungen = os.path.join(ablage, self.einstellungen)
102
+ v = dict(d.get("vorpruefung") or {})
103
+ v.setdefault("hook", True)
104
+ v.setdefault("vertrauen", True)
105
+ v.setdefault("startmeldung", [])
106
+ self.vorpruefung = v
107
+ self.laeufe = [Lauf(x, self) for x in d.get("laeufe") or []]
108
+
109
+ @property
110
+ def belege(self) -> str:
111
+ return os.path.join(self.ablage, "belege", self.name)
112
+
113
+ def lauf(self, kennung: str) -> Lauf:
114
+ for x in self.laeufe:
115
+ if x.kennung == kennung:
116
+ return x
117
+ raise Reihenfehler(f"keine Kennung '{kennung}' in der Reihe '{self.name}'")
118
+
119
+ def baumpfad(self, lauf: Lauf) -> str:
120
+ """Fester Pfad je Reihe (ein Prompt-Anfang, ein Cache) oder ein Baum je Lauf."""
121
+ modus = self.baum.get("modus")
122
+ if modus == "vorhanden":
123
+ return lauf.baum_vorhanden
124
+ if modus == "fest":
125
+ return os.path.join(self.wurzel, self.name)
126
+ return os.path.join(self.wurzel, self.name + "-" + lauf.kennung)
127
+
128
+
129
+ def _unter(pfad: str, wurzel: str) -> bool:
130
+ p = os.path.normcase(os.path.abspath(pfad))
131
+ w = os.path.normcase(os.path.abspath(wurzel)).rstrip("\\/") + os.sep
132
+ return p.startswith(w)
133
+
134
+
135
+ def pruefen(r: Reihe, clients_bekannt) -> list:
136
+ """Alle Schemafehler auf einmal - nicht den ersten."""
137
+ f = []
138
+ if not KENNUNG_RE.match(r.name or ""):
139
+ f.append(f"name '{r.name}': Kleinbuchstaben, Ziffern, Bindestrich")
140
+ if r.client not in clients_bekannt:
141
+ f.append(f"client '{r.client}' hat keinen Adapter (bekannt: {', '.join(sorted(clients_bekannt))})")
142
+ if r.max_laeufe <= 0 or r.max_usd <= 0:
143
+ f.append("kontingent: laeufe und usd muessen gesagt sein - ein Apparat ohne Deckel zaehlt nur")
144
+ modus = r.baum.get("modus")
145
+ if modus not in MODI:
146
+ f.append(f"baum.modus '{modus}' - erlaubt: {', '.join(MODI)}")
147
+ if modus in ("fest", "je_lauf"):
148
+ if not r.wurzel:
149
+ f.append("wurzel fehlt")
150
+ if not r.baum.get("basis"):
151
+ f.append("baum.basis fehlt")
152
+ if r.einstellungen:
153
+ if not os.path.isfile(r.einstellungen):
154
+ f.append(f"einstellungen '{r.einstellungen}' fehlt")
155
+ elif r.wurzel and _unter(r.einstellungen, r.wurzel):
156
+ f.append("einstellungen liegen unter der wurzel - im Messbaum erreichbar, keine "
157
+ "Referenz (1.21.0)")
158
+ for rel, quelle in (r.baum.get("verbindungen") or {}).items():
159
+ teile = rel.replace("\\", "/").split("/")
160
+ if os.path.isabs(rel) or ".." in teile:
161
+ f.append(f"verbindungen: '{rel}' muss relativ im Baum liegen")
162
+ if not os.path.isdir(quelle):
163
+ f.append(f"verbindungen: Quelle '{quelle}' fehlt")
164
+ if r.baum.get("remote_hooks"):
165
+ if not r.baum.get("remote"):
166
+ f.append("remote_hooks ohne remote")
167
+ elif not os.path.isdir(r.baum["remote_hooks"]):
168
+ f.append(f"remote_hooks '{r.baum['remote_hooks']}' fehlt")
169
+ gesehen = set()
170
+ for x in r.laeufe:
171
+ if not KENNUNG_RE.match(x.kennung or ""):
172
+ f.append(f"Kennung '{x.kennung}': Kleinbuchstaben, Ziffern, Bindestrich")
173
+ if x.kennung in gesehen:
174
+ f.append(f"Kennung '{x.kennung}' doppelt")
175
+ gesehen.add(x.kennung)
176
+ if not x.prompt.strip():
177
+ f.append(f"{x.kennung}: Prompt leer ({x.prompt_quelle})")
178
+ if any(not t.strip() for t in x.folgeturns):
179
+ f.append(f"{x.kennung}: ein Folgeturn ist leer - Abbruch statt Rueckfall (1.14.2)")
180
+ if not x.erwartung.strip():
181
+ f.append(f"{x.kennung}: keine Erwartung - ein Lauf ohne Erwartung misst nichts")
182
+ if x.gruppe not in GRUPPEN:
183
+ f.append(f"{x.kennung}: gruppe '{x.gruppe}' - erlaubt: {', '.join(GRUPPEN)}")
184
+ if x.unterverzeichnis and (os.path.isabs(x.unterverzeichnis) or ":" in x.unterverzeichnis
185
+ or ".." in x.unterverzeichnis.split("/")):
186
+ f.append(f"{x.kennung}: unterverzeichnis '{x.unterverzeichnis}' muss im Baum liegen")
187
+ if modus == "vorhanden" and not x.baum_vorhanden:
188
+ f.append(f"{x.kennung}: bei modus 'vorhanden' braucht jeder Lauf 'baum'")
189
+ if modus == "fest" and x.branch and not x.branch.startswith("arbeit/"):
190
+ f.append(f"{x.kennung}: ein eigener Branch heisst 'arbeit/...' (K-172)")
191
+ if not r.laeufe:
192
+ f.append("keine Laeufe")
193
+ return f
194
+
195
+
196
+ def laden(pfad: str, clients_bekannt) -> Reihe:
197
+ d = json.loads(io.open(pfad, encoding="utf-8").read())
198
+ r = Reihe(d, os.path.dirname(os.path.abspath(pfad)))
199
+ fehler = pruefen(r, clients_bekannt)
200
+ if fehler:
201
+ raise Reihenfehler("Reihe nicht fahrbar:\n - " + "\n - ".join(fehler))
202
+ return r
@@ -0,0 +1,280 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Der Apparat gegen einen Attrappen-Client - ohne Modell, ohne Kontingent (K-174, Frage b).
3
+
4
+ Bis 1.18.2 hatte kein Messskript einen Test (D-436). Jeder Fall hier hat einen Anlass,
5
+ der schon einmal Geld oder einen Befund gekostet hat; der Fall misst, dass der Apparat
6
+ ihn heute abfaengt. Ein Fall, der nicht faellt, wenn sein Gegenstand fehlt, waere keiner:
7
+ Die Gegenfaelle (T4, T5, T6) praeparieren genau den Fehler und verlangen die Meldung.
8
+
9
+ Aufruf: python messen.py selbsttest (Exit 0 = alle Faelle tragen)
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import io
14
+ import json
15
+ import os
16
+ import subprocess
17
+ import tempfile
18
+
19
+ from . import baum as baum_mod
20
+ from . import belege as belege_mod
21
+ from . import kontingent, laeufer, stand, vorpruefung
22
+ from .clients import AdapterUnerhoben, Unerhoben, adapter
23
+ from .reihe import Reihe, Reihenfehler, pruefen as reihe_pruefen
24
+
25
+ FAELLE = []
26
+
27
+
28
+ def fall(nummer, was):
29
+ def deko(f):
30
+ FAELLE.append((nummer, was, f))
31
+ return f
32
+ return deko
33
+
34
+
35
+ def _basis(wurzel: str) -> str:
36
+ b = os.path.join(wurzel, "basis")
37
+ os.makedirs(b)
38
+ baum_mod.git(b, "init", "-q", "-b", "main")
39
+ baum_mod.git(b, "config", "core.autocrlf", "false")
40
+ io.open(os.path.join(b, "README.md"), "w", encoding="utf-8", newline="\n").write("Basis\n")
41
+ io.open(os.path.join(b, ".gitignore"), "w", encoding="utf-8", newline="\n").write(".env\n")
42
+ io.open(os.path.join(b, ".env"), "w", encoding="utf-8", newline="\n").write("SONDE=synthetisch\n")
43
+ baum_mod.git(b, "add", "-A")
44
+ baum_mod.git(b, *baum_mod.AUTOR, "commit", "-q", "-m", "Basis")
45
+ return b
46
+
47
+
48
+ def _reihe(wurzel: str, basis: str, laeufe: list, usd=5.0, laeufe_max=10, reserve=0.0) -> Reihe:
49
+ ablage = os.path.join(wurzel, "ablage")
50
+ os.makedirs(ablage, exist_ok=True)
51
+ d = {"name": "selbsttest", "client": "attrappe", "wurzel": os.path.join(wurzel, "baeume"),
52
+ "kontingent": {"laeufe": laeufe_max, "usd": usd, "reserve_usd": reserve},
53
+ "baum": {"modus": "fest", "basis": basis}, "laeufe": laeufe}
54
+ r = Reihe(d, ablage)
55
+ fehler = reihe_pruefen(r, ("attrappe",))
56
+ assert not fehler, fehler
57
+ return r
58
+
59
+
60
+ def _antworten(wurzel: str, antworten: dict) -> None:
61
+ pfad = os.path.join(wurzel, "attrappe.json")
62
+ io.open(pfad, "w", encoding="utf-8").write(json.dumps(antworten))
63
+ os.environ["LW_ATTRAPPE"] = pfad
64
+
65
+
66
+ def _still(*_a, **_k):
67
+ pass
68
+
69
+
70
+ @fall("T1", "eine kaputte Reihe meldet ALLE Schemafehler vor dem ersten Lauf")
71
+ def t1(w):
72
+ r = Reihe({"name": "x", "client": "attrappe", "kontingent": {},
73
+ "baum": {"modus": "fest", "basis": "b"}, "wurzel": "w",
74
+ "laeufe": [{"kennung": "a", "prompt": "p", "erwartung": "e", "folgeturns": [" "]},
75
+ {"kennung": "a", "prompt": "p", "erwartung": "e"}]}, w)
76
+ f = " | ".join(reihe_pruefen(r, ("attrappe",)))
77
+ for teil in ("kontingent", "doppelt", "Folgeturn ist leer"):
78
+ assert teil in f, f"'{teil}' nicht gemeldet: {f}"
79
+
80
+
81
+ @fall("T2", "fester Baum: ein Lauf schreibt, aendert eine ignorierte Datei und legt eine an - "
82
+ "der naechste startet trotzdem auf dem Sollstand")
83
+ def t2(w):
84
+ b = _basis(w)
85
+ _antworten(w, {"schreib": {"schreibe": {"neu.txt": "x", ".env": "VERAENDERT", "README.md": "y",
86
+ "tief/ordner/z.txt": "z"}},
87
+ "lies": {"antwort": "gelesen"}})
88
+ r = _reihe(w, b, [{"kennung": "a1", "prompt": "schreib", "erwartung": "e"},
89
+ {"kennung": "a2", "prompt": "lies", "erwartung": "e"},
90
+ {"kennung": "a3", "prompt": "lies", "erwartung": "e"}])
91
+ laeufer.aufbau(r)
92
+ assert laeufer.fahren(r, ausgabe=_still) == 3
93
+ n, usd = kontingent.summe(r.belege)
94
+ assert (n, round(usd, 2)) == (3, 0.3), (n, usd)
95
+ pfad = r.baumpfad(r.laeufe[0])
96
+ assert io.open(os.path.join(pfad, ".env"), encoding="utf-8").read() == "SONDE=synthetisch\n"
97
+ assert not os.path.exists(os.path.join(pfad, "tief"))
98
+
99
+
100
+ @fall("T3", "Arbeitsbranch (K-172): der Baum steht auf arbeit/..., der naechste Lauf wieder auf main")
101
+ def t3(w):
102
+ b = _basis(w)
103
+ _antworten(w, {"": {}})
104
+ r = _reihe(w, b, [{"kennung": "b1", "prompt": "p", "erwartung": "e", "branch": "arbeit/b1"},
105
+ {"kennung": "b2", "prompt": "p", "erwartung": "e"}])
106
+ laeufer.aufbau(r)
107
+ laeufer.fahren(r, ["b1"], ausgabe=_still)
108
+ pfad = r.baumpfad(r.laeufe[0])
109
+ assert baum_mod.git(pfad, "symbolic-ref", "--short", "HEAD") == "arbeit/b1"
110
+ laeufer.fahren(r, ["b2"], ausgabe=_still)
111
+ assert baum_mod.git(pfad, "symbolic-ref", "--short", "HEAD") == "main"
112
+
113
+
114
+ @fall("T4", "Gegenfall HEAD: steht der Baum auf dem falschen Branch, meldet die Vorpruefung es (D-218)")
115
+ def t4(w):
116
+ b = _basis(w)
117
+ _antworten(w, {"": {}})
118
+ r = _reihe(w, b, [{"kennung": "c1", "prompt": "p", "erwartung": "e", "branch": "arbeit/c1"}])
119
+ laeufer.aufbau(r)
120
+ pfad, soll = laeufer._herrichten(r, r.laeufe[0])
121
+ baum_mod.git(pfad, "checkout", "-q", "main")
122
+ befunde = vorpruefung.pruefen(r, r.laeufe[0], adapter("attrappe"), soll, pfad)
123
+ assert any(x.startswith("head: Branch") for x in befunde), befunde
124
+
125
+
126
+ @fall("T5", "Gegenfall Zustand: ein Rest im Baum aendert den Baum-Hash, und die Vorpruefung meldet ihn")
127
+ def t5(w):
128
+ b = _basis(w)
129
+ _antworten(w, {"": {}})
130
+ r = _reihe(w, b, [{"kennung": "d1", "prompt": "p", "erwartung": "e"}])
131
+ laeufer.aufbau(r)
132
+ pfad, soll = laeufer._herrichten(r, r.laeufe[0])
133
+ assert not vorpruefung.pruefen(r, r.laeufe[0], adapter("attrappe"), soll, pfad)
134
+ io.open(os.path.join(pfad, "rest.txt"), "w").write("vom vorigen Lauf")
135
+ befunde = vorpruefung.pruefen(r, r.laeufe[0], adapter("attrappe"), soll, pfad)
136
+ assert any(x.startswith("zustand:") for x in befunde), befunde
137
+
138
+
139
+ @fall("T6", "Gegenfall Deckel: der Lauf, der das Kontingent reissen koennte, faehrt nicht")
140
+ def t6(w):
141
+ b = _basis(w)
142
+ _antworten(w, {"": {"usd": 0.1}})
143
+ r = _reihe(w, b, [{"kennung": "e%d" % i, "prompt": "p", "erwartung": "e"} for i in range(4)],
144
+ usd=0.25, reserve=0.1) # Reserve = was ein Lauf hoechstens kostet
145
+ laeufer.aufbau(r)
146
+ try:
147
+ laeufer.fahren(r, ausgabe=_still)
148
+ raise AssertionError("kein Abbruch")
149
+ except SystemExit as e:
150
+ assert "Kontingent" in str(e), e
151
+ assert kontingent.summe(r.belege)[0] == 2
152
+
153
+
154
+ @fall("T7", "ein Lauf wird nicht doppelt gebucht, und eine gefahrene Kennung faehrt nicht noch einmal")
155
+ def t7(w):
156
+ b = _basis(w)
157
+ _antworten(w, {"": {}})
158
+ r = _reihe(w, b, [{"kennung": "f1", "prompt": "p", "erwartung": "e"}])
159
+ laeufer.aufbau(r)
160
+ laeufer.fahren(r, ausgabe=_still)
161
+ assert laeufer.fahren(r, ausgabe=_still) == 0
162
+ try:
163
+ kontingent.eintragen(r.belege, "f1", {"usd": 1})
164
+ raise AssertionError("doppelt gebucht")
165
+ except RuntimeError:
166
+ pass
167
+
168
+
169
+ @fall("T8", "Belege im Repositorium sind ein Abbruch (D-222)")
170
+ def t8(w):
171
+ try:
172
+ belege_mod.ablage_pruefen(os.path.join(belege_mod.KERN, "tests", "erhebungen", "belege"))
173
+ raise AssertionError("kein Abbruch")
174
+ except RuntimeError:
175
+ pass
176
+
177
+
178
+ @fall("T9", "die Standmarke ist gegen Zeilenenden fest und meldet einen fehlenden Gegenstand")
179
+ def t9(w):
180
+ kern = os.path.join(w, "kern")
181
+ os.makedirs(kern)
182
+ io.open(os.path.join(kern, "a.md"), "wb").write(b"eins\r\nzwei\r\n")
183
+ m1 = stand.marke(["a.md"], kern)
184
+ io.open(os.path.join(kern, "a.md"), "wb").write(b"eins\nzwei\n")
185
+ assert stand.marke(["a.md"], kern) == m1
186
+ io.open(os.path.join(kern, "a.md"), "wb").write(b"eins\ndrei\n")
187
+ assert stand.marke(["a.md"], kern) != m1
188
+ try:
189
+ stand.marke(["fehlt.md"], kern)
190
+ raise AssertionError("kein Abbruch")
191
+ except RuntimeError:
192
+ pass
193
+
194
+
195
+ @fall("T10", "ein unerhobener Client sagt es - als Befund der Vorpruefung, nie als Erfolg (D-276)")
196
+ def t10(w):
197
+ b = _basis(w)
198
+ r = _reihe(w, b, [{"kennung": "g1", "prompt": "p", "erwartung": "e"}])
199
+ laeufer.aufbau(r)
200
+ pfad, soll = laeufer._herrichten(r, r.laeufe[0])
201
+ befunde = vorpruefung.pruefen(r, r.laeufe[0], AdapterUnerhoben("kiro"), soll, pfad)
202
+ assert any("hook: nicht pruefbar" in x for x in befunde), befunde
203
+ assert any("vertrauen: nicht pruefbar" in x for x in befunde), befunde
204
+ try:
205
+ AdapterUnerhoben("kiro").lauf("p", pfad, None, "default")
206
+ raise AssertionError("gefahren")
207
+ except Unerhoben:
208
+ pass
209
+
210
+
211
+ @fall("T11", "Referenzgruppe (1.21.0): Einstellungen im Messbaum, ein Startverzeichnis ausserhalb "
212
+ "und Remote-Hooks ohne Remote sind Schemafehler")
213
+ def t11(w):
214
+ b = _basis(w)
215
+ innen = os.path.join(w, "baeume", "settings.json")
216
+ os.makedirs(os.path.dirname(innen))
217
+ io.open(innen, "w", encoding="utf-8").write("{}")
218
+ r = Reihe({"name": "x", "client": "attrappe", "wurzel": os.path.join(w, "baeume"),
219
+ "kontingent": {"laeufe": 1, "usd": 1}, "einstellungen": innen,
220
+ "baum": {"modus": "fest", "basis": b, "remote_hooks": w},
221
+ "laeufe": [{"kennung": "a", "prompt": "p", "erwartung": "e",
222
+ "unterverzeichnis": "../nachbar"}]}, w)
223
+ f = " | ".join(reihe_pruefen(r, ("attrappe",)))
224
+ for teil in ("unter der wurzel", "muss im Baum liegen", "remote_hooks ohne remote"):
225
+ assert teil in f, f"'{teil}' nicht gemeldet: {f}"
226
+
227
+
228
+ @fall("T12", "Referenzgruppe (1.21.0): der Lauf startet im Unterverzeichnis mit der Einstellungsdatei, "
229
+ "die Verbindung uebersteht das Zuruecksetzen und zaehlt nicht im Baum-Hash")
230
+ def t12(w):
231
+ b = _basis(w)
232
+ os.makedirs(os.path.join(b, "frontend"))
233
+ io.open(os.path.join(b, "frontend", "a.ts"), "w", encoding="utf-8", newline="\n").write("x\n")
234
+ baum_mod.git(b, "add", "-A")
235
+ baum_mod.git(b, *baum_mod.AUTOR, "commit", "-q", "-m", "frontend")
236
+ quelle = os.path.join(w, "geteilt")
237
+ os.makedirs(quelle)
238
+ io.open(os.path.join(quelle, "paket.js"), "w").write("geteilt")
239
+ aussen = os.path.join(w, "referenz-settings.json")
240
+ io.open(aussen, "w", encoding="utf-8").write("{}")
241
+ _antworten(w, {"": {}})
242
+ r = Reihe({"name": "selbsttest", "client": "attrappe", "wurzel": os.path.join(w, "baeume"),
243
+ "kontingent": {"laeufe": 5, "usd": 5}, "einstellungen": aussen,
244
+ "baum": {"modus": "fest", "basis": b,
245
+ "verbindungen": {"frontend/node_modules": quelle}},
246
+ "laeufe": [{"kennung": "h1", "prompt": "p", "erwartung": "e",
247
+ "unterverzeichnis": "frontend", "gruppe": "referenz"},
248
+ {"kennung": "h2", "prompt": "p", "erwartung": "e"}]},
249
+ os.path.join(w, "ablage"))
250
+ assert not reihe_pruefen(r, ("attrappe",)), reihe_pruefen(r, ("attrappe",))
251
+ laeufer.aufbau(r)
252
+ assert laeufer.fahren(r, ausgabe=_still) == 2
253
+ pfad = r.baumpfad(r.laeufe[0])
254
+ assert io.open(os.path.join(pfad, "frontend", "node_modules", "paket.js")).read() == "geteilt"
255
+ assert baum_mod.baumhash(pfad) == baum_mod.baumhash(b)
256
+ e = json.loads(io.open(os.path.join(r.belege, "h1-ergebnis.json"), encoding="utf-8").read())
257
+ assert os.path.normcase(e["start"]) == os.path.normcase(os.path.join(pfad, "frontend")), e
258
+ assert e["einstellungen"] == aussen, e
259
+
260
+
261
+ def main() -> int:
262
+ schlecht = 0
263
+ for nummer, was, f in FAELLE:
264
+ with tempfile.TemporaryDirectory(prefix="lw-selbsttest-") as w:
265
+ try:
266
+ f(w)
267
+ print(f"trägt {nummer} {was}")
268
+ except Exception as e: # jeder Fehler ist ein Befund dieses Falls
269
+ schlecht += 1
270
+ print(f"FÄLLT {nummer} {was}\n {type(e).__name__}: {e}")
271
+ finally:
272
+ subprocess.run(["git", "gc", "--quiet"], cwd=w, capture_output=True)
273
+ for wurzel, _, files in os.walk(w):
274
+ for fn in files:
275
+ try:
276
+ os.chmod(os.path.join(wurzel, fn), 0o666)
277
+ except OSError:
278
+ pass
279
+ print(f"\n{len(FAELLE) - schlecht} von {len(FAELLE)} Fällen tragen")
280
+ return 1 if schlecht else 0
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Die Standmarke einer Ergebniszelle (Pruefung 103, D-472, K-61).
3
+
4
+ Die Rechnung steht an EINER Stelle - in validate-framework.py, stand_wert() -, und dieses
5
+ Modul laedt sie von dort. Eine zweite Rechnung hier waere die Bauform, die der Validator
6
+ bei zaehlen46.py schon einmal aufgeloest hat (D-259): zwei Stellen, die auseinanderlaufen,
7
+ ohne dass es eine merkt. Die Sonde 103 rechnet bewusst selbst - sie ist die Gegenstelle.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import importlib.util
12
+ import os
13
+
14
+ from .belege import KERN
15
+
16
+
17
+ def _validator():
18
+ pfad = os.path.join(KERN, "tests", "scripts", "validate-framework.py")
19
+ spec = importlib.util.spec_from_file_location("validate_framework", pfad)
20
+ modul = importlib.util.module_from_spec(spec)
21
+ spec.loader.exec_module(modul)
22
+ return modul
23
+
24
+
25
+ def marke(pfade: list, kern: str = KERN) -> str:
26
+ """'[Stand: ...; pfad, pfad]' ueber die Gegenstandsdateien, Pfade relativ zum Kern."""
27
+ wert = _validator().stand_wert(kern, pfade)
28
+ if wert is None:
29
+ raise RuntimeError("ein Gegenstand fehlt: " + ", ".join(pfade))
30
+ return "[Stand: %s; %s]" % (wert, ", ".join(pfade))