@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.
- package/.gitattributes +16 -0
- package/.gitignore +51 -0
- package/.koolie/QUELLREPOSITORIUM.md +18 -0
- package/.koolie/core/CHANGELOG.md +11832 -0
- package/.koolie/core/LICENSE +674 -0
- package/.koolie/core/LICENSE-HINWEIS.md +98 -0
- package/.koolie/core/OWNERS.md +36 -0
- package/.koolie/core/VERSION +1 -0
- package/.koolie/core/banner.py +397 -0
- package/.koolie/core/build/README.md +34 -0
- package/.koolie/core/build/assemble.py +354 -0
- package/.koolie/core/build/build-docx.py +194 -0
- package/.koolie/core/build/doc/00-kopf.md +18 -0
- package/.koolie/core/build/doc/01-executive-summary.md +24 -0
- package/.koolie/core/build/doc/02-zielbild.md +13 -0
- package/.koolie/core/build/doc/03-ziele-nichtziele.md +28 -0
- package/.koolie/core/build/doc/04-geltungsbereich.md +25 -0
- package/.koolie/core/build/doc/05-glossar.md +47 -0
- package/.koolie/core/build/doc/06-leitprinzipien.md +5 -0
- package/.koolie/core/build/doc/07-architektur.md +60 -0
- package/.koolie/core/build/doc/07a-abbildungsschicht.md +66 -0
- package/.koolie/core/build/doc/08-trennung.md +24 -0
- package/.koolie/core/build/doc/09-betriebsmodi.md +18 -0
- package/.koolie/core/build/doc/10-arbeitsablauf.md +5 -0
- package/.koolie/core/build/doc/11-datenschutz.md +5 -0
- package/.koolie/core/build/doc/12-sicherheit.md +5 -0
- package/.koolie/core/build/doc/13-risiko.md +5 -0
- package/.koolie/core/build/doc/14-rollen.md +9 -0
- package/.koolie/core/build/doc/15-referenzstruktur.md +124 -0
- package/.koolie/core/build/doc/16-agentenanweisung.md +8 -0
- package/.koolie/core/build/doc/17-overlay.md +29 -0
- package/.koolie/core/build/doc/18-skill-standard.md +5 -0
- package/.koolie/core/build/doc/19-skill-template.md +5 -0
- package/.koolie/core/build/doc/20-referenz-skills.md +70 -0
- package/.koolie/core/build/doc/21-prompts.md +53 -0
- package/.koolie/core/build/doc/22-checklisten.md +49 -0
- package/.koolie/core/build/doc/23-entscheidungsbaeume.md +29 -0
- package/.koolie/core/build/doc/24-onboarding.md +33 -0
- package/.koolie/core/build/doc/25-governance.md +35 -0
- package/.koolie/core/build/doc/26-qs-test.md +9 -0
- package/.koolie/core/build/doc/27-pilot.md +13 -0
- package/.koolie/core/build/doc/28-uebernahme.md +5 -0
- package/.koolie/core/build/doc/29-grenzen.md +87 -0
- package/.koolie/core/build/doc/30-roadmap.md +5 -0
- package/.koolie/core/build/doc/31-anhaenge.md +151 -0
- package/.koolie/core/build/doc/32-abschluss.md +92 -0
- package/.koolie/core/build/ref-a4.docx +0 -0
- package/.koolie/core/checklists/01-preflight.md +54 -0
- package/.koolie/core/checklists/02-privacy-context.md +51 -0
- package/.koolie/core/checklists/03-before-code-change.md +51 -0
- package/.koolie/core/checklists/04-review-ai-code.md +58 -0
- package/.koolie/core/checklists/05-testing.md +48 -0
- package/.koolie/core/checklists/06-security.md +50 -0
- package/.koolie/core/checklists/07-new-dependency.md +57 -0
- package/.koolie/core/checklists/08-merge-request.md +47 -0
- package/.koolie/core/checklists/09-onboarding.md +52 -0
- package/.koolie/core/checklists/10-project-adoption.md +74 -0
- package/.koolie/core/checklists/11-framework-release.md +71 -0
- package/.koolie/core/checklists/README.md +28 -0
- package/.koolie/core/clientmap.py +1358 -0
- package/.koolie/core/clients/README.md +113 -0
- package/.koolie/core/clients/_template/CLIENT_PACK.md +197 -0
- package/.koolie/core/clients/claude-code/CLIENT_PACK.md +383 -0
- package/.koolie/core/clients/claude-code/manifest.json +232 -0
- package/.koolie/core/clients/claude-code/root-template/.claude/README.md +127 -0
- package/.koolie/core/clients/cursor/CLIENT_PACK.md +229 -0
- package/.koolie/core/clients/cursor/manifest.json +330 -0
- package/.koolie/core/clients/cursor/root-template/.cursor/README.md +36 -0
- package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +251 -0
- package/.koolie/core/clients/devin-desktop/manifest.json +163 -0
- package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +79 -0
- package/.koolie/core/clients/kiro/CLIENT_PACK.md +223 -0
- package/.koolie/core/clients/kiro/manifest.json +300 -0
- package/.koolie/core/clients/kiro/root-template/.kiro/README.md +37 -0
- package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +257 -0
- package/.koolie/core/clients/openai-codex/manifest.json +208 -0
- package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +35 -0
- package/.koolie/core/decision-trees/01-context-allowed.md +46 -0
- package/.koolie/core/decision-trees/02-may-ai-do-task.md +47 -0
- package/.koolie/core/decision-trees/03-analyze-or-modify.md +50 -0
- package/.koolie/core/decision-trees/04-required-review.md +49 -0
- package/.koolie/core/decision-trees/05-stop-or-escalate.md +47 -0
- package/.koolie/core/decision-trees/06-rule-placement.md +58 -0
- package/.koolie/core/decision-trees/README.md +14 -0
- package/.koolie/core/docs/ADOPTION_GUIDE.md +582 -0
- package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +91 -0
- package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +79 -0
- package/.koolie/core/docs/ROADMAP.md +848 -0
- package/.koolie/core/docs/RUNTIME_GLOSSARY.md +113 -0
- package/.koolie/core/examples/README.md +11 -0
- package/.koolie/core/examples/example-ergebnisbericht.md +31 -0
- package/.koolie/core/examples/example-mr-description.md +31 -0
- package/.koolie/core/examples/example-overlay-runtime.md +48 -0
- package/.koolie/core/framework/core/00-principles.md +93 -0
- package/.koolie/core/framework/core/01-governance.md +58 -0
- package/.koolie/core/framework/core/02-privacy.md +141 -0
- package/.koolie/core/framework/core/03-security.md +86 -0
- package/.koolie/core/framework/core/04-quality.md +48 -0
- package/.koolie/core/framework/core/05-working-model.md +199 -0
- package/.koolie/core/framework/core/06-prompting-rules.md +51 -0
- package/.koolie/core/framework/core/07-review-rules.md +52 -0
- package/.koolie/core/framework/core/08-skill-conventions.md +115 -0
- package/.koolie/core/framework/core/09-risk-model.md +87 -0
- package/.koolie/core/framework/core/10-error-escalation.md +53 -0
- package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +16 -0
- package/.koolie/core/framework/org-policies/README.md +29 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/branching-strategy/muster-general.md +43 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/coding-guidelines/muster-general.md +82 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-done/muster-general.md +52 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/definition-of-ready/muster-general.md +54 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/quality/muster-general.md +59 -0
- package/.koolie/core/framework/overlay-patterns/general/documents/security/muster-general.md +52 -0
- package/.koolie/core/framework/overlay-patterns/general.md +150 -0
- package/.koolie/core/framework/role-packs/README.md +63 -0
- package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +58 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +158 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +88 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/CHANGELOG.md +10 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/EXAMPLES.md +148 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/SKILL.md +195 -0
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +22 -0
- package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +95 -0
- package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +26 -0
- package/.koolie/core/framework/runtime/agents/fw-reviewer.md +34 -0
- package/.koolie/core/framework/runtime/client-settings.json +3 -0
- package/.koolie/core/framework/runtime/hooks.json +20 -0
- package/.koolie/core/framework/runtime/mcp-config.example.json +4 -0
- package/.koolie/core/framework/runtime/permissions.json +106 -0
- package/.koolie/core/framework/runtime/root-instruction-local.example.md +19 -0
- package/.koolie/core/framework/runtime/root-instruction.md +116 -0
- package/.koolie/core/framework/runtime/rules/00-framework-core.md +49 -0
- package/.koolie/core/framework/runtime/rules/10-privacy-security.md +49 -0
- package/.koolie/core/framework/runtime/rules/15-development-rules.md +41 -0
- package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +32 -0
- package/.koolie/core/framework/runtime/rules/20-project-overlay.md +60 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/CHANGELOG.md +14 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/EXAMPLES.md +57 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/SKILL.md +177 -0
- package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +15 -0
- package/.koolie/core/framework/skills/fw-change-analyze/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-change-analyze/EXAMPLES.md +66 -0
- package/.koolie/core/framework/skills/fw-change-analyze/SKILL.md +167 -0
- package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +16 -0
- package/.koolie/core/framework/skills/fw-change-small/CHANGELOG.md +13 -0
- package/.koolie/core/framework/skills/fw-change-small/EXAMPLES.md +68 -0
- package/.koolie/core/framework/skills/fw-change-small/SKILL.md +175 -0
- package/.koolie/core/framework/skills/fw-change-small/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-code-explain/CHANGELOG.md +11 -0
- package/.koolie/core/framework/skills/fw-code-explain/EXAMPLES.md +61 -0
- package/.koolie/core/framework/skills/fw-code-explain/SKILL.md +163 -0
- package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +11 -0
- package/.koolie/core/framework/skills/fw-docs-update/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-docs-update/EXAMPLES.md +59 -0
- package/.koolie/core/framework/skills/fw-docs-update/SKILL.md +160 -0
- package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-error-analyze/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-error-analyze/EXAMPLES.md +67 -0
- package/.koolie/core/framework/skills/fw-error-analyze/SKILL.md +160 -0
- package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-mr-description/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-mr-description/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-mr-description/SKILL.md +170 -0
- package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +12 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/CHANGELOG.md +7 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/EXAMPLES.md +48 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/SKILL.md +147 -0
- package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-plan/CHANGELOG.md +14 -0
- package/.koolie/core/framework/skills/fw-plan/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-plan/SKILL.md +168 -0
- package/.koolie/core/framework/skills/fw-plan/TESTS.md +14 -0
- package/.koolie/core/framework/skills/fw-refactor/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-refactor/EXAMPLES.md +70 -0
- package/.koolie/core/framework/skills/fw-refactor/SKILL.md +173 -0
- package/.koolie/core/framework/skills/fw-refactor/TESTS.md +14 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/CHANGELOG.md +10 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/EXAMPLES.md +52 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/SKILL.md +149 -0
- package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +11 -0
- package/.koolie/core/framework/skills/fw-review-support/CHANGELOG.md +12 -0
- package/.koolie/core/framework/skills/fw-review-support/EXAMPLES.md +69 -0
- package/.koolie/core/framework/skills/fw-review-support/SKILL.md +179 -0
- package/.koolie/core/framework/skills/fw-review-support/TESTS.md +13 -0
- package/.koolie/core/framework/skills/fw-tests/CHANGELOG.md +9 -0
- package/.koolie/core/framework/skills/fw-tests/EXAMPLES.md +65 -0
- package/.koolie/core/framework/skills/fw-tests/SKILL.md +169 -0
- package/.koolie/core/framework/skills/fw-tests/TESTS.md +12 -0
- package/.koolie/core/framework/tech-packs/README.md +15 -0
- package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +61 -0
- package/.koolie/core/governance/ADOPTION_REGISTRY.md +89 -0
- package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +60 -0
- package/.koolie/core/governance/DECISION_LOG.md +779 -0
- package/.koolie/core/governance/EXCEPTION_PROCESS.md +31 -0
- package/.koolie/core/governance/FEEDBACK_PROCESS.md +34 -0
- package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +135 -0
- package/.koolie/core/governance/INCIDENT_HANDLING.md +47 -0
- package/.koolie/core/governance/PRIORITY_HIERARCHY.md +61 -0
- package/.koolie/core/governance/RACI.md +37 -0
- package/.koolie/core/governance/RELEASE_PROCESS.md +183 -0
- package/.koolie/core/governance/change-requests/CR-2026-001-definition-release-1-0-0.md +67 -0
- package/.koolie/core/governance/change-requests/CR-2026-002-client-packs.md +63 -0
- package/.koolie/core/governance/change-requests/CR-2026-003-install-client-schalter.md +70 -0
- package/.koolie/core/governance/change-requests/CR-2026-004-client-pack-claude-code.md +82 -0
- package/.koolie/core/governance/change-requests/CR-2026-005-kern-neutralisierung.md +75 -0
- package/.koolie/core/governance/change-requests/CR-2026-006-gemeinsame-skill-quelle.md +77 -0
- package/.koolie/core/governance/change-requests/CR-2026-007-geteilte-kernbestandteile.md +80 -0
- package/.koolie/core/governance/change-requests/CR-2026-008-berechtigungen-und-hooks.md +85 -0
- package/.koolie/core/governance/change-requests/CR-2026-009-umbenennung-leitwerk.md +77 -0
- package/.koolie/core/governance/change-requests/CR-2026-010-restduplikation.md +73 -0
- package/.koolie/core/governance/change-requests/CR-2026-011-hauptdokument.md +72 -0
- package/.koolie/core/governance/change-requests/CR-2026-012-schreibschutz-kernverzeichnis.md +106 -0
- package/.koolie/core/governance/change-requests/CR-2026-013-validator-blindstellen.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-014-kurzform-langform.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-015-versionskette.md +150 -0
- package/.koolie/core/governance/change-requests/CR-2026-016-ap2-claude-code.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-017-ladebedingungen-claude-code.md +173 -0
- package/.koolie/core/governance/change-requests/CR-2026-018-quellenliste-claude-code.md +121 -0
- package/.koolie/core/governance/change-requests/CR-2026-019-strukturentscheidungen-fortschreiben.md +143 -0
- package/.koolie/core/governance/change-requests/CR-2026-020-akteursbezeichnung.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-021-hook-interpreter.md +113 -0
- package/.koolie/core/governance/change-requests/CR-2026-022-artefaktversionen.md +73 -0
- package/.koolie/core/governance/change-requests/CR-2026-023-shell-lesesperre.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-024-clientbindungen.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-025-betriebsmodi.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-026-fail-closed.md +134 -0
- package/.koolie/core/governance/change-requests/CR-2026-027-zeichenlimit-einstufung.md +105 -0
- package/.koolie/core/governance/change-requests/CR-2026-028-berechtigungsmodi.md +130 -0
- package/.koolie/core/governance/change-requests/CR-2026-029-hook-ablageort.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-030-lesende-werkzeuge.md +143 -0
- package/.koolie/core/governance/change-requests/CR-2026-031-regelquellen-ausserhalb.md +182 -0
- package/.koolie/core/governance/change-requests/CR-2026-032-fremde-skill-ablage.md +151 -0
- package/.koolie/core/governance/change-requests/CR-2026-033-modusabhaengige-durchsetzung.md +131 -0
- package/.koolie/core/governance/change-requests/CR-2026-034-nachweisbedingungen.md +116 -0
- package/.koolie/core/governance/change-requests/CR-2026-035-readme-in-der-regelablage.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-036-ortsangaben-hook-konfiguration.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-037-meldender-hook-clientgebunden.md +133 -0
- package/.koolie/core/governance/change-requests/CR-2026-038-importsteuerung.md +159 -0
- package/.koolie/core/governance/change-requests/CR-2026-039-normative-saetze-in-kommentaren.md +124 -0
- package/.koolie/core/governance/change-requests/CR-2026-040-erh01-ist-clientgebunden.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-041-s5-nicht-abbildbar.md +128 -0
- package/.koolie/core/governance/change-requests/CR-2026-042-abwesenheitsnachweis-suchwerkzeug.md +102 -0
- package/.koolie/core/governance/change-requests/CR-2026-043-validator-gibt-trefferwerte-aus.md +135 -0
- package/.koolie/core/governance/change-requests/CR-2026-044-aktivierungspruefung-clientgebunden.md +112 -0
- package/.koolie/core/governance/change-requests/CR-2026-045-update-verliert-die-clientwahl.md +116 -0
- package/.koolie/core/governance/change-requests/CR-2026-046-erstinstallation-ueberschreibt-projektdatei.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-047-zusagen-je-zugriffskanal.md +133 -0
- package/.koolie/core/governance/change-requests/CR-2026-048-modusgrenze-ohne-durchsetzung.md +137 -0
- package/.koolie/core/governance/change-requests/CR-2026-049-sondenlauf-kodierungsabhaengig.md +126 -0
- package/.koolie/core/governance/change-requests/CR-2026-050-allowed-tools-und-verworfene-permissions.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-051-quellenkarte-und-ueberholter-stand.md +110 -0
- package/.koolie/core/governance/change-requests/CR-2026-052-drei-regelkonflikte.md +166 -0
- package/.koolie/core/governance/change-requests/CR-2026-053-lesesperre-und-entwicklungsprofil.md +144 -0
- package/.koolie/core/governance/change-requests/CR-2026-054-aktivierung-verlangt-aktivitaet.md +124 -0
- package/.koolie/core/governance/change-requests/CR-2026-055-domain-ausnahme-ohne-mechanismus.md +173 -0
- package/.koolie/core/governance/change-requests/CR-2026-056-eingabeschema-und-pfadidentitaet.md +245 -0
- package/.koolie/core/governance/change-requests/CR-2026-057-disallowed-tools-und-s3.md +148 -0
- package/.koolie/core/governance/change-requests/CR-2026-058-unteragent-reichweite.md +203 -0
- package/.koolie/core/governance/change-requests/CR-2026-059-unteragent-tiefe-und-widerspruch.md +125 -0
- package/.koolie/core/governance/change-requests/CR-2026-060-stumme-brueche.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-061-berechtigungsdatei-ohne-pruefung.md +169 -0
- package/.koolie/core/governance/change-requests/CR-2026-062-werkzeugabbildung-des-frontmatters.md +178 -0
- package/.koolie/core/governance/change-requests/CR-2026-063-skillaufruf-ohne-freigabe.md +207 -0
- package/.koolie/core/governance/change-requests/CR-2026-064-pruefregister-nicht-nachgezaehlt.md +141 -0
- package/.koolie/core/governance/change-requests/CR-2026-065-devin-suchwerkzeuge-erhoben.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-066-schlitzdeckung-ohne-abgleich.md +153 -0
- package/.koolie/core/governance/change-requests/CR-2026-067-hookblock-und-praeparationsregister.md +140 -0
- package/.koolie/core/governance/change-requests/CR-2026-068-sondenlauf-nebenlaeufig.md +106 -0
- package/.koolie/core/governance/change-requests/CR-2026-069-bytecode-des-kerns.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-070-d11-zaehler.md +114 -0
- package/.koolie/core/governance/change-requests/CR-2026-071-strukturentscheidungen-bestaetigen.md +322 -0
- package/.koolie/core/governance/change-requests/CR-2026-072-modulstatus-heben.md +315 -0
- package/.koolie/core/governance/change-requests/CR-2026-073-nicht-skill-traeger-heben.md +246 -0
- package/.koolie/core/governance/change-requests/CR-2026-074-restliche-nicht-skill-traeger-heben.md +271 -0
- package/.koolie/core/governance/change-requests/CR-2026-075-ap2-zielversion-devin-desktop.md +335 -0
- package/.koolie/core/governance/change-requests/CR-2026-076-erster-sitzungstest.md +455 -0
- package/.koolie/core/governance/change-requests/CR-2026-077-sitzungstest-schranken.md +425 -0
- package/.koolie/core/governance/change-requests/CR-2026-078-planung-nach-1-0-0.md +294 -0
- package/.koolie/core/governance/change-requests/CR-2026-079-umbenennung-vorziehen.md +233 -0
- package/.koolie/core/governance/change-requests/CR-2026-080-clientbindung-des-kerns.md +321 -0
- package/.koolie/core/governance/change-requests/CR-2026-081-produktnamen-im-kern.md +297 -0
- package/.koolie/core/governance/change-requests/CR-2026-082-sitzungstest-pi-ds-2.md +145 -0
- package/.koolie/core/governance/change-requests/CR-2026-083-sitzungstest-ne-sc.md +300 -0
- package/.koolie/core/governance/change-requests/CR-2026-084-trockenlauf-gegen-den-committeten-stand.md +117 -0
- package/.koolie/core/governance/change-requests/CR-2026-085-vorbedingungen-sitzungstest-5.md +182 -0
- package/.koolie/core/governance/change-requests/CR-2026-086-grenzfaelle-gegen-die-fassungen.md +164 -0
- package/.koolie/core/governance/change-requests/CR-2026-087-produktbeobachtung-quellenliste.md +206 -0
- package/.koolie/core/governance/change-requests/CR-2026-088-vorbedingungen-testblaetter.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-089-herrichtung-uebungsrepositorium.md +226 -0
- package/.koolie/core/governance/change-requests/CR-2026-090-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +255 -0
- package/.koolie/core/governance/change-requests/CR-2026-091-sitzungstest-5.md +163 -0
- package/.koolie/core/governance/change-requests/CR-2026-092-pruefmittelwort-und-buendelschnitt.md +226 -0
- package/.koolie/core/governance/change-requests/CR-2026-093-sechzehnte-praeparation.md +151 -0
- package/.koolie/core/governance/change-requests/CR-2026-094-testblaetter-buendel-1.md +113 -0
- package/.koolie/core/governance/change-requests/CR-2026-095-pruefapparat-filter.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-096-vorbedingungen-buendel-2.md +225 -0
- package/.koolie/core/governance/change-requests/CR-2026-097-testblaetter-buendel-2.md +162 -0
- package/.koolie/core/governance/change-requests/CR-2026-098-anforderungen-auslieferung.md +93 -0
- package/.koolie/core/governance/change-requests/CR-2026-099-k74-und-vorbedingungen-buendel-3.md +119 -0
- package/.koolie/core/governance/change-requests/CR-2026-100-testblaetter-buendel-3.md +120 -0
- package/.koolie/core/governance/change-requests/CR-2026-101-k77-eigener-posten.md +165 -0
- package/.koolie/core/governance/change-requests/CR-2026-102-k77-entschieden.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-103-vorbedingungen-buendel-4.md +76 -0
- package/.koolie/core/governance/change-requests/CR-2026-104-herrichtung-buendel-4.md +82 -0
- package/.koolie/core/governance/change-requests/CR-2026-105-messapparat-buendel-4.md +227 -0
- package/.koolie/core/governance/change-requests/CR-2026-106-uebergabe-einchecken.md +91 -0
- package/.koolie/core/governance/change-requests/CR-2026-107-uebergabe-im-release-commit.md +111 -0
- package/.koolie/core/governance/change-requests/CR-2026-108-testblaetter-buendel-4.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-109-berichtsweg-des-aufraeumers.md +108 -0
- package/.koolie/core/governance/change-requests/CR-2026-110-vorbedingungen-des-nachlaufs.md +184 -0
- package/.koolie/core/governance/change-requests/CR-2026-111-der-apparat-auf-dem-weg-der-wiederaufnahme.md +127 -0
- package/.koolie/core/governance/change-requests/CR-2026-112-der-arbeitsplatz-im-kern.md +103 -0
- package/.koolie/core/governance/change-requests/CR-2026-113-nachlauf-buendel-4.md +103 -0
- package/.koolie/core/governance/change-requests/CR-2026-114-vorbedingungen-buendel-5.md +317 -0
- package/.koolie/core/governance/change-requests/CR-2026-115-herrichtung-buendel-5.md +244 -0
- package/.koolie/core/governance/change-requests/CR-2026-116-messtag-buendel-5.md +178 -0
- package/.koolie/core/governance/change-requests/CR-2026-117-sammelzellen-zentraler-katalog.md +251 -0
- package/.koolie/core/governance/change-requests/CR-2026-118-quellenzuordnung-matrixzeilen.md +115 -0
- package/.koolie/core/governance/change-requests/CR-2026-119-umbenennung-koolie.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-120-ap2-rest-devin-desktop.md +96 -0
- package/.koolie/core/governance/change-requests/CR-2026-121-verify-marker-abschaffen.md +185 -0
- package/.koolie/core/governance/change-requests/CR-2026-122-umbenennung-koolie-lauf.md +131 -0
- package/.koolie/core/governance/change-requests/CR-2026-123-vortrag-und-namensabsatz.md +170 -0
- package/.koolie/core/governance/change-requests/CR-2026-124-hauptdokument-ap11.md +237 -0
- package/.koolie/core/governance/change-requests/CR-2026-125-word-fassung-und-blinder-fleck.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-126-lizenz-gpl3.md +112 -0
- package/.koolie/core/governance/change-requests/CR-2026-127-gegenzeichnung-rollenfrage.md +96 -0
- package/.koolie/core/governance/change-requests/CR-2026-128-freigabelauf-1.0.0.md +278 -0
- package/.koolie/core/governance/change-requests/CR-2026-129-archiv-zeilenenden.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-130-reihenfolge-des-hebens.md +204 -0
- package/.koolie/core/governance/change-requests/CR-2026-131-chronik-und-vorlage.md +194 -0
- package/.koolie/core/governance/change-requests/CR-2026-132-erhebung-openai-codex.md +185 -0
- package/.koolie/core/governance/change-requests/CR-2026-133-bau-openai-codex.md +97 -0
- package/.koolie/core/governance/change-requests/CR-2026-134-uebergabe-lokal.md +117 -0
- package/.koolie/core/governance/change-requests/CR-2026-135-pfadlisten-nul-getrennt.md +139 -0
- package/.koolie/core/governance/change-requests/CR-2026-136-overlay-werte-einordnung.md +156 -0
- package/.koolie/core/governance/change-requests/CR-2026-137-kopierweg-kern.md +144 -0
- package/.koolie/core/governance/change-requests/CR-2026-138-overlay-muster-general.md +118 -0
- package/.koolie/core/governance/change-requests/CR-2026-139-overlay-muster-dokumente.md +105 -0
- package/.koolie/core/governance/change-requests/CR-2026-140-installer-je-zielsystem.md +120 -0
- package/.koolie/core/governance/change-requests/CR-2026-141-lieferumfang.md +123 -0
- package/.koolie/core/governance/change-requests/CR-2026-142-dokumentationsstandard.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-143-klasse-b-core-laufzeit.md +89 -0
- package/.koolie/core/governance/change-requests/CR-2026-144-klasse-b-governance.md +90 -0
- package/.koolie/core/governance/change-requests/CR-2026-145-klasse-b-skills.md +81 -0
- package/.koolie/core/governance/change-requests/CR-2026-146-code-pack-posten.md +84 -0
- package/.koolie/core/governance/change-requests/CR-2026-147-regel-register-posten.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-148-mehrprojekt-tokenlast.md +70 -0
- package/.koolie/core/governance/change-requests/CR-2026-149-regelablage-pfadtoken.md +71 -0
- package/.koolie/core/governance/change-requests/CR-2026-150-client-pack-kiro.md +76 -0
- package/.koolie/core/governance/change-requests/CR-2026-151-skill-anweisungen.md +71 -0
- package/.koolie/core/governance/change-requests/CR-2026-152-testblaetter-modellwechsel.md +78 -0
- package/.koolie/core/governance/change-requests/CR-2026-153-attributionszeile.md +88 -0
- package/.koolie/core/governance/change-requests/CR-2026-154-auffindbarkeit.md +102 -0
- package/.koolie/core/governance/change-requests/CR-2026-155-client-pack-cursor.md +80 -0
- package/.koolie/core/governance/change-requests/CR-2026-156-mandat-und-reibung.md +100 -0
- package/.koolie/core/governance/change-requests/CR-2026-157-mcp-anbindung.md +93 -0
- package/.koolie/core/governance/change-requests/CR-2026-158-registerpflege.md +69 -0
- package/.koolie/core/governance/change-requests/CR-2026-159-powershell.md +49 -0
- package/.koolie/core/governance/change-requests/CR-2026-160-messapparat.md +59 -0
- package/.koolie/core/governance/change-requests/CR-2026-161-pruefwerkzeuge.md +52 -0
- package/.koolie/core/governance/change-requests/CR-2026-162-schutzschicht.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-163-pfadsemantik.md +61 -0
- package/.koolie/core/governance/change-requests/CR-2026-164-modi-ausnahmen.md +65 -0
- package/.koolie/core/governance/change-requests/CR-2026-165-installer-banner.md +406 -0
- package/.koolie/core/governance/change-requests/CR-2026-166-nachlauf-aufzeichnungen.md +59 -0
- package/.koolie/core/governance/change-requests/CR-2026-167-einsatzarchitektur.md +60 -0
- package/.koolie/core/governance/change-requests/CR-2026-168-paketquellen.md +64 -0
- package/.koolie/core/governance/change-requests/CR-2026-169-modusbindung-messfragen.md +58 -0
- package/.koolie/core/governance/change-requests/CR-2026-170-erste-veroeffentlichung.md +62 -0
- package/.koolie/core/governance/change-requests/CR-2026-171-befehl-im-projektverzeichnis.md +57 -0
- package/.koolie/core/governance/change-requests/CR-2026-172-auftritt-npm-suche.md +58 -0
- package/.koolie/core/install.py +2402 -0
- package/.koolie/core/install_dialog.py +227 -0
- package/.koolie/core/koexistenz.py +112 -0
- package/.koolie/core/mandat.py +605 -0
- package/.koolie/core/onboarding/COMPLETION_CRITERIA.md +37 -0
- package/.koolie/core/onboarding/GUIDE.md +103 -0
- package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +48 -0
- package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +40 -0
- package/.koolie/core/onboarding/QUICKSTART.md +50 -0
- package/.koolie/core/onboarding/REFERENCE.md +69 -0
- package/.koolie/core/onboarding/exercises/EXERCISES.md +78 -0
- package/.koolie/core/onboarding/exercises/README.md +120 -0
- package/.koolie/core/pilot/METRICS.md +59 -0
- package/.koolie/core/pilot/PILOT_CONCEPT.md +42 -0
- package/.koolie/core/prompts/01-understand-codebase.md +99 -0
- package/.koolie/core/prompts/02-impact-analysis.md +104 -0
- package/.koolie/core/prompts/03-implementation-planning.md +102 -0
- package/.koolie/core/prompts/04-code-generation.md +100 -0
- package/.koolie/core/prompts/05-test-generation.md +103 -0
- package/.koolie/core/prompts/06-refactoring.md +102 -0
- package/.koolie/core/prompts/07-debugging.md +97 -0
- package/.koolie/core/prompts/08-security-review.md +92 -0
- package/.koolie/core/prompts/09-performance-analysis.md +89 -0
- package/.koolie/core/prompts/10-documentation.md +91 -0
- package/.koolie/core/prompts/11-merge-request-review.md +94 -0
- package/.koolie/core/prompts/12-developer-training.md +90 -0
- package/.koolie/core/prompts/README.md +88 -0
- package/.koolie/core/templates/MR_AI_DISCLOSURE.md +37 -0
- package/.koolie/core/templates/PLAN_TEMPLATE.md +57 -0
- package/.koolie/core/templates/SKILL_TEMPLATE.md +159 -0
- package/.koolie/core/templates/project-overlay/OVERLAY.md +315 -0
- package/.koolie/core/templates/project-overlay/documents/README.md +43 -0
- package/.koolie/core/templates/project-overlay/documents/ai-governance/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/ai-process-model/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/architecture/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/branching-strategy/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/coding-guidelines/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/definition-of-done/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/definition-of-ready/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/deployment/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/glossary/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/quality/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/roadmap/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/roles/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/documents/security/.gitkeep.md +3 -0
- package/.koolie/core/templates/project-overlay/exceptions/EXCEPTIONS.md +9 -0
- package/.koolie/core/templates/project-overlay/forbidden-terms.txt +8 -0
- package/.koolie/core/templates/project-overlay/overlay-manifest.yaml +73 -0
- package/.koolie/core/templates/rules/21-overlay-TEMPLATE.md.template +28 -0
- package/.koolie/core/templates/rules/40-tech-TEMPLATE.md.template +33 -0
- package/.koolie/core/tests/EDGE_CASES.md +67 -0
- package/.koolie/core/tests/TEST_CATALOG.md +170 -0
- package/.koolie/core/tests/erhebungen/README.md +326 -0
- package/.koolie/core/tests/erhebungen/ablage.py +357 -0
- package/.koolie/core/tests/erhebungen/apparat/__init__.py +22 -0
- package/.koolie/core/tests/erhebungen/apparat/baum.py +214 -0
- package/.koolie/core/tests/erhebungen/apparat/belege.py +91 -0
- package/.koolie/core/tests/erhebungen/apparat/clients.py +321 -0
- package/.koolie/core/tests/erhebungen/apparat/freigabe.py +74 -0
- package/.koolie/core/tests/erhebungen/apparat/kontingent.py +64 -0
- package/.koolie/core/tests/erhebungen/apparat/laeufer.py +155 -0
- package/.koolie/core/tests/erhebungen/apparat/reihe.py +202 -0
- package/.koolie/core/tests/erhebungen/apparat/selbsttest.py +280 -0
- package/.koolie/core/tests/erhebungen/apparat/stand.py +30 -0
- package/.koolie/core/tests/erhebungen/apparat/vorpruefung.py +70 -0
- package/.koolie/core/tests/erhebungen/auswerten-b4.py +468 -0
- package/.koolie/core/tests/erhebungen/auswerten-b5.py +517 -0
- package/.koolie/core/tests/erhebungen/auswerten-dd.py +172 -0
- package/.koolie/core/tests/erhebungen/baeume-b4.py +334 -0
- package/.koolie/core/tests/erhebungen/baeume-b5.py +339 -0
- package/.koolie/core/tests/erhebungen/baeume_loeschen.py +138 -0
- package/.koolie/core/tests/erhebungen/cc-overlay-fuellen.py +277 -0
- package/.koolie/core/tests/erhebungen/dossier-b4.py +178 -0
- package/.koolie/core/tests/erhebungen/dossier-b5.py +202 -0
- package/.koolie/core/tests/erhebungen/historie-bauen-b4.py +642 -0
- package/.koolie/core/tests/erhebungen/k-bauen-b3.py +841 -0
- package/.koolie/core/tests/erhebungen/lauf-dd.py +146 -0
- package/.koolie/core/tests/erhebungen/lauf.py +114 -0
- package/.koolie/core/tests/erhebungen/mcp-waechter.py +278 -0
- package/.koolie/core/tests/erhebungen/messbaum-schnitt.py +256 -0
- package/.koolie/core/tests/erhebungen/messen.py +72 -0
- package/.koolie/core/tests/erhebungen/node-waechter.py +74 -0
- package/.koolie/core/tests/erhebungen/packaktivierung.py +403 -0
- package/.koolie/core/tests/erhebungen/prompts-schreiben-b4.py +210 -0
- package/.koolie/core/tests/erhebungen/prompts-schreiben-b5.py +251 -0
- package/.koolie/core/tests/erhebungen/reihe-b4.py +171 -0
- package/.koolie/core/tests/erhebungen/reihe-b5.py +172 -0
- package/.koolie/core/tests/erhebungen/stand-b4.py +135 -0
- package/.koolie/core/tests/erhebungen/stand-b5.py +137 -0
- package/.koolie/core/tests/erhebungen/trust-b4.py +56 -0
- package/.koolie/core/tests/erhebungen/trust-b5.py +56 -0
- package/.koolie/core/tests/erhebungen/turn2-schreiben-b4.py +105 -0
- package/.koolie/core/tests/erhebungen/umgebungen-bauen-b4.py +377 -0
- package/.koolie/core/tests/erhebungen/umgebungen-bauen-b5.py +363 -0
- package/.koolie/core/tests/erhebungen/zaehlen46.py +74 -0
- package/.koolie/core/tests/erhebungen/zustand-b4.py +82 -0
- package/.koolie/core/tests/erhebungen/zustand-b5.py +82 -0
- package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code-wirkungsnachweise.md +194 -0
- package/.koolie/core/tests/protocols/2026-09-10-AP2-claude-code.md +468 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-020-akteursbezeichnung.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-021-hook-interpreter.md +138 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-022-artefaktversionen.md +87 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-023-shell-lesesperre.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-10-CR-2026-024-clientbindungen.md +98 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-DS-03.md +90 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-01.md +105 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-02.md +123 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-KO-04.md +73 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-RE-02.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01-wiederholung.md +108 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-VN-01.md +249 -0
- package/.koolie/core/tests/protocols/2026-09-10-FW-ZA-05.md +99 -0
- package/.koolie/core/tests/protocols/2026-09-11-AP2-devin-desktop.md +257 -0
- package/.koolie/core/tests/protocols/2026-09-11-CR-2026-026-fail-closed.md +113 -0
- package/.koolie/core/tests/protocols/2026-09-11-erhebungen-K21-K26.md +243 -0
- package/.koolie/core/tests/protocols/2026-09-11-wirkungsnachweise-0.26.0.md +101 -0
- package/.koolie/core/tests/protocols/2026-09-12-B01-allowed-tools.md +152 -0
- package/.koolie/core/tests/protocols/2026-09-12-B04-B05-gegenpruefung.md +204 -0
- package/.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md +268 -0
- package/.koolie/core/tests/protocols/2026-09-12-mehrprojekt-arbeitsbereich.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.26.1.md +126 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.27.0.md +114 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.28.0.md +129 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.29.0.md +121 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.30.0.md +112 -0
- package/.koolie/core/tests/protocols/2026-09-12-wirkungsnachweise-0.31.0.md +107 -0
- package/.koolie/core/tests/protocols/2026-09-13-B06-gegenpruefung.md +370 -0
- package/.koolie/core/tests/protocols/2026-09-13-B07-B09-gegenpruefung.md +211 -0
- package/.koolie/core/tests/protocols/2026-09-13-B08-B11-gegenpruefung.md +179 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-disallowed-tools.md +147 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent-tiefe.md +139 -0
- package/.koolie/core/tests/protocols/2026-09-13-erhebung-unteragent.md +214 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-berechtigungsdatei.md +253 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-stumme-brueche.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-13-gegenpruefung-werkzeugabbildung.md +219 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.32.0.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.33.0.md +169 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.34.0.md +187 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.35.0.md +187 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.36.0.md +137 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.37.0.md +112 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.38.0.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.39.0.md +188 -0
- package/.koolie/core/tests/protocols/2026-09-13-wirkungsnachweise-0.40.0.md +214 -0
- package/.koolie/core/tests/protocols/2026-09-14-erhebung-devin-werkzeuge.md +267 -0
- package/.koolie/core/tests/protocols/2026-09-14-erhebung-skillaufruf.md +238 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-pruefregister.md +156 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-schlitzdeckung.md +206 -0
- package/.koolie/core/tests/protocols/2026-09-14-gegenpruefung-skillwahl.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-14-migrationslauf-pilot.md +134 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.41.0.md +175 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.42.0.md +180 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.43.0.md +165 -0
- package/.koolie/core/tests/protocols/2026-09-14-wirkungsnachweise-0.44.0.md +130 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-d11-zaehlregeln.md +311 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-modulstatus.md +524 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-nicht-skill-traeger.md +225 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-restliche-nicht-skill-traeger.md +345 -0
- package/.koolie/core/tests/protocols/2026-09-15-gegenpruefung-strukturentscheidungen.md +392 -0
- package/.koolie/core/tests/protocols/2026-09-15-herrichtung-uebungsrepositorium.md +213 -0
- package/.koolie/core/tests/protocols/2026-09-15-migrationslauf-pilot-0.46.0.md +143 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.45.0.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.46.0.md +193 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.47.0.md +149 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.49.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.50.0.md +183 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.51.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-15-wirkungsnachweise-0.52.0.md +168 -0
- package/.koolie/core/tests/protocols/2026-09-16-AP2-zielversion-devin-desktop.md +231 -0
- package/.koolie/core/tests/protocols/2026-09-16-wirkungsnachweise-0.53.0.md +350 -0
- package/.koolie/core/tests/protocols/2026-09-17-nachtrag-migrationshinweis-0.54.1.md +121 -0
- package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-pi-ds.md +523 -0
- package/.koolie/core/tests/protocols/2026-09-17-sitzungstest-schranken.md +433 -0
- package/.koolie/core/tests/protocols/2026-09-17-wirkungsnachweise-0.54.0.md +159 -0
- package/.koolie/core/tests/protocols/2026-09-18-FW-AK-01.md +442 -0
- package/.koolie/core/tests/protocols/2026-09-18-FW-KO-05.md +231 -0
- package/.koolie/core/tests/protocols/2026-09-18-herrichtung-uebungsrepositorium.md +273 -0
- package/.koolie/core/tests/protocols/2026-09-18-nachtrag-preis-umbenennung-0.56.1.md +102 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-5.md +349 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-ne-sc.md +430 -0
- package/.koolie/core/tests/protocols/2026-09-18-sitzungstest-pi-ds-2.md +499 -0
- package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-sitzungstest-5-zweiter-durchgang.md +170 -0
- package/.koolie/core/tests/protocols/2026-09-18-vorbedingungen-testblaetter.md +184 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.55.0.md +202 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.0.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.56.2.md +154 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.0.md +228 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.57.1.md +262 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.58.0.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.59.0.md +150 -0
- package/.koolie/core/tests/protocols/2026-09-18-wirkungsnachweise-0.60.0.md +340 -0
- package/.koolie/core/tests/protocols/2026-09-19-herrichtung-buendel-4.md +235 -0
- package/.koolie/core/tests/protocols/2026-09-19-k77-zurechenbarkeit.md +236 -0
- package/.koolie/core/tests/protocols/2026-09-19-pruefapparat-filter.md +50 -0
- package/.koolie/core/tests/protocols/2026-09-19-pruefmittelwort-und-buendelschnitt.md +239 -0
- package/.koolie/core/tests/protocols/2026-09-19-sechzehnte-praeparation.md +135 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-1.md +250 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-2.md +229 -0
- package/.koolie/core/tests/protocols/2026-09-19-testblaetter-buendel-3.md +293 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-2.md +236 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-3.md +253 -0
- package/.koolie/core/tests/protocols/2026-09-19-vorbedingungen-buendel-4.md +138 -0
- package/.koolie/core/tests/protocols/2026-09-20-messapparat-buendel-4.md +433 -0
- package/.koolie/core/tests/protocols/2026-09-20-testblaetter-buendel-4.md +321 -0
- package/.koolie/core/tests/protocols/2026-09-20-uebergabe-im-release-commit.md +146 -0
- package/.koolie/core/tests/protocols/2026-09-20-vorbedingungen-nachlauf-b4.md +259 -0
- package/.koolie/core/tests/protocols/2026-09-21-arbeitsplatz-im-kern.md +127 -0
- package/.koolie/core/tests/protocols/2026-09-21-nachlauf-buendel-4.md +157 -0
- package/.koolie/core/tests/protocols/2026-09-21-vorbedingungen-buendel-5.md +247 -0
- package/.koolie/core/tests/protocols/2026-09-21-wiederaufnahme-nachlauf-b4.md +190 -0
- package/.koolie/core/tests/protocols/2026-09-22-ap2-rest-devin-desktop.md +614 -0
- package/.koolie/core/tests/protocols/2026-09-22-hauptdokument-ap11.md +443 -0
- package/.koolie/core/tests/protocols/2026-09-22-herrichtung-buendel-5.md +224 -0
- package/.koolie/core/tests/protocols/2026-09-22-messtag-buendel-5.md +327 -0
- package/.koolie/core/tests/protocols/2026-09-22-quellenzuordnung-matrixzeilen.md +230 -0
- package/.koolie/core/tests/protocols/2026-09-22-sammelzellen-zentraler-katalog.md +354 -0
- package/.koolie/core/tests/protocols/2026-09-22-umbenennung-koolie.md +296 -0
- package/.koolie/core/tests/protocols/2026-09-22-verify-marker-abschaffen.md +283 -0
- package/.koolie/core/tests/protocols/2026-09-22-vortrag-und-name.md +261 -0
- package/.koolie/core/tests/protocols/2026-09-22-wirkungsnachweise-0.86.0.md +158 -0
- package/.koolie/core/tests/protocols/2026-09-23-archiv-zeilenenden.md +113 -0
- package/.koolie/core/tests/protocols/2026-09-23-bau-openai-codex.md +168 -0
- package/.koolie/core/tests/protocols/2026-09-23-chronik-und-vorlage.md +224 -0
- package/.koolie/core/tests/protocols/2026-09-23-erhebung-openai-codex.md +309 -0
- package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0-vorbereitung.md +119 -0
- package/.koolie/core/tests/protocols/2026-09-23-freigabelauf-1.0.0.md +150 -0
- package/.koolie/core/tests/protocols/2026-09-23-gegenzeichnung-rollenfrage.md +198 -0
- package/.koolie/core/tests/protocols/2026-09-23-reihenfolge-des-hebens.md +220 -0
- package/.koolie/core/tests/protocols/2026-09-23-word-fassung-und-blinder-fleck.md +307 -0
- package/.koolie/core/tests/protocols/2026-09-24-kopierweg-kern.md +98 -0
- package/.koolie/core/tests/protocols/2026-09-24-overlay-werte-einordnung.md +111 -0
- package/.koolie/core/tests/protocols/2026-09-24-pfadlisten-nul-getrennt.md +128 -0
- package/.koolie/core/tests/protocols/2026-09-24-uebergabe-lokal.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-25-code-pack-posten.md +86 -0
- package/.koolie/core/tests/protocols/2026-09-25-dokumentationsstandard.md +101 -0
- package/.koolie/core/tests/protocols/2026-09-25-installer-je-zielsystem.md +134 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-core-laufzeit.md +126 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-governance.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-25-klasse-b-skills.md +91 -0
- package/.koolie/core/tests/protocols/2026-09-25-lieferumfang.md +76 -0
- package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-dokumente.md +107 -0
- package/.koolie/core/tests/protocols/2026-09-25-overlay-muster-general.md +100 -0
- package/.koolie/core/tests/protocols/2026-09-25-regel-register-posten.md +87 -0
- package/.koolie/core/tests/protocols/2026-09-26-attributionszeile.md +83 -0
- package/.koolie/core/tests/protocols/2026-09-26-auffindbarkeit.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-26-bau-cursor.md +68 -0
- package/.koolie/core/tests/protocols/2026-09-26-bau-kiro.md +75 -0
- package/.koolie/core/tests/protocols/2026-09-26-mehrprojekt-tokenlast.md +174 -0
- package/.koolie/core/tests/protocols/2026-09-26-regelablage-pfadtoken.md +133 -0
- package/.koolie/core/tests/protocols/2026-09-26-skill-anweisungen.md +111 -0
- package/.koolie/core/tests/protocols/2026-09-26-testblaetter-modellwechsel.md +106 -0
- package/.koolie/core/tests/protocols/2026-09-27-mandat-und-reibung.md +58 -0
- package/.koolie/core/tests/protocols/2026-09-28-mcp-anbindung.md +72 -0
- package/.koolie/core/tests/protocols/2026-09-29-messapparat.md +75 -0
- package/.koolie/core/tests/protocols/2026-09-29-powershell.md +58 -0
- package/.koolie/core/tests/protocols/2026-09-29-pruefwerkzeuge.md +64 -0
- package/.koolie/core/tests/protocols/2026-09-29-registerpflege.md +228 -0
- package/.koolie/core/tests/protocols/2026-09-29-schutzschicht.md +95 -0
- package/.koolie/core/tests/protocols/2026-09-30-einsatzarchitektur.md +104 -0
- package/.koolie/core/tests/protocols/2026-09-30-modi-ausnahmen.md +77 -0
- package/.koolie/core/tests/protocols/2026-09-30-nachlauf-banner.md +85 -0
- package/.koolie/core/tests/protocols/2026-09-30-paketquellen.md +65 -0
- package/.koolie/core/tests/protocols/2026-09-30-pfadsemantik.md +79 -0
- package/.koolie/core/tests/protocols/2026-10-01-auftritt-und-suche.md +58 -0
- package/.koolie/core/tests/protocols/2026-10-01-befehl-im-projektverzeichnis.md +47 -0
- package/.koolie/core/tests/protocols/2026-10-01-erste-veroeffentlichung.md +60 -0
- package/.koolie/core/tests/protocols/2026-10-01-modusbindung-messfragen.md +107 -0
- package/.koolie/core/tests/protocols/README.md +14 -0
- package/.koolie/core/tests/scripts/hook-check-secrets.py +1307 -0
- package/.koolie/core/tests/scripts/hook-overlay-status.py +120 -0
- package/.koolie/core/tests/scripts/mermaid_renderer.py +67 -0
- package/.koolie/core/tests/scripts/overlay_status.py +130 -0
- package/.koolie/core/tests/scripts/probe-pruefungen.py +110 -0
- package/.koolie/core/tests/scripts/pruefungen/__init__.py +4 -0
- package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +1559 -0
- package/.koolie/core/tests/scripts/pruefungen/bestand.py +1433 -0
- package/.koolie/core/tests/scripts/pruefungen/dokumente.py +1262 -0
- package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +784 -0
- package/.koolie/core/tests/scripts/pruefungen/hooks.py +1188 -0
- package/.koolie/core/tests/scripts/pruefungen/overlay.py +1251 -0
- package/.koolie/core/tests/scripts/pruefungen/packs.py +1314 -0
- package/.koolie/core/tests/scripts/pruefungen/register.py +950 -0
- package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +1202 -0
- package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +957 -0
- package/.koolie/core/tests/scripts/sonden/__init__.py +4 -0
- package/.koolie/core/tests/scripts/sonden/apparat.py +653 -0
- package/.koolie/core/tests/scripts/sonden/teil01_grundbestand_und_installation.py +999 -0
- package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +942 -0
- package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +1184 -0
- package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +1491 -0
- package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +1447 -0
- package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +739 -0
- package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +1014 -0
- package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +1325 -0
- package/.koolie/core/tests/scripts/sonden/teil09_pruefmittel_81_und_82.py +505 -0
- package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +1218 -0
- package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +149 -0
- package/.koolie/core/tests/scripts/sonden/teil12_pruefungen_106_und_107.py +136 -0
- package/.koolie/core/tests/scripts/sonden/teil13_pfad_und_mustersemantik.py +150 -0
- package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +204 -0
- package/.koolie/core/tests/scripts/sonden/teil15_banner_und_nachlauf.py +193 -0
- package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +114 -0
- package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +115 -0
- package/.koolie/core/tests/scripts/sonden/teil18_modusbindung_m3_m5.py +113 -0
- package/.koolie/core/tests/scripts/validate-framework.py +1104 -0
- package/.koolie/core/tests/scripts/validate-output.py +296 -0
- package/.koolie/core/wirksamkeit.py +430 -0
- package/CONTRIBUTING.md +119 -0
- package/LICENSE +674 -0
- package/QUICKSTART.en.md +135 -0
- package/QUICKSTART.md +129 -0
- package/README.en.md +108 -0
- package/README.md +107 -0
- package/install.cmd +44 -0
- package/install.command +46 -0
- package/package.json +21 -0
- package/paketquellen/README.md +41 -0
- package/paketquellen/bauen.py +411 -0
- package/paketquellen/koolie.cmd +23 -0
- package/paketquellen/koolie_befehl.py +82 -0
- package/paketquellen/npm/koolie.js +26 -0
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
"""Der Apparat des Sondenlaufs: Befehlszeile, Kopien, Einheiten und ihre Anmeldung,
|
|
2
|
+
Praeparationswaechter, Aufraeumer, nebenlaeufige Bahnen und Auswertung.
|
|
3
|
+
|
|
4
|
+
Teil des Sondenskripts probe-pruefungen.py, seit 1.19.1 in Module geteilt (K-174). Die
|
|
5
|
+
Einheiten melden sich beim Laden dieses Moduls an; der Einstieg laedt die Module in der
|
|
6
|
+
Reihenfolge ihrer Nummer, und das ist die Reihenfolge der Ausgabe (D-49). Ein Modul
|
|
7
|
+
liest nur aus dem Apparat und aus frueheren Teilen."""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import io
|
|
12
|
+
import os
|
|
13
|
+
import shutil
|
|
14
|
+
import stat
|
|
15
|
+
import subprocess
|
|
16
|
+
import sys
|
|
17
|
+
import tempfile
|
|
18
|
+
import threading
|
|
19
|
+
import time
|
|
20
|
+
import traceback
|
|
21
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
BAHNEN_VORGABE = 8
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def argumente(argv: list) -> tuple:
|
|
28
|
+
"""Pfad und Bahnenzahl aus der Befehlszeile - mehr Schalter gibt es nicht.
|
|
29
|
+
|
|
30
|
+
Die Vorgabe ist eine feste Zahl und NICHT die Kernzahl dieser Maschine. Eine
|
|
31
|
+
Vorgabe, die vom Rechner abhaengt, macht zwei Laufzeiten unvergleichbar - und der
|
|
32
|
+
Engpass ist ohnehin nicht die Rechenzeit: Jede Einheit legt eine eigene Kopie des
|
|
33
|
+
Repositoriums an und startet mindestens einen Unterprozess darauf.
|
|
34
|
+
|
|
35
|
+
`--bahnen 1` ist der serielle Lauf, Einheit fuer Einheit in der Reihenfolge dieser
|
|
36
|
+
Datei. Er ist der Rueckfallweg, wenn ein Befund sich nur seriell zeigt.
|
|
37
|
+
"""
|
|
38
|
+
pfad, bahnen, rest = ".", BAHNEN_VORGABE, list(argv)
|
|
39
|
+
nur, liste = [], False
|
|
40
|
+
while rest:
|
|
41
|
+
wort = rest.pop(0)
|
|
42
|
+
if wort == "--bahnen":
|
|
43
|
+
if not rest or not rest[0].isdigit() or int(rest[0]) < 1:
|
|
44
|
+
sys.exit("--bahnen erwartet eine Zahl ab 1")
|
|
45
|
+
bahnen = int(rest.pop(0))
|
|
46
|
+
elif wort == "--nur":
|
|
47
|
+
if not rest or rest[0].startswith("--"):
|
|
48
|
+
sys.exit("--nur erwartet Kennungen, durch Komma getrennt (z. B. --nur 44,62)")
|
|
49
|
+
nur = [x.strip().lower() for x in rest.pop(0).split(",") if x.strip()]
|
|
50
|
+
elif wort == "--liste":
|
|
51
|
+
liste = True
|
|
52
|
+
elif wort.startswith("--"):
|
|
53
|
+
sys.exit("Unbekannter Schalter: %s (bekannt sind --bahnen N, --nur A,B "
|
|
54
|
+
"und --liste)" % wort)
|
|
55
|
+
else:
|
|
56
|
+
pfad = wort
|
|
57
|
+
return os.path.abspath(pfad), bahnen, nur, liste
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
QUELLE, BAHNEN, NUR, LISTE = argumente(sys.argv[1:])
|
|
61
|
+
VALIDATOR = ".koolie/core/tests/scripts/validate-framework.py"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def kopie() -> str:
|
|
65
|
+
ziel = tempfile.mkdtemp(prefix="lw-sonde-")
|
|
66
|
+
shutil.copytree(QUELLE, os.path.join(ziel, "repo"),
|
|
67
|
+
ignore=shutil.ignore_patterns(".git", "__pycache__", "out"))
|
|
68
|
+
return os.path.join(ziel, "repo")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def baumhash(root: str) -> str:
|
|
72
|
+
"""Fingerabdruck des Baums - er entscheidet, ob eine Sonde etwas gesetzt hat.
|
|
73
|
+
|
|
74
|
+
Ohne ihn ist ein Suchtext, der nicht mehr passt, von einer Pruefung, die nicht
|
|
75
|
+
meldet, nicht zu unterscheiden: Beides sieht aus wie eine gescheiterte Sonde.
|
|
76
|
+
"""
|
|
77
|
+
h = hashlib.sha256()
|
|
78
|
+
for dirpath, dirnames, filenames in os.walk(root):
|
|
79
|
+
dirnames[:] = sorted(d for d in dirnames if d != "__pycache__")
|
|
80
|
+
for fn in sorted(filenames):
|
|
81
|
+
pfad = os.path.join(dirpath, fn)
|
|
82
|
+
h.update(os.path.relpath(pfad, root).encode("utf-8", "replace"))
|
|
83
|
+
try:
|
|
84
|
+
with open(pfad, "rb") as fh:
|
|
85
|
+
h.update(fh.read())
|
|
86
|
+
except OSError:
|
|
87
|
+
pass
|
|
88
|
+
return h.hexdigest()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def unterprozess(argv: list, **kw):
|
|
92
|
+
"""Unterprozess mit fester Kodierung auf beiden Seiten.
|
|
93
|
+
|
|
94
|
+
Ohne beides haengt das Ergebnis von der aufrufenden Umgebung ab: Der Kindprozess
|
|
95
|
+
schreibt unter Windows in der Konsolenkodierung, solange PYTHONIOENCODING nicht
|
|
96
|
+
gesetzt ist, und diese Seite dekodiert mit der Locale-Vorgabe, solange encoding
|
|
97
|
+
fehlt. Ein Diagnosetext mit Umlaut kommt dann veraendert zurueck und trifft keinen
|
|
98
|
+
Suchtext mehr.
|
|
99
|
+
|
|
100
|
+
Bei einer Sonde faellt das auf - sie sucht den Text und meldet, dass er fehlt. Bei
|
|
101
|
+
einer Gegenprobe nicht: Ein zerschossener Text ist abwesend, die Gegenprobe besteht
|
|
102
|
+
klaglos, und niemand erfaehrt etwas. Genau der Befundtyp, gegen den D-23 gebaut ist.
|
|
103
|
+
|
|
104
|
+
Aufgefallen am 2026-09-12: Derselbe Sondenlauf wurde mit PYTHONIOENCODING=utf-8 in
|
|
105
|
+
der Elternumgebung rot und ohne sie gruen - also gerade bei der Konfiguration, die
|
|
106
|
+
fuer Unterprozesse empfohlen ist. Von 28 Aufrufen der generischen Runner trug
|
|
107
|
+
genau einer einen Suchtext mit Umlaut; die uebrigen 27 warteten darauf
|
|
108
|
+
(CR-2026-049, D-49).
|
|
109
|
+
|
|
110
|
+
Diese Funktion ist deshalb der einzige Weg, auf dem dieses Skript einen Prozess
|
|
111
|
+
startet. Zwei Aufrufe trugen die Korrektur, fuenf nicht - das war kein Muster,
|
|
112
|
+
sondern die Reihenfolge ihrer Entstehung.
|
|
113
|
+
"""
|
|
114
|
+
kodierung = kw.pop("kodierung", "utf-8")
|
|
115
|
+
umgebung = dict(kw.pop("env", None) or os.environ, PYTHONIOENCODING=kodierung)
|
|
116
|
+
return subprocess.run(argv, capture_output=True, text=True, encoding=kodierung,
|
|
117
|
+
errors="replace", env=umgebung, **kw)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def lauf(root: str) -> str:
|
|
121
|
+
p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
|
|
122
|
+
"--root", root])
|
|
123
|
+
return (p.stdout or "") + (p.stderr or "")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def lies(pfad: str) -> str:
|
|
127
|
+
return io.open(pfad, encoding="utf-8", newline="").read()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def schreib(pfad: str, text: str) -> None:
|
|
131
|
+
io.open(pfad, "w", encoding="utf-8", newline="").write(text)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class Praeparationsfehler(Exception):
|
|
135
|
+
"""Ein Suchtext einer Praeparation trifft nicht (mehr) - CR-2026-060, D-74.
|
|
136
|
+
|
|
137
|
+
Der Unterschied zu einem gewoehnlichen Fehlschlag ist die Zurechnung: Hier hat die
|
|
138
|
+
SONDE ihren Gegenstand verloren, nicht die Pruefung ihre Wirkung. Beides sah bis
|
|
139
|
+
0.37.0 gleich aus, und bei einer mehrteiligen Praeparation sah es sogar aus wie ein
|
|
140
|
+
echter Befund im Repositorium.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def ersetzt(text: str, *paare, quelle: str = "") -> str:
|
|
145
|
+
"""Textersetzungen mit geprueften Trefferzahlen - jede einzeln.
|
|
146
|
+
|
|
147
|
+
Ein Paar ist (alt, neu) oder (alt, neu, anzahl); die Voreinstellung ist genau ein
|
|
148
|
+
Treffer. Weicht die tatsaechliche Zahl ab, wird NICHTS ersetzt und der Aufruf
|
|
149
|
+
scheitert mit dem Suchtext, der nicht mehr passt.
|
|
150
|
+
|
|
151
|
+
WARUM DAS NOETIG IST: baumhash() ist ein Alles-oder-nichts-Waechter. Bei n
|
|
152
|
+
Ersetzungen belegt er "mindestens eine hat gegriffen", nie "alle". Am 2026-09-13
|
|
153
|
+
wurde das gemessen: Auf einem Baum mit einem zwanzigsten Grenzfall traf die erste
|
|
154
|
+
Ersetzung der Gegenprobe 30 nicht, die zweite schon - der Baum aenderte sich, die
|
|
155
|
+
Gegenprobe lief und fiel mit "21 Grenzfallzeilen, der Steckbrief nennt 20". Wer das
|
|
156
|
+
liest, sucht den Fehler in EDGE_CASES.md. Dort ist keiner.
|
|
157
|
+
|
|
158
|
+
WAS SIE NICHT LEISTET: Sie deckt den Suchtext, nicht die Absicht. Eine Ersetzung,
|
|
159
|
+
die trifft und das Falsche tut, findet sie nicht.
|
|
160
|
+
"""
|
|
161
|
+
for paar in paare:
|
|
162
|
+
alt, neu = paar[0], paar[1]
|
|
163
|
+
anzahl = paar[2] if len(paar) > 2 else 1
|
|
164
|
+
tatsaechlich = text.count(alt)
|
|
165
|
+
if tatsaechlich != anzahl:
|
|
166
|
+
raise Praeparationsfehler(
|
|
167
|
+
"%sSuchtext trifft %dx statt %dx: %r"
|
|
168
|
+
% (quelle + ": " if quelle else "", tatsaechlich, anzahl, alt[:70]))
|
|
169
|
+
text = text.replace(alt, neu, anzahl)
|
|
170
|
+
return text
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def ersetze(pfad: str, *paare) -> None:
|
|
174
|
+
"""ersetzt() auf einer Datei - lesen, alle Paare pruefen, dann erst schreiben."""
|
|
175
|
+
schreib(pfad, ersetzt(lies(pfad), *paare, quelle=os.path.basename(pfad)))
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def zeile_nach(pfad: str, anker: str, neu: str) -> None:
|
|
179
|
+
"""Eine Zeile hinter die eine Zeile einfuegen, die mit `anker` beginnt.
|
|
180
|
+
|
|
181
|
+
Der Anker muss genau einmal am Zeilenanfang stehen; sonst ist nicht entschieden,
|
|
182
|
+
wohin eingefuegt wuerde, und die Praeparation scheitert statt zu raten.
|
|
183
|
+
"""
|
|
184
|
+
zeilen = lies(pfad).split("\r\n")
|
|
185
|
+
treffer = [i for i, z in enumerate(zeilen) if z.startswith(anker)]
|
|
186
|
+
if len(treffer) != 1:
|
|
187
|
+
raise Praeparationsfehler(
|
|
188
|
+
"%s: Anker %r steht %dx am Zeilenanfang, erwartet genau einmal"
|
|
189
|
+
% (os.path.basename(pfad), anker, len(treffer)))
|
|
190
|
+
zeilen.insert(treffer[0] + 1, neu)
|
|
191
|
+
schreib(pfad, "\r\n".join(zeilen))
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def frei(pfad: str, *kennungen: str) -> None:
|
|
195
|
+
"""Eine synthetische Kennung darf im Zieldokument noch nicht vergeben sein.
|
|
196
|
+
|
|
197
|
+
Am 2026-09-13 trug die Gegenprobe 30 als synthetische Kennung ausgerechnet G-18 -
|
|
198
|
+
dieselbe, die 0.36.0 wirklich vergeben hat. Die Falle stand in der Uebergabe
|
|
199
|
+
benannt, und sie ist trotzdem zugeschnappt; eine benannte Falle, in die man zweimal
|
|
200
|
+
tritt, gehoert in den Code (CR-2026-060 E3).
|
|
201
|
+
|
|
202
|
+
Der Waechter prueft Abwesenheit, nicht Eignung: Er ist genau so klug wie die
|
|
203
|
+
Kennung, die man ihm gibt.
|
|
204
|
+
|
|
205
|
+
NICHT als Vergabe zaehlt die Zeile, die eine Kennung ausdruecklich als synthetisch
|
|
206
|
+
und nie vergeben AUSWEIST (Decision Log, Ausnahmemenge von Pruefung 50). Ohne diese
|
|
207
|
+
Trennung haette der Absatz, der die synthetischen Kennungen schuetzt, sie fuer
|
|
208
|
+
diesen Waechter zu vergebenen gemacht - gemessen am 2026-09-18 an Gegenprobe 46b.
|
|
209
|
+
"""
|
|
210
|
+
text = "\n".join(z for z in lies(pfad).splitlines()
|
|
211
|
+
if not z.lstrip().startswith("**Belegte synthetische Kennungen"))
|
|
212
|
+
for kennung in kennungen:
|
|
213
|
+
if kennung in text:
|
|
214
|
+
raise Praeparationsfehler(
|
|
215
|
+
"%s: Die synthetische Kennung %r ist dort bereits vergeben. Eine "
|
|
216
|
+
"Gegenprobe, die eine echte Kennung doppelt, misst nicht mehr ihren "
|
|
217
|
+
"Fall - eine neue synthetische Kennung waehlen"
|
|
218
|
+
% (os.path.basename(pfad), kennung))
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# --- Der Ausfuehrungsplan: erst anmelden, dann fahren -----------------------------
|
|
222
|
+
#
|
|
223
|
+
# Bis 0.45.0 lief jede Sonde in dem Augenblick, in dem der Auslegeteil dieser Datei ihre
|
|
224
|
+
# Zeile erreichte: alle Einheiten streng nacheinander, jede mit einer eigenen Kopie des
|
|
225
|
+
# Repositoriums und mindestens einem Validatorlauf darauf. Seit 0.46.0 melden sonde(),
|
|
226
|
+
# sonde_ohne_wert(), gegenprobe() und buendel() ihre Einheit nur noch an; gefahren wird
|
|
227
|
+
# am Ende, auf mehreren Bahnen (CR-2026-068, D-94 bis D-96).
|
|
228
|
+
#
|
|
229
|
+
# DREI ZUSAGEN, die dieser Umbau halten muss - alle drei waren hier schon einmal teuer:
|
|
230
|
+
#
|
|
231
|
+
# 1. DIE SCHREIBWEISE BLEIBT. Pruefung 40 rechnet die Sondenmenge aus zwei woertlichen
|
|
232
|
+
# Mustern dieser Datei aus: dem Aufruf `sonde(` mit seiner Kennung und `melde(` mit
|
|
233
|
+
# der Art SONDE und ihr. Ein Umbau auf ein Register mit eigener Schreibweise haette
|
|
234
|
+
# die Sonden fuer Pruefung 40 unsichtbar gemacht - und die Pruefung haette leise
|
|
235
|
+
# bestanden, weil eine leere Menge keine Abweichung ist. Beide Muster stehen
|
|
236
|
+
# deshalb unveraendert an ihren Aufrufstellen; geaendert hat sich allein, WANN der
|
|
237
|
+
# Aufruf seine Arbeit tut.
|
|
238
|
+
# 2. DIE AUSGABE BLEIBT ZEILENGLEICH. D-49 nimmt den Lauf in beiden
|
|
239
|
+
# Kodierungsumgebungen ab, und zwar zeilenweise. Eine nebenlaeufige Einheit
|
|
240
|
+
# schreibt deshalb nicht selbst auf die Standardausgabe, sondern sammelt ihre
|
|
241
|
+
# Zeilen; ausgegeben werden sie in der Reihenfolge der ANMELDUNG, nicht in der der
|
|
242
|
+
# Fertigstellung. Die Laufzeiten stehen unterhalb der Trennlinie und sind
|
|
243
|
+
# ausdruecklich nicht Teil dieses Vergleichs - eine Laufzeit ist nie zweimal
|
|
244
|
+
# dieselbe, und eine Abnahmeform, die einen Filter braucht, ist keine mehr.
|
|
245
|
+
# 3. EIN BUENDEL IST DIE KLEINSTE EINHEIT, NIE SEINE TEILE. Seine Faelle bauen
|
|
246
|
+
# aufeinander auf: eine Installation, Schritt fuer Schritt praepariert und wieder
|
|
247
|
+
# zurueckgesetzt. INNERHALB eines Buendels bleibt es streng seriell; nebenlaeufig
|
|
248
|
+
# sind allein die Einheiten gegeneinander.
|
|
249
|
+
|
|
250
|
+
EINHEITEN = []
|
|
251
|
+
_ORT = threading.local()
|
|
252
|
+
|
|
253
|
+
SATZ_MIN = 5
|
|
254
|
+
SATZ_MAX = 30
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def worte(satz: str) -> int:
|
|
258
|
+
return len(satz.split())
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def zahl(wert: float) -> str:
|
|
262
|
+
"""Eine Zahl mit einer Nachkommastelle und Dezimalkomma - deutsch wie der Rest."""
|
|
263
|
+
return ("%.1f" % wert).replace(".", ",")
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def kurz(satz: str, breite: int) -> str:
|
|
267
|
+
return satz if len(satz) <= breite else satz[:breite - 3] + "..."
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
class Einheit:
|
|
271
|
+
"""Eine Sonde, eine Gegenprobe oder ein Buendel - mit Name, Satz und Laufzeit.
|
|
272
|
+
|
|
273
|
+
`kennung` ist der Name: bei einer Einzelsonde ihre Pruefungsnummer, bei einem
|
|
274
|
+
Buendel der Name seiner Funktion. `satz` ist der Beschreibungssatz, den die
|
|
275
|
+
Selbstprobe B1 nachzaehlt.
|
|
276
|
+
"""
|
|
277
|
+
|
|
278
|
+
def __init__(self, art: str, kennung: str, satz: str, arbeit) -> None:
|
|
279
|
+
self.art = art
|
|
280
|
+
self.kennung = kennung
|
|
281
|
+
self.satz = satz
|
|
282
|
+
self.arbeit = arbeit
|
|
283
|
+
self.zeilen = []
|
|
284
|
+
self.fehler = 0
|
|
285
|
+
self.dauer = 0.0
|
|
286
|
+
|
|
287
|
+
def eintrag(self, art: str, kennung: str, ok: bool, was: str) -> None:
|
|
288
|
+
if not ok:
|
|
289
|
+
self.fehler += 1
|
|
290
|
+
self.zeilen.append(f"{art:10s} {kennung:4s} {'OK ' if ok else 'FEHL'} {was}")
|
|
291
|
+
|
|
292
|
+
def anmerkung(self, *teile) -> None:
|
|
293
|
+
self.zeilen.append(" ".join(str(t) for t in teile))
|
|
294
|
+
|
|
295
|
+
def fahren(self) -> None:
|
|
296
|
+
"""Die Einheit fahren und dabei ihre Laufzeit nehmen.
|
|
297
|
+
|
|
298
|
+
Ein unerwarteter Fehler bricht nicht den ganzen Lauf ab, sondern faellt dieser
|
|
299
|
+
einen Einheit zur Last - mit Rueckverfolgung in den Anmerkungen. Der Grund ist
|
|
300
|
+
derselbe wie bei buendel(): Ein Abbruch, der 127 ungefahrene Einheiten
|
|
301
|
+
mitnimmt, verbirgt mehr, als er zeigt.
|
|
302
|
+
"""
|
|
303
|
+
_ORT.einheit = self
|
|
304
|
+
beginn = time.perf_counter()
|
|
305
|
+
try:
|
|
306
|
+
self.arbeit()
|
|
307
|
+
except Exception as exc: # absichtlich breit - siehe Kopfkommentar
|
|
308
|
+
self.eintrag(self.art, self.kennung, False,
|
|
309
|
+
"Abbruch der Einheit: %s: %s" % (type(exc).__name__, exc))
|
|
310
|
+
self.anmerkung(" " + traceback.format_exc().rstrip().replace(
|
|
311
|
+
"\n", "\n "))
|
|
312
|
+
finally:
|
|
313
|
+
self.dauer = time.perf_counter() - beginn
|
|
314
|
+
_ORT.einheit = None
|
|
315
|
+
|
|
316
|
+
def ausgeben(self) -> None:
|
|
317
|
+
# 🔴 KODIERUNGSFEST, UND DER ANLASS IST GEMESSEN (2026-09-19, CR-2026-092):
|
|
318
|
+
# Bricht eine Praeparation, nennt die Meldung ihren Suchtext - und der stammt
|
|
319
|
+
# aus einem Traeger mit echten Sonderzeichen. In der cp1252-Umgebung, die D-49
|
|
320
|
+
# ausdruecklich verlangt, hat ein einziges '→' den GANZEN Lauf mit einem
|
|
321
|
+
# UnicodeEncodeError abgebrochen, nach 53 von 61 Pruefungen. Der Apparat konnte
|
|
322
|
+
# seinen eigenen Befund dort nicht berichten.
|
|
323
|
+
for zeile in self.zeilen:
|
|
324
|
+
try:
|
|
325
|
+
print(zeile)
|
|
326
|
+
except UnicodeEncodeError:
|
|
327
|
+
kodierung = getattr(sys.stdout, "encoding", None) or "ascii"
|
|
328
|
+
print(zeile.encode(kodierung, "backslashreplace").decode(kodierung))
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def eintragen(art: str, kennung: str, satz: str, arbeit) -> None:
|
|
332
|
+
"""Eine Einheit in den Ausfuehrungsplan aufnehmen, statt sie sofort zu fahren."""
|
|
333
|
+
EINHEITEN.append(Einheit(art, kennung, satz, arbeit))
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def melde(art: str, nummer: str, ok: bool, was: str) -> None:
|
|
337
|
+
"""Eine Ergebniszeile - sie geht in die Sammlung der gerade laufenden Einheit."""
|
|
338
|
+
_ORT.einheit.eintrag(art, nummer, ok, was)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def notiz(*teile) -> None:
|
|
342
|
+
"""Eine Erlaeuterungszeile unter einer Ergebniszeile.
|
|
343
|
+
|
|
344
|
+
Sie steht an der Stelle, an der bis 0.45.0 print() stand. Der Unterschied zaehlt
|
|
345
|
+
erst seit der Nebenlaeufigkeit: print() schriebe sofort und mitten in die Zeilen
|
|
346
|
+
einer anderen Einheit hinein, und die Ausgabe waere nicht mehr zeilengleich
|
|
347
|
+
reproduzierbar - der Lauf haette seine Abnahmeform verloren (D-49).
|
|
348
|
+
"""
|
|
349
|
+
_ORT.einheit.anmerkung(*teile)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
AUFRAEUM_VERSUCHE = 3
|
|
353
|
+
AUFRAEUM_PAUSE = 0.5
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def schreibschutz_loesen(pfad: str) -> None:
|
|
357
|
+
"""Den Schreibschutz im ganzen Baum wegnehmen - leise, Datei fuer Datei.
|
|
358
|
+
|
|
359
|
+
Sie meldet nichts: Ob das Loesen gelingt, ist nicht die Frage; die Frage ist, ob
|
|
360
|
+
danach geloescht werden kann, und die beantwortet der naechste Loeschversuch. Eine
|
|
361
|
+
Meldung von hier wuerde derselben Stoerung zwei Zeilen geben.
|
|
362
|
+
|
|
363
|
+
Bewusst ohne onerror/onexc von shutil.rmtree: Die beiden Namen haben sich zwischen
|
|
364
|
+
den Python-Fassungen abgeloest, und ein Nachweiswerkzeug, das an der Fassung seines
|
|
365
|
+
Interpreters haengt, ist genau das, was D-49 abgeschafft hat.
|
|
366
|
+
"""
|
|
367
|
+
for wurzel, verzeichnisse, dateien in os.walk(pfad):
|
|
368
|
+
for name in verzeichnisse + dateien:
|
|
369
|
+
try:
|
|
370
|
+
os.chmod(os.path.join(wurzel, name), stat.S_IWRITE | stat.S_IREAD)
|
|
371
|
+
except OSError:
|
|
372
|
+
pass
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def aufraeumen(pfad: str) -> None:
|
|
376
|
+
"""Ein Arbeitsverzeichnis loeschen - und das Scheitern MELDEN, nicht verschlucken.
|
|
377
|
+
|
|
378
|
+
Bis 0.45.0 stand an den vierzehn Aufraeumstellen dieses Skripts
|
|
379
|
+
`shutil.rmtree(..., ignore_errors=True)`. Das ist der Befundtyp, gegen den dieses
|
|
380
|
+
Repositorium gebaut ist: eine Zusage - "gearbeitet wird auf einer Kopie; das
|
|
381
|
+
Repositorium selbst bleibt unberuehrt" - mit einem Ausfallpfad, der nichts sagt. Ein
|
|
382
|
+
Lauf, der fuer jede Einheit ein eigenes Arbeitsverzeichnis anlegt und einige davon
|
|
383
|
+
liegen laesst, sah genau so aus wie einer, der aufgeraeumt hat - und die Platte
|
|
384
|
+
fuellte sich stumm.
|
|
385
|
+
|
|
386
|
+
WARUM DREI VERSUCHE UND NICHT EINER: Unter Windows haelt ein gerade beendeter
|
|
387
|
+
Unterprozess - oder ein Virenscanner, der ihm nachsieht - eine Datei noch einen
|
|
388
|
+
Augenblick fest. Ein einziger Versuch meldete dann eine Stoerung, die eine halbe
|
|
389
|
+
Sekunde spaeter keine mehr ist; und eine Meldung, die auch ohne Anlass kommt, wird
|
|
390
|
+
binnen eines Releases abgeschaltet.
|
|
391
|
+
|
|
392
|
+
WARUM AUSSERDEM DER SCHREIBSCHUTZ FAELLT (0.47.0): Warten hilft gegen eine gehaltene
|
|
393
|
+
Datei und **gar nichts** gegen eine schreibgeschuetzte. Gemessen am 2026-09-15, beim
|
|
394
|
+
ersten echten Fall dieses Aufraeumers: Die Sonde zu Pruefung 45 legt ein
|
|
395
|
+
Repositorium an, git schreibt seine Objektdateien schreibgeschuetzt, und drei
|
|
396
|
+
Versuche ueber anderthalb Sekunden endeten dreimal mit demselben
|
|
397
|
+
"[WinError 5] Zugriff verweigert". **Der Aufraeumer hatte recht und war trotzdem
|
|
398
|
+
nutzlos** - er meldete einen Zustand, den er selbst haette aufloesen koennen. Seit
|
|
399
|
+
diesem Release nimmt jeder Versuch ab dem zweiten zuerst den Schreibschutz weg.
|
|
400
|
+
|
|
401
|
+
WAS SIE NICHT LEISTET: Sie raeumt auf, was ihr genannt wird. Ein Verzeichnis, dessen
|
|
402
|
+
Pfad niemand weitergibt, bleibt liegen und wird von ihr nicht vermisst.
|
|
403
|
+
"""
|
|
404
|
+
letzter = None
|
|
405
|
+
for _ in range(AUFRAEUM_VERSUCHE):
|
|
406
|
+
if not os.path.isdir(pfad):
|
|
407
|
+
return
|
|
408
|
+
try:
|
|
409
|
+
shutil.rmtree(pfad)
|
|
410
|
+
return
|
|
411
|
+
except OSError as exc:
|
|
412
|
+
letzter = exc
|
|
413
|
+
schreibschutz_loesen(pfad)
|
|
414
|
+
time.sleep(AUFRAEUM_PAUSE)
|
|
415
|
+
if not os.path.isdir(pfad):
|
|
416
|
+
return
|
|
417
|
+
einheit = getattr(_ORT, "einheit", None)
|
|
418
|
+
melde("AUFRAEUMER", "-", False,
|
|
419
|
+
"%s: %s bleibt liegen" % (einheit.kennung if einheit else "-", pfad))
|
|
420
|
+
notiz(" " + str(letzter))
|
|
421
|
+
notiz(" %d Versuche ueber %s s, danach aufgegeben."
|
|
422
|
+
% (AUFRAEUM_VERSUCHE,
|
|
423
|
+
zahl(AUFRAEUM_VERSUCHE * AUFRAEUM_PAUSE)))
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def buendel(fn, satz: str) -> None:
|
|
427
|
+
"""Eine Funktion, die mehrere Sonden in EINER Installation faehrt.
|
|
428
|
+
|
|
429
|
+
Diese Funktionen melden selbst ueber melde() und haben deshalb keinen
|
|
430
|
+
baumhash-Waechter. Faellt eine ihrer Praeparationen aus, bricht das Buendel hier ab:
|
|
431
|
+
laut, mit dem Suchtext, und ohne dass der Rest als bestanden erscheint
|
|
432
|
+
(CR-2026-060 E2).
|
|
433
|
+
|
|
434
|
+
Der Beschreibungssatz ist seit 0.46.0 Pflicht und steht als Kopfzeile ueber den
|
|
435
|
+
Zeilen des Buendels. Bis dahin hatte jede Einzelsonde einen erklaerenden Text und
|
|
436
|
+
das Buendel keinen - man sah eine Folge von Meldungen und nicht, was sie zusammen
|
|
437
|
+
belegen sollten.
|
|
438
|
+
"""
|
|
439
|
+
def arbeit() -> None:
|
|
440
|
+
notiz("BUENDEL %s - %s" % (fn.__name__, satz))
|
|
441
|
+
try:
|
|
442
|
+
fn()
|
|
443
|
+
except Praeparationsfehler as exc:
|
|
444
|
+
melde("BUENDEL", "-", False, fn.__name__ + " [Praeparation gebrochen]")
|
|
445
|
+
notiz(" " + str(exc))
|
|
446
|
+
notiz(" Gemessen wurde nichts - der Rest des Buendels ist nicht gelaufen.")
|
|
447
|
+
|
|
448
|
+
eintragen("BUENDEL", fn.__name__, satz, arbeit)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def sonde(nummer: str, was: str, praeparieren, erwartet: str) -> None:
|
|
452
|
+
def arbeit() -> None:
|
|
453
|
+
root = kopie()
|
|
454
|
+
try:
|
|
455
|
+
vorher = baumhash(root)
|
|
456
|
+
try:
|
|
457
|
+
praeparieren(root)
|
|
458
|
+
except Praeparationsfehler as exc:
|
|
459
|
+
melde("SONDE", nummer, False, was + " [Praeparation gebrochen]")
|
|
460
|
+
notiz(" " + str(exc))
|
|
461
|
+
return
|
|
462
|
+
if baumhash(root) == vorher:
|
|
463
|
+
melde("SONDE", nummer, False, was + " [nichts praepariert]")
|
|
464
|
+
notiz(" Der Baum ist unveraendert - vermutlich passt der Suchtext "
|
|
465
|
+
"der Sonde nicht mehr. Gemessen wuerde sonst die Sonde, nicht die Pruefung.")
|
|
466
|
+
return
|
|
467
|
+
ausgabe = lauf(root)
|
|
468
|
+
melde("SONDE", nummer, erwartet in ausgabe, was)
|
|
469
|
+
if erwartet not in ausgabe:
|
|
470
|
+
notiz(" Ausgabe:", " | ".join(ausgabe.splitlines()[:6]))
|
|
471
|
+
finally:
|
|
472
|
+
aufraeumen(os.path.dirname(root))
|
|
473
|
+
|
|
474
|
+
eintragen("SONDE", nummer, was, arbeit)
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def fehlerfrei(ausgabe: str) -> bool:
|
|
478
|
+
"""Endet der Validatorlauf ohne Fehler? Gelesen an der Ergebniszeile.
|
|
479
|
+
|
|
480
|
+
Bis 1.21.0 stand hier `"0 Fehler" in ausgabe` - das trifft auch "10 Fehler" und
|
|
481
|
+
"20 Fehler". Gemessen am 2026-09-30: Die Gegenprobe zu Pruefung 112 bestand an einem
|
|
482
|
+
Baum mit zehn offenen Fehlern (D-522). Sonde 112f haelt die Unterscheidung fest."""
|
|
483
|
+
return "Ergebnis: 0 Fehler," in ausgabe
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def gegenprobe(nummer: str, was: str, praeparieren, verboten: str) -> None:
|
|
487
|
+
def arbeit() -> None:
|
|
488
|
+
root = kopie()
|
|
489
|
+
try:
|
|
490
|
+
if praeparieren:
|
|
491
|
+
vorher = baumhash(root)
|
|
492
|
+
try:
|
|
493
|
+
praeparieren(root)
|
|
494
|
+
except Praeparationsfehler as exc:
|
|
495
|
+
melde("GEGENPROBE", nummer, False,
|
|
496
|
+
was + " [Praeparation gebrochen]")
|
|
497
|
+
notiz(" " + str(exc))
|
|
498
|
+
return
|
|
499
|
+
if baumhash(root) == vorher:
|
|
500
|
+
melde("GEGENPROBE", nummer, False, was + " [nichts praepariert]")
|
|
501
|
+
return
|
|
502
|
+
ausgabe = lauf(root)
|
|
503
|
+
ok = verboten not in ausgabe and fehlerfrei(ausgabe)
|
|
504
|
+
melde("GEGENPROBE", nummer, ok, was)
|
|
505
|
+
if not ok:
|
|
506
|
+
notiz(" Ausgabe:", " | ".join(ausgabe.splitlines()[:6]))
|
|
507
|
+
finally:
|
|
508
|
+
aufraeumen(os.path.dirname(root))
|
|
509
|
+
|
|
510
|
+
eintragen("GEGENPROBE", nummer, was, arbeit)
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
P = lambda root, *teile: os.path.join(root, *teile)
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def installation(pack: str) -> str:
|
|
517
|
+
"""Frische Installation eines Packs samt Kern - das Ziel der Aktivierungspruefung."""
|
|
518
|
+
ziel = tempfile.mkdtemp(prefix="lw-inst-")
|
|
519
|
+
root = os.path.join(ziel, "projekt")
|
|
520
|
+
os.makedirs(root)
|
|
521
|
+
unterprozess([sys.executable, os.path.join(QUELLE, ".koolie/core", "install.py"),
|
|
522
|
+
"--client", pack, "--root", root])
|
|
523
|
+
shutil.copytree(os.path.join(QUELLE, ".koolie/core"),
|
|
524
|
+
os.path.join(root, ".koolie/core"),
|
|
525
|
+
ignore=shutil.ignore_patterns(".git", "__pycache__", "out"))
|
|
526
|
+
return root
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
def strict_ausgabe(root: str) -> str:
|
|
530
|
+
"""Ausgabe der Aktivierungspruefung.
|
|
531
|
+
|
|
532
|
+
Die Kodierung besorgt unterprozess(); dort steht auch, warum sie noetig ist.
|
|
533
|
+
"""
|
|
534
|
+
p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
|
|
535
|
+
"--root", root, "--strict-overlay"])
|
|
536
|
+
return (p.stdout or "") + (p.stderr or "")
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
def validator_ausgabe(root: str) -> str:
|
|
541
|
+
"""Ausgabe eines gewoehnlichen Validatorlaufs gegen eine Installation."""
|
|
542
|
+
p = unterprozess([sys.executable, os.path.join(root, *VALIDATOR.split("/")),
|
|
543
|
+
"--root", root])
|
|
544
|
+
return (p.stdout or "") + (p.stderr or "")
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def _p(root, rel):
|
|
548
|
+
return P(root, rel.replace("/", os.sep))
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
# --- Der Filter: eine Schleife ist kein Abnahmelauf (D-191) -----------------------
|
|
552
|
+
#
|
|
553
|
+
# ANLASS. Der Lauf faehrt 237 Einheiten, jede mit eigener Kopie des Repositoriums und
|
|
554
|
+
# eigenem Validatorlauf - rund 2300 s Rechenzeit, und zweimal je Release (D-49). Wer
|
|
555
|
+
# eine einzelne Pruefung aendert, bezahlte bis 0.68.0 den ganzen Apparat, um eine
|
|
556
|
+
# Meldung zu sehen. Ein Werkzeug, das vor jedem Schritt fuenf Minuten kostet, wird
|
|
557
|
+
# seltener gefahren, als es soll.
|
|
558
|
+
#
|
|
559
|
+
# 🔴 DIE GEFAHR IST NICHT DIE GESCHWINDIGKEIT, SONDERN DIE VERWECHSLUNG. Ein Teillauf,
|
|
560
|
+
# der aussieht wie ein Abnahmelauf, ist die Bauform "die Null durch Konstruktion"
|
|
561
|
+
# (0.59.1): gruen, weil nichts gefahren wurde. Deshalb sagt der Teillauf es dreimal -
|
|
562
|
+
# im Kopf, in der Ergebniszeile und im Abschlusssatz - und D-23 bleibt unberuehrt: Die
|
|
563
|
+
# Sonde existiert weiter, gekuerzt wird die SCHLEIFE, nicht der Nachweis.
|
|
564
|
+
def waehle(einheiten: list, nur: list) -> list:
|
|
565
|
+
"""Die Einheiten, deren Kennung mit einer der genannten Marken beginnt.
|
|
566
|
+
|
|
567
|
+
`--nur 44` nimmt 44a bis 44f, `--nur 62,48b` nimmt beide Blocke der Pruefung 62 und
|
|
568
|
+
genau eine Gegenprobe. Verglichen wird kleingeschrieben und am ANFANG der Kennung:
|
|
569
|
+
Eine Marke, die nichts trifft, ist ein Abbruch und kein leerer Lauf - sonst meldete
|
|
570
|
+
ein Tippfehler "alle bestanden".
|
|
571
|
+
"""
|
|
572
|
+
if not nur:
|
|
573
|
+
return list(einheiten)
|
|
574
|
+
gewaehlt, ohne_treffer = [], []
|
|
575
|
+
for marke in nur:
|
|
576
|
+
treffer = [e for e in einheiten if e.kennung.lower().startswith(marke)]
|
|
577
|
+
if not treffer:
|
|
578
|
+
ohne_treffer.append(marke)
|
|
579
|
+
for e in treffer:
|
|
580
|
+
if e not in gewaehlt:
|
|
581
|
+
gewaehlt.append(e)
|
|
582
|
+
if ohne_treffer:
|
|
583
|
+
sys.exit("--nur: keine Einheit zu %s (bekannt: %s ... ; --liste zeigt alle)"
|
|
584
|
+
% (", ".join(ohne_treffer),
|
|
585
|
+
", ".join(e.kennung for e in einheiten[:6])))
|
|
586
|
+
return [e for e in einheiten if e in gewaehlt]
|
|
587
|
+
|
|
588
|
+
# --- Der Laeufer ------------------------------------------------------------------
|
|
589
|
+
|
|
590
|
+
def bahnfolge(einheiten: list) -> list:
|
|
591
|
+
"""Reihenfolge der Einreichung - Buendel zuerst, danach wie angemeldet.
|
|
592
|
+
|
|
593
|
+
Die AUSGABE folgt der Anmeldereihenfolge; diese Folge hier bestimmt allein, welche
|
|
594
|
+
Einheit zuerst eine freie Bahn bekommt. Buendel sind die langen Stuecke - sie legen
|
|
595
|
+
echte Installationen an und fahren mehrere Validatorlaeufe nacheinander -, und ein
|
|
596
|
+
langes Stueck, das zuletzt beginnt, bestimmt allein das Ende des Laufs.
|
|
597
|
+
|
|
598
|
+
Sie ist fest und nicht gemessen: Eine Einreihung, die von der Laufzeit des letzten
|
|
599
|
+
Laufs abhinge, machte zwei Laeufe unvergleichbar und die Ausgabe von der Maschine
|
|
600
|
+
abhaengig.
|
|
601
|
+
"""
|
|
602
|
+
return ([e for e in einheiten if e.art == "BUENDEL"]
|
|
603
|
+
+ [e for e in einheiten if e.art != "BUENDEL"])
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
def fahren(einheiten: list, bahnen: int) -> int:
|
|
607
|
+
"""Alle Einheiten fahren; ausgegeben wird in der Reihenfolge der Anmeldung.
|
|
608
|
+
|
|
609
|
+
Der Unterschied zwischen beiden Zweigen ist die Laufzeit, nicht die Ausgabe: Bei
|
|
610
|
+
`--bahnen 1` faellt der Ausfuehrer weg, und die Einheiten laufen in genau der
|
|
611
|
+
Reihenfolge, in der sie in dieser Datei stehen. Dass beide Zweige dieselben Zeilen
|
|
612
|
+
erzeugen, ist die Zusage dieses Umbaus - der Wirkungsnachweis dazu steht im
|
|
613
|
+
Protokoll zu 0.46.0.
|
|
614
|
+
"""
|
|
615
|
+
if bahnen == 1:
|
|
616
|
+
for einheit in einheiten:
|
|
617
|
+
einheit.fahren()
|
|
618
|
+
einheit.ausgeben()
|
|
619
|
+
return sum(e.fehler for e in einheiten)
|
|
620
|
+
with ThreadPoolExecutor(max_workers=bahnen) as ausfuehrer:
|
|
621
|
+
auftraege = {id(e): ausfuehrer.submit(e.fahren) for e in bahnfolge(einheiten)}
|
|
622
|
+
for einheit in einheiten:
|
|
623
|
+
auftraege[id(einheit)].result()
|
|
624
|
+
einheit.ausgeben()
|
|
625
|
+
return sum(e.fehler for e in einheiten)
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
TRENNLINIE = ("--- Auswertung: Name und Laufzeit je Einheit, langsamste zuerst "
|
|
629
|
+
"(nicht Teil der zeilengleichen Abnahme nach D-49) ---")
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
def auswertung(einheiten: list, wanduhr: float, bahnen: int) -> None:
|
|
633
|
+
"""Die Laufzeiten - unterhalb der Trennlinie und ausserhalb der Abnahme.
|
|
634
|
+
|
|
635
|
+
Sie stehen hier und nicht in den Ergebniszeilen, weil D-49 den Lauf in beiden
|
|
636
|
+
Kodierungsumgebungen ZEILENGLEICH abnimmt. Eine Laufzeit ist nie zweimal dieselbe;
|
|
637
|
+
stuende sie in der Ergebniszeile, brauchte der Vergleich einen Filter - und eine
|
|
638
|
+
Abnahmeform, die einen Filter braucht, ist keine mehr.
|
|
639
|
+
|
|
640
|
+
Die Rechenzeit ist die Summe der Einzellaufzeiten, die Wanduhr die vergangene Zeit.
|
|
641
|
+
Ihr Verhaeltnis ist der einzige Messwert, der etwas ueber die Nebenlaeufigkeit sagt.
|
|
642
|
+
"""
|
|
643
|
+
print()
|
|
644
|
+
print(TRENNLINIE)
|
|
645
|
+
for einheit in sorted(einheiten, key=lambda e: e.dauer, reverse=True):
|
|
646
|
+
print("%8s s %-10s %-32s %s"
|
|
647
|
+
% (zahl(einheit.dauer), einheit.art, einheit.kennung,
|
|
648
|
+
kurz(einheit.satz, 44)))
|
|
649
|
+
rechenzeit = sum(e.dauer for e in einheiten)
|
|
650
|
+
print("Gesamt %s s Rechenzeit in %s s Wanduhr auf %d Bahn%s%s."
|
|
651
|
+
% (zahl(rechenzeit), zahl(wanduhr), bahnen, "" if bahnen == 1 else "en",
|
|
652
|
+
"" if bahnen == 1 or wanduhr <= 0
|
|
653
|
+
else " (Faktor %s)" % zahl(rechenzeit / wanduhr)))
|