@renoxar/koolie 1.25.0 → 2.0.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/.github/workflows/publish.yml +177 -0
- package/.koolie/QUELLREPOSITORIUM.md +9 -14
- package/.koolie/core/CHANGELOG.md +59 -0
- package/.koolie/core/LICENSE-HINWEIS.md +5 -6
- package/.koolie/core/OWNERS.md +2 -2
- package/.koolie/core/VERSION +1 -1
- package/.koolie/core/build/doc/00-kopf.md +6 -6
- package/.koolie/core/build/doc/01-executive-summary.md +8 -8
- package/.koolie/core/build/doc/03-ziele-nichtziele.md +2 -2
- package/.koolie/core/build/doc/04-geltungsbereich.md +4 -4
- package/.koolie/core/build/doc/05-glossar.md +3 -3
- package/.koolie/core/build/doc/07-architektur.md +2 -2
- package/.koolie/core/build/doc/07a-abbildungsschicht.md +9 -9
- package/.koolie/core/build/doc/08-trennung.md +3 -3
- package/.koolie/core/build/doc/09-betriebsmodi.md +8 -8
- package/.koolie/core/build/doc/15-referenzstruktur.md +56 -27
- package/.koolie/core/build/doc/16-agentenanweisung.md +2 -2
- package/.koolie/core/build/doc/20-referenz-skills.md +46 -46
- package/.koolie/core/build/doc/25-governance.md +9 -1
- package/.koolie/core/build/doc/26-qs-test.md +32 -3
- package/.koolie/core/build/doc/27-pilot.md +2 -2
- package/.koolie/core/build/doc/28-uebernahme.md +9 -1
- package/.koolie/core/build/doc/30-roadmap.md +3 -1
- package/.koolie/core/build/doc/31-anhaenge.md +1 -1
- package/.koolie/core/checklists/01-preflight.md +3 -3
- package/.koolie/core/checklists/02-privacy-context.md +1 -1
- package/.koolie/core/checklists/03-before-code-change.md +2 -2
- package/.koolie/core/checklists/04-review-ai-code.md +1 -1
- package/.koolie/core/checklists/05-testing.md +1 -1
- package/.koolie/core/checklists/06-security.md +1 -1
- package/.koolie/core/checklists/08-merge-request.md +1 -1
- package/.koolie/core/checklists/09-onboarding.md +2 -2
- package/.koolie/core/checklists/10-project-adoption.md +8 -8
- package/.koolie/core/checklists/11-framework-release.md +14 -14
- package/.koolie/core/clientmap.py +2 -2
- package/.koolie/core/clients/README.md +54 -52
- package/.koolie/core/clients/_template/CLIENT_PACK.md +19 -19
- package/.koolie/core/clients/claude-code/CLIENT_PACK.md +108 -164
- package/.koolie/core/clients/claude-code/manifest.json +5 -5
- package/.koolie/core/clients/claude-code/root-template/.claude/README.md +9 -9
- package/.koolie/core/clients/cursor/CLIENT_PACK.md +66 -60
- package/.koolie/core/clients/cursor/manifest.json +3 -3
- package/.koolie/core/clients/cursor/root-template/.cursor/README.md +3 -3
- package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +62 -64
- package/.koolie/core/clients/devin-desktop/manifest.json +5 -5
- package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +9 -9
- package/.koolie/core/clients/kiro/CLIENT_PACK.md +55 -48
- package/.koolie/core/clients/kiro/manifest.json +4 -4
- package/.koolie/core/clients/kiro/root-template/.kiro/README.md +3 -3
- package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +98 -103
- package/.koolie/core/clients/openai-codex/manifest.json +3 -3
- package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +2 -2
- package/.koolie/core/decision-trees/02-may-ai-do-task.md +2 -2
- package/.koolie/core/decision-trees/03-analyze-or-modify.md +12 -12
- package/.koolie/core/decision-trees/04-required-review.md +1 -1
- package/.koolie/core/docs/ADOPTION_GUIDE.md +281 -385
- package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +44 -36
- package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +8 -8
- package/.koolie/core/docs/ROADMAP.md +34 -17
- package/.koolie/core/docs/RUNTIME_GLOSSARY.md +34 -35
- package/.koolie/core/examples/example-ergebnisbericht.md +1 -1
- package/.koolie/core/examples/example-mr-description.md +2 -2
- package/.koolie/core/framework/core/00-principles.md +1 -1
- package/.koolie/core/framework/core/01-governance.md +8 -8
- package/.koolie/core/framework/core/02-privacy.md +12 -12
- package/.koolie/core/framework/core/03-security.md +13 -11
- package/.koolie/core/framework/core/05-working-model.md +22 -22
- package/.koolie/core/framework/core/06-prompting-rules.md +5 -5
- package/.koolie/core/framework/core/07-review-rules.md +1 -1
- package/.koolie/core/framework/core/08-skill-conventions.md +11 -11
- package/.koolie/core/framework/core/09-risk-model.md +6 -6
- package/.koolie/core/framework/core/10-error-escalation.md +1 -1
- package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +1 -1
- package/.koolie/core/framework/overlay-patterns/general.md +63 -75
- package/.koolie/core/framework/role-packs/README.md +16 -28
- package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +3 -3
- package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +23 -22
- package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +5 -5
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/EXAMPLES.md +5 -5
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/SKILL.md +9 -9
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/koolie-ticket/TESTS.md +22 -0
- package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +16 -16
- package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +1 -1
- package/.koolie/core/framework/runtime/agents/{fw-reviewer.md → koolie-reviewer.md} +2 -2
- package/.koolie/core/framework/runtime/permissions.json +13 -13
- package/.koolie/core/framework/runtime/root-instruction.md +5 -5
- package/.koolie/core/framework/runtime/rules/10-privacy-security.md +2 -2
- package/.koolie/core/framework/runtime/rules/15-development-rules.md +1 -1
- package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +1 -1
- package/.koolie/core/framework/runtime/rules/20-project-overlay.md +2 -2
- package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/EXAMPLES.md +8 -8
- package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/SKILL.md +21 -21
- package/.koolie/core/framework/skills/koolie-bugfix-prepare/TESTS.md +15 -0
- package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/EXAMPLES.md +6 -6
- package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/SKILL.md +12 -12
- package/.koolie/core/framework/skills/koolie-change-analyze/TESTS.md +16 -0
- package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/EXAMPLES.md +4 -4
- package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/SKILL.md +15 -15
- package/.koolie/core/framework/skills/koolie-change-small/TESTS.md +13 -0
- package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/EXAMPLES.md +4 -4
- package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/SKILL.md +10 -10
- package/.koolie/core/framework/skills/koolie-code-explain/TESTS.md +11 -0
- package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/EXAMPLES.md +3 -3
- package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/SKILL.md +8 -8
- package/.koolie/core/framework/skills/koolie-docs-update/TESTS.md +12 -0
- package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/EXAMPLES.md +6 -6
- package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/SKILL.md +15 -15
- package/.koolie/core/framework/skills/koolie-error-analyze/TESTS.md +12 -0
- package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/EXAMPLES.md +6 -6
- package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/SKILL.md +8 -8
- package/.koolie/core/framework/skills/koolie-mr-description/TESTS.md +12 -0
- package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/EXAMPLES.md +4 -4
- package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/SKILL.md +8 -8
- package/.koolie/core/framework/skills/koolie-overlay-pflege/TESTS.md +13 -0
- package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/EXAMPLES.md +7 -7
- package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/SKILL.md +14 -14
- package/.koolie/core/framework/skills/koolie-plan/TESTS.md +14 -0
- package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/EXAMPLES.md +4 -4
- package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/SKILL.md +12 -12
- package/.koolie/core/framework/skills/koolie-refactor/TESTS.md +14 -0
- package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/EXAMPLES.md +4 -4
- package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/SKILL.md +8 -8
- package/.koolie/core/framework/skills/koolie-repo-analyze/TESTS.md +11 -0
- package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/EXAMPLES.md +3 -3
- package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/SKILL.md +7 -7
- package/.koolie/core/framework/skills/koolie-review-support/TESTS.md +13 -0
- package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/CHANGELOG.md +2 -1
- package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/EXAMPLES.md +5 -5
- package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/SKILL.md +11 -11
- package/.koolie/core/framework/skills/koolie-tests/TESTS.md +12 -0
- package/.koolie/core/framework/tech-packs/README.md +2 -2
- package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +2 -2
- package/.koolie/core/governance/ADOPTION_REGISTRY.md +22 -58
- package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +1 -1
- package/.koolie/core/governance/DECISION_LOG.md +7 -1
- package/.koolie/core/governance/EXCEPTION_PROCESS.md +1 -1
- package/.koolie/core/governance/FEEDBACK_PROCESS.md +1 -1
- package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +64 -66
- package/.koolie/core/governance/PRIORITY_HIERARCHY.md +13 -13
- package/.koolie/core/governance/RACI.md +3 -3
- package/.koolie/core/governance/RELEASE_PROCESS.md +101 -108
- package/.koolie/core/governance/change-requests/CR-2026-173-oeffentlicher-auftritt-koolie-praefix.md +67 -0
- package/.koolie/core/install.py +99 -0
- package/.koolie/core/koexistenz.py +2 -2
- package/.koolie/core/onboarding/GUIDE.md +7 -7
- package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +1 -1
- package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +3 -3
- package/.koolie/core/onboarding/QUICKSTART.md +2 -2
- package/.koolie/core/onboarding/REFERENCE.md +14 -14
- package/.koolie/core/onboarding/exercises/EXERCISES.md +8 -8
- package/.koolie/core/onboarding/exercises/README.md +47 -65
- package/.koolie/core/pilot/PILOT_CONCEPT.md +1 -1
- package/.koolie/core/prompts/01-understand-codebase.md +11 -7
- package/.koolie/core/prompts/02-impact-analysis.md +17 -7
- package/.koolie/core/prompts/03-implementation-planning.md +10 -6
- package/.koolie/core/prompts/04-code-generation.md +11 -5
- package/.koolie/core/prompts/05-test-generation.md +13 -7
- package/.koolie/core/prompts/06-refactoring.md +14 -8
- package/.koolie/core/prompts/07-debugging.md +13 -11
- package/.koolie/core/prompts/08-security-review.md +2 -2
- package/.koolie/core/prompts/09-performance-analysis.md +2 -2
- package/.koolie/core/prompts/10-documentation.md +6 -4
- package/.koolie/core/prompts/11-merge-request-review.md +7 -5
- package/.koolie/core/prompts/12-developer-training.md +5 -3
- package/.koolie/core/prompts/README.md +17 -15
- package/.koolie/core/templates/MR_AI_DISCLOSURE.md +2 -2
- package/.koolie/core/templates/PLAN_TEMPLATE.md +2 -2
- package/.koolie/core/templates/SKILL_TEMPLATE.md +3 -3
- package/.koolie/core/templates/project-overlay/OVERLAY.md +28 -22
- package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +1 -1
- package/.koolie/core/tests/EDGE_CASES.md +4 -7
- package/.koolie/core/tests/TEST_CATALOG.md +33 -33
- package/.koolie/core/tests/protocols/2026-10-02-oeffentlicher-auftritt-2.0.0.md +42 -0
- package/.koolie/core/tests/scripts/hook-check-secrets.py +2 -2
- package/.koolie/core/tests/scripts/hook-overlay-status.py +1 -1
- package/.koolie/core/tests/scripts/probe-pruefungen.py +4 -2
- package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +7 -7
- package/.koolie/core/tests/scripts/pruefungen/bestand.py +20 -3
- package/.koolie/core/tests/scripts/pruefungen/dokumente.py +88 -0
- package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +1 -1
- package/.koolie/core/tests/scripts/pruefungen/hooks.py +1 -1
- package/.koolie/core/tests/scripts/pruefungen/overlay.py +5 -5
- package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +5 -5
- package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +81 -2
- package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +6 -6
- package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +11 -11
- package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +11 -11
- package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +4 -4
- package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +33 -33
- package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +3 -3
- package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +3 -3
- package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +3 -3
- package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +2 -2
- package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +1 -1
- package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +5 -5
- package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +33 -0
- package/.koolie/core/tests/scripts/sonden/teil19_skillnamen.py +97 -0
- package/.koolie/core/tests/scripts/sonden/teil20_kennungen.py +70 -0
- package/.koolie/core/tests/scripts/validate-framework.py +15 -6
- package/.koolie/core/tests/scripts/validate-output.py +1 -1
- package/CONTRIBUTING.md +16 -10
- package/QUICKSTART.en.md +44 -51
- package/QUICKSTART.md +44 -50
- package/package.json +2 -2
- package/paketquellen/README.md +11 -11
- package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +0 -22
- package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +0 -15
- package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +0 -16
- package/.koolie/core/framework/skills/fw-change-small/TESTS.md +0 -13
- package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +0 -11
- package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +0 -12
- package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +0 -12
- package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +0 -12
- package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +0 -13
- package/.koolie/core/framework/skills/fw-plan/TESTS.md +0 -14
- package/.koolie/core/framework/skills/fw-refactor/TESTS.md +0 -14
- package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +0 -11
- package/.koolie/core/framework/skills/fw-review-support/TESTS.md +0 -13
- package/.koolie/core/framework/skills/fw-tests/TESTS.md +0 -12
|
@@ -4,24 +4,22 @@
|
|
|
4
4
|
|---|---|
|
|
5
5
|
| Modul-ID | `CP-CC` |
|
|
6
6
|
| Ebene | keine – Abbildungsschicht |
|
|
7
|
-
| Version | 0.
|
|
7
|
+
| Version | 0.27.0 |
|
|
8
8
|
| Status | pilot |
|
|
9
9
|
| Owner (Rolle) | `<FRAMEWORK_OWNER>` |
|
|
10
10
|
| Client | Claude Code |
|
|
11
|
-
| Verbindliche Zielversion | `2.1.x
|
|
12
|
-
| Geprüfte Clientversion | 2.1.267 (
|
|
13
|
-
| Stand der Produktbeobachtung |
|
|
14
|
-
| Datum der Prüfung | 2026-09-10
|
|
15
|
-
|
|
16
|
-
> **Teilweise belegt.**
|
|
17
|
-
>
|
|
18
|
-
>
|
|
19
|
-
>
|
|
20
|
-
>
|
|
21
|
-
> Sitzungen liegen für einen Teil der Zeilen vor; welche, steht in Abschnitt 3. Für die übrigen
|
|
22
|
-
> gilt: Ein Dokumentenabgleich belegt `[DOK]`, nicht beobachtete Durchsetzung.
|
|
11
|
+
| Verbindliche Zielversion | `2.1.x`. Die Spanne ist der Geltungsbereich dieses Packs und festgelegt; gemessen ist der Punktwert in der Zeile darunter |
|
|
12
|
+
| Geprüfte Clientversion | 2.1.267 (Dokumentenabgleich, `tests/protocols/2026-09-10-AP2-claude-code.md`); einzelne Zeilen sind gegen spätere Stände derselben Spanne gemessen, ihre Belegspalte nennt den Stand |
|
|
13
|
+
| Stand der Produktbeobachtung | 2026-09-18, gegen 2.1.275 (`FW-AK-01`, `tests/protocols/2026-09-18-FW-AK-01.md`): Dokumentenabgleich der Quellen `QC-1` bis `QC-5` und Changelog 2.1.268 bis 2.1.275; die Zielspanne trägt. Zwei neue Quellen außerhalb des Repositoriums – siehe `S4`, `S5` und `X1` |
|
|
14
|
+
| Datum der Prüfung | 2026-09-10 (Dokumentenabgleich und erzeugte Artefakte); Messungen in laufenden Sitzungen ab 2026-09-12, siehe Abschnitt 3 |
|
|
15
|
+
|
|
16
|
+
> **Teilweise belegt.** Zeilen mit `[DOK]` sind gegen die Herstellerdokumentation abgeglichen,
|
|
17
|
+
> zuerst gegen 2.1.267 und eine reale Erstinstallation, zuletzt in der Produktbeobachtung gegen
|
|
18
|
+
> 2.1.275. Zwei Zeilen stehen auf `[NICHT ABBILDBAR]`, S5 und B10; beide sind keine Kernzusage und
|
|
19
|
+
> nennen ihren Ersatz. Welche Zeilen in laufenden Sitzungen gemessen sind, steht in Abschnitt 3;
|
|
20
|
+
> für die übrigen belegt der Abgleich `[DOK]`, nicht beobachtete Durchsetzung.
|
|
23
21
|
>
|
|
24
|
-
> **
|
|
22
|
+
> **Lesart der Spalten.** „Einstufung" nennt die vorgesehene Durchsetzungstiefe, „Beleg" ihren Nachweisstand: `[DOK]` = in der Herstellerdokumentation beschrieben, `[EMPF]` = Empfehlung des Frameworks, `BELEG OFFEN` = noch nicht belegt, mit Grund und Datum in der Zelle.
|
|
25
23
|
|
|
26
24
|
## 1. Pfadabbildung
|
|
27
25
|
|
|
@@ -35,20 +33,20 @@ Maschinenlesbar in `manifest.json`; diese Tabelle ist die menschenlesbare Fassun
|
|
|
35
33
|
| Subagentenprofile | `.claude/agents/<name>.md`, Frontmatter-Feld `tools` | [DOK] `docs/en/sub-agents` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) |
|
|
36
34
|
| Berechtigungskonfiguration | `.claude/settings.json` (erzeugt aus `framework/runtime/permissions.json`) | `[DOK]` Mechanismus `docs/en/settings`; Mustersemantik [DOK] `docs/en/permissions` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) – gitignore-Syntax, Einzelheiten bei B3. **Pfadregeln werden nur für `Read` und `Edit` ausgewertet**, siehe Abschnitt 7 |
|
|
37
35
|
| Hook-Konfiguration | `.claude/settings.json` (**keine eigene Datei**; erzeugt aus `framework/runtime/hooks.json` und in dieselbe Datei eingebettet) | `[DOK]` |
|
|
38
|
-
| MCP-Konfiguration | `.mcp.json` (Vorlage: `.mcp.json.example`) | `[DOK]`; **gemessen am 2026-09-28** (2.1.283, Vorprüfung zu `1.18.0`): Ein Server `"type": "http"` mit `"headers"` lädt auch im Druckmodus, und eine Kopfzeile `"Authorization": "Basic ${VARIABLE}"` wird aus der Umgebung gefüllt – die versionierte Datei trägt keinen Zugang
|
|
36
|
+
| MCP-Konfiguration | `.mcp.json` (Vorlage: `.mcp.json.example`) | `[DOK]`; **gemessen am 2026-09-28** (2.1.283, Vorprüfung zu `1.18.0`): Ein Server `"type": "http"` mit `"headers"` lädt auch im Druckmodus, und eine Kopfzeile `"Authorization": "Basic ${VARIABLE}"` wird aus der Umgebung gefüllt – die versionierte Datei trägt keinen Zugang. Ein Server der Projektdatei lädt erst nach Zustimmung (`enabledMcpjsonServers` im Projekteintrag des Benutzers) |
|
|
39
37
|
| Projektverzeichnis-Variable in Hooks | `CLAUDE_PROJECT_DIR` | `[DOK]` |
|
|
40
38
|
| Nutzerlokale Überschreibung | `CLAUDE.local.md`, `.claude/settings.local.json` | `[DOK]` |
|
|
41
39
|
|
|
42
40
|
## 1a. Semantikabbildung der Berechtigungen und Hooks
|
|
43
41
|
|
|
44
|
-
Die Regelmenge liegt werkzeugneutral im Kern (`.koolie/core/framework/runtime/permissions.json`, `hooks.json`) und wird bei der Installation in die Werkzeuge dieses Clients übersetzt
|
|
42
|
+
Die Regelmenge liegt werkzeugneutral im Kern (`.koolie/core/framework/runtime/permissions.json`, `hooks.json`) und wird bei der Installation in die Werkzeuge dieses Clients übersetzt. Was dabei abgebildet wird, steht maschinenlesbar im `manifest.json`; diese Tabelle ist die menschenlesbare Fassung. Vier der sechs Zeilen sind keine Umbenennung, sondern bilden eine andere Semantik ab.
|
|
45
43
|
|
|
46
44
|
| Neutrales Werkzeugverb | Werkzeug bei diesem Client | Anmerkung |
|
|
47
45
|
|---|---|---|
|
|
48
46
|
| `read` | `Read(muster)` | |
|
|
49
|
-
| `search` | – | Die
|
|
50
|
-
| `write` | `Edit(muster)` |
|
|
51
|
-
| `exec` | `Bash(präfix:*)` | präfixbasiert statt wörtlich
|
|
47
|
+
| `search` | – | Die Suchwerkzeuge (`Grep`, `Glob`) werten keine Pfadregeln aus, auch eine `Read(**)`-Regel deckt sie nicht (gemessen, Lauf B04-5); für dieses Verb wird keine Regel erzeugt. Den Kanal trägt der Schutz-Hook über `hook_tools.search` |
|
|
48
|
+
| `write` | `Edit(muster)` | Der Client wertet Pfadregeln nur für `Read` und `Edit` aus; eine `Write(muster)`-Regel wäre wirkungslos und wird nicht erzeugt (Abschnitt 7) |
|
|
49
|
+
| `exec` | `Bash(präfix:*)` | präfixbasiert statt wörtlich, die Sperre ist damit breiter. Je Regel zweimal, `Bash(…)` und `PowerShell(…)`: das zweite Befehlswerkzeug des Clients unter Windows, gleiche Regelform, gemessen |
|
|
52
50
|
| `fetch` | `WebFetch`, `WebSearch` | zwei Werkzeuge, beide ohne Muster |
|
|
53
51
|
| `mcp` | `mcp__*` | ohne Muster |
|
|
54
52
|
|
|
@@ -59,7 +57,7 @@ Die Regelmenge liegt werkzeugneutral im Kern (`.koolie/core/framework/runtime/pe
|
|
|
59
57
|
| Hook-Werkzeugnamen | `Read`; `Grep`, `Glob`; `Bash`; `Edit`, `Write`, `NotebookEdit` (`hook_tools` im Manifest) |
|
|
60
58
|
| Projektverzeichnis im Hook-Befehl | `$CLAUDE_PROJECT_DIR` |
|
|
61
59
|
|
|
62
|
-
Zwei Zusicherungen sichern die Abbildung ab
|
|
60
|
+
Zwei Zusicherungen sichern die Abbildung ab: Eine `deny`- oder `ask`-Regel ohne Zielwerkzeug lässt die Installation scheitern, und die Präfixform eines Befehlsverbots muss ein Präfix seiner wörtlichen Form sein, also mindestens so breit. Bei `allow` ist jede Verbreiterung unzulässig.
|
|
63
61
|
|
|
64
62
|
## 1b. Semantikabbildung der Ladebedingungen
|
|
65
63
|
|
|
@@ -70,149 +68,141 @@ Die Regeltexte liegen werkzeugneutral im Kern (`.koolie/core/framework/runtime/r
|
|
|
70
68
|
| `always_on` | kein `paths`-Feld | bei jedem Sitzungsstart | wörtliche Entsprechung |
|
|
71
69
|
| `model_decision` | kein `paths`-Feld | bei jedem Sitzungsstart | **Verschärfung** – mehr Regeln aktiv, nicht weniger; sie kostet Kontext, kein Schutzniveau |
|
|
72
70
|
| `glob` mit `globs` | `paths:` mit denselben Mustern | sobald der Client eine passende Datei liest | wörtliche Entsprechung |
|
|
73
|
-
| `manual`, `agent` | **keine Abbildung** | – | Die Installation scheitert. Kein Kernartefakt nutzt sie; eine
|
|
71
|
+
| `manual`, `agent` | **keine Abbildung** | – | Die Installation scheitert. Kein Kernartefakt nutzt sie; eine Regel, die es täte, verlöre ihre Ladebedingung sonst stillschweigend |
|
|
74
72
|
|
|
75
|
-
Zwei Zusicherungen sichern auch diese Abbildung ab: Ein Ladetrigger ohne Eintrag lässt die Installation scheitern
|
|
73
|
+
Zwei Zusicherungen sichern auch diese Abbildung ab: Ein Ladetrigger ohne Eintrag lässt die Installation scheitern, und ein Ladetrigger, der auf `paths` abbildet, muss Dateimuster mitbringen. Der Validator prüft die installierte Fassung gegen die Felder, die dieser Client auswertet: Ein stehen gebliebenes `trigger:` oder `globs:` ist ein Fehler, und eine Kernregel (`00-`, `10-`, `15-`, `20-`) darf kein `paths` tragen – sie gilt für jede Aufgabe.
|
|
76
74
|
|
|
77
|
-
`description` ist für Regeldateien dieses Clients
|
|
75
|
+
`description` ist für Regeldateien dieses Clients nicht dokumentiert und entfällt im Frontmatter. Zweck, Ladeverhalten und Ladetrigger der Kernquelle stehen in einem HTML-Kommentar über dem Regeltext. Dass der Client solche Kommentare vor dem Einspeisen entfernt, ist nur für `CLAUDE.md` dokumentiert; der Kommentar ist deshalb knapp und zählt hier zum ständigen Kontext.
|
|
78
76
|
|
|
79
77
|
## 2. Fähigkeitsmatrix
|
|
80
78
|
|
|
81
|
-
**Zur Belegspalte.** Jede `[DOK]`-Zeile nennt die
|
|
79
|
+
**Zur Belegspalte.** Jede `[DOK]`-Zeile nennt die Quellenkennung der Liste in Anhang 31.4.2 (`QC-1` bis `QC-6`); nur sie lässt sich gegen die Liste halten, ein Seitenpfad darf danebenstehen. Prüfung 73 setzt das durch. Eine Zelle, die auf eine andere Zeile verweist (*„wie B3"*), erbt deren Kennung.
|
|
82
80
|
|
|
83
|
-
**Was
|
|
81
|
+
**Was die Zuordnung sagt.** Die Quellen der `[DOK]`-Zeilen sind am 2026-09-22 aus Quellenliste und Protokollen zugeordnet, nicht neu abgerufen. Der Recherchestand der Seiten bleibt der von `FW-AK-01` (2026-09-18); eine Zuordnung ist keine Aktualitätsaussage. Wo keine Seite passt, sagt die Zeile das (`M3`).
|
|
84
82
|
|
|
85
83
|
### R – Regelladung
|
|
86
84
|
|
|
87
85
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
88
86
|
|---|---|---|---|---|
|
|
89
87
|
| R1 | Wurzel-Anweisungsdatei wird ungefragt geladen | `CLAUDE.md` wird zu Beginn jeder Sitzung geladen | `[TECHNISCH]` | `[DOK]` **`QC-1`** (Zuordnung `K-62`) |
|
|
90
|
-
| R2 | Regeldateien mit Ladebedingungen | `.claude/rules/*.md`: ohne `paths`-Frontmatter unbedingt geladen, mit `paths` nur bei passenden Dateien. Der Client kennt
|
|
88
|
+
| R2 | Regeldateien mit Ladebedingungen | `.claude/rules/*.md`: ohne `paths`-Frontmatter unbedingt geladen, mit `paths` nur bei passenden Dateien. Der Client kennt eine Bedingung, die Kernquelle drei Ladetrigger; `model_decision` bildet deshalb auf unbedingtes Laden ab – eine Verschärfung, siehe Abschnitt 1b | `[TECHNISCH]` | [DOK] **`QC-1`** `docs/en/memory` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) |
|
|
91
89
|
| R3 | Regeln an Dateimuster bindbar (Grundlage der Technology Packs) | `paths:` im Frontmatter bindet eine Regel an Glob-Muster; mehrere Muster und Klammer-Expansion sind zulässig. Ein Technology Pack liegt damit als `.claude/rules/40-tech-<name>.md` und lädt bei den Dateien seiner Technologie. Grenzen: Abschnitt 5 | `[TECHNISCH]` | [DOK] **`QC-1`** `docs/en/memory` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) |
|
|
92
|
-
| R4 | Bekanntes Zeichenlimit, das das Framework einhalten kann |
|
|
93
|
-
| R5 | Die geladenen Regelquellen sind vollständig aufzählbar |
|
|
94
|
-
| R6 | Keine Importe fremder Werkzeugformate | Der Client kennt `claudeMdExcludes`, das Anweisungs- und Regeldateien über Glob-Muster vom Laden ausnimmt.
|
|
90
|
+
| R4 | Bekanntes Zeichenlimit, das das Framework einhalten kann | 4 MiB je Anweisungsdatei; eine größere Datei wird übersprungen. Zusätzlich als Empfehlung 200 Zeilen | `[TECHNISCH]` | [DOK] **`QC-1`** `docs/en/memory` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) |
|
|
91
|
+
| R5 | Die geladenen Regelquellen sind vollständig aufzählbar | Zwei dokumentierte Wege (`QC-1`): `/context` führt die geladenen Anweisungsdateien unter *Memory files* auf, und der Hook `InstructionsLoaded` feuert, wenn eine Anweisungs- oder Regeldatei in den Kontext geladen wird – sein Matcher ist der Ladegrund (`session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact`). Die vollständige Auskunft des Frameworks steht in Abschnitt 8 dieses Packs | `[TEXTUELL]` | **`[DOK]` `QC-1` `docs/en/memory`, Stand 2.1.275 (`FW-AK-01`, 2026-09-18, `tests/protocols/2026-09-18-FW-AK-01.md`).** 🟢 **Der VERIFY-Marker ist damit aufgelöst** (D-158): Er verlangte wörtlich einen Abgleich gegen die aktuelle Client-Dokumentation, und die nennt seit diesem Stand einen technischen Weg. Bis 0.61.0 stand hier *„Kein Kommando dieses Clients führt die wirksamen Regelquellen auf"* – **das ist nicht mehr wahr**, und der alte Belegstand war eine Aussage über sich selbst, die veraltet ist (D-114). **Zwei benannte Grenzen:** (1) Was die **Nutzlast** des Hooks trägt – Pfad, Herkunft, Reihenfolge –, ist nicht dokumentiert; belegt ist das Ereignis samt Ladegrund, nicht der Inhalt. (2) Keiner der beiden Wege ist in einer Sitzung dieses Frameworks **gemessen**; ein Dokumentenabgleich belegt `[DOK]`, nicht `[TECHNISCH]` (D-12). Die frühere Selbstauskunft der Sitzung ist am 2026-09-11 gegen 2.1.268 beobachtet (K-22, K-26) und traf zu – sie bleibt Modellverhalten und ist nicht der hier belegte Weg |
|
|
92
|
+
| R6 | Keine Importe fremder Werkzeugformate | Der Client kennt `claudeMdExcludes`, das Anweisungs- und Regeldateien über Glob-Muster vom Laden ausnimmt. Das Framework liefert keine Vorgabe aus: Eine `CLAUDE.md` im Elternverzeichnis ist in einem Mehrprojekt-Verzeichnis oft gewollt, ein pauschaler Ausschluss bräche legitime Anordnungen. Es bleibt bei Auskunft (Abschnitt 8) und Empfehlung | `[TEXTUELL]` | Der Mechanismus ist am 2026-09-11 gegen 2.1.268 gemessen: Drei Muster gleichzeitig nahmen die fremde Datei vom Laden aus, zwei geladene `CLAUDE.md` wurden eine (K-21). **Welches der drei Muster greift, ist nicht getrennt gemessen.** Dass hier keine Vorgabe steht, ist eine Entscheidung, kein fehlender Beleg |
|
|
95
93
|
|
|
96
94
|
### S – Skills
|
|
97
95
|
|
|
98
96
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
99
97
|
|---|---|---|---|---|
|
|
100
98
|
| S1 | Versionierte Skills im Repository | `.claude/skills/<name>/SKILL.md` mit Frontmatter | `[TECHNISCH]` | `[DOK]` **`QC-3`** (Zuordnung `K-62`); zusätzlich **beobachtet** (siehe Abschnitt 6) |
|
|
101
|
-
| S2 | Gezielter Aufruf |
|
|
102
|
-
| S3 | Werkzeugbeschränkung je Skill |
|
|
103
|
-
| S4 | Schreibende Skills nur benutzergetriggert | `disable-model-invocation: true` verhindert, dass das Modell den Skill selbst lädt, und hält zusätzlich seine Beschreibung aus dem Kontext; die Installation setzt das Feld für jeden Skill, dessen Quelle `triggers` ohne `model` nennt (9 von 12). Ergänzend wirkt `ask` auf `Edit(
|
|
104
|
-
| S5 | Die geladenen Skills sind vollständig aufzählbar, samt Herkunft und Aufrufbarkeit |
|
|
99
|
+
| S2 | Gezielter Aufruf | Zwei Wege, verschieden gebaut (gemessen 2026-09-19). (a) Der modellseitige Aufruf – die Sitzung zieht den Skill selbst – ist ein eigener Werkzeugaufruf mit dem Namen `Skill` und damit einzeln kontrollierbar; das ist die Voraussetzung der drei Grenzen unten, und die Erhebung vom 2026-09-14 hat genau ihn gemessen: Ihre Prompts nannten keinen Skill. (b) Der Aufruf mit vorangestelltem Schrägstrich – der Weg, den der Testkatalog verlangt – ist eine Slash-Befehls-Erweiterung des Clients: Die Mitschrift führt `<command-name>` samt Argumenten und fügt die ganze `SKILL.md` als Nutzernachricht ein; kein Werkzeugaufruf, keine `Skill(...)`-Regel im Spiel, kein stummer Fehlschlag. Gemessen an zwölf von zwölf Läufen. Die drei Grenzen gelten für Weg (a): (1) Rückfragepflichtig ohne Freigabe – ohne `allow`-Regel fällt der Aufruf auf `defaultMode: default`; im rückfragefreien Betrieb ist das eine Abweisung. Die Berechtigungsdatei führt je eine Regel für die zwölf Skills des Kerns; ein Skill außerhalb dieser zwölf bleibt rückfragepflichtig – gewollt, weil die Sitzung auch Skills aus einer nutzerglobalen Ablage führt, die nach Regel 2.6 der Prioritätshierarchie ebenenlos sind. (2) Wörtliches Argument – der Vergleich ist zeichengenau: `Skill(koolie-code-explain)` lässt den Aufruf durch, `Skill(koolie-*)` weist ihn ab. Ein Präfixmuster gäbe lautlos nichts frei. Deshalb zwölf Regeln statt einer. (3) Der Fehlschlag ist stumm – nach der Abweisung liest die Sitzung die `SKILL.md` als gewöhnliche Datei und arbeitet ihren Ablauf von Hand nach; die Ausgabe trägt Überschrift und Standardformat des Skills und ist von einem gelungenen Lauf nicht zu unterscheiden. Die nachgearbeitete Fassung trägt die Werkzeugbeschränkung des Skills nicht – in einem Lauf rief sie ein Werkzeug auf, das der Skill in `disallowed-tools` sperrt. Der stumme Rückfall kostet damit die Zusage der Nachbarzeile. Was dagegen steht, ist eine Anweisung (Wurzel-Anweisungsdatei Abschnitt 17, Grenzfall G-20), kein Mechanismus | `[TECHNISCH]`, mit drei benannten Grenzen | **Gemessen am 2026-09-14** (`tests/protocols/2026-09-14-erhebung-skillaufruf.md`), elf Läufe an einer vollständigen Installation, davon vier Kontroll- und Entlastungsläufe: Ohne `allow`-Regel wurde der Aufruf abgewiesen (`toolDenialKind: user-rejected`, `permission_denials` führt `Skill`), mit Regel lief er durch (Gegenprobe). Die Argumentform ist mit Positivlauf und **Kontrolllauf** belegt: `Skill(koolie-plan)` weist `koolie-code-explain` ab, das Muster engt also wirklich ein. Zuvor war die Zeile mit `[DOK]` belegt und nannte **keine Grenze** – der Aufruf funktionierte, und was ihn aufhielt, stand in der eigenen Berechtigungsdatei |
|
|
100
|
+
| S3 | Werkzeugbeschränkung je Skill | `disallowed-tools` im Skill-Frontmatter. Die Installation bildet `permissions.deny` der Quelle darauf ab: die groben Verben `edit` und `exec` über `hook_tools` auf `Edit, Write, NotebookEdit` und `Bash`. `allowed-tools` trägt die Zusage nicht – es ist eine Vorabfreigabe für den aufrufenden Turn, keine Beschränkung (B01), und wird deshalb bewusst nicht dafür verwendet. Was davon in der Mitschrift steht, ist gemessen: Beim Aufruf mit Schrägstrich führt sie `command_permissions` mit genau den Werkzeugen aus `allowed-tools`; ein Baum ohne die beiden Frontmatter-Schlüssel führt dort eine leere Liste. Wirkungslos wird damit jede Freigabe der Berechtigungsdatei, die während des Befehls nicht in dieser Liste steht – wer ein Unterlassen misst, weist es je Schicht aus. Die Sperre weist ab, sie entfernt nicht. Gemessen sind fünf Aufrufe in vier Läufen, die erschienen und abgewiesen wurden, wörtlich *„Permission to use Bash has been denied“* – ein entferntes Werkzeug kann man nicht aufrufen, ein abgewiesenes schon. An der Wirkung ändert das nichts, an der Beschreibung schon. Die Abweisung trägt kein `toolDenialKind` – sie steht in `permission_denials` des Ergebnisses; wer nur die Mitschrift danach durchsucht, zählt null. Welche Schicht abweist, ist wahrscheinlich, nicht isoliert: Bei identischer Berechtigungsdatei wurde ein schlichtes `ls` mit Skill abgewiesen und ohne Skill ausgeführt; die eigens gebauten Zuschnitte mit `Bash` im `allow`-Korb haben gar keinen Aufruf abgesetzt. Drei Grenzen: (1) Turnbereich – die Sperre gilt nur für den aufrufenden Turn; Turn 2 derselben Sitzung konnte wieder schreiben. Ein „nur lesender" Skill ist nur *während seines Turns* nur lesend, das ist keine Betriebsart. (2) Aufzählend – was nicht in der Liste steht, ist offen; mit gesperrtem `Write, Edit` schrieb der Skill über `Bash`. (3) Keine Argumentmuster – befehlsgenaue Verbote sind nicht ausdrückbar, und ein Eintrag mit Klammer wirkt lautlos gar nicht. Betroffen sind fünf der zwölf Skills, ungleich: `koolie-change-small`, `koolie-refactor`, `koolie-tests` bekommen gar keine Schranke je Skill, `koolie-mr-description` und `koolie-review-support` eine teilweise – ihre Editierwerkzeuge sind gesperrt, ihre `git`-Verbote nicht. Für sie trägt weiter die globale Berechtigungsschicht samt Schutz-Hook, die unabhängig vom Skill wirkt. Reichweite, gemessen am 2026-09-13 (`tests/protocols/2026-09-13-erhebung-unteragent.md`): Die Sperre gilt auch für einen Unteragenten, den der Skill startet. Ein Unteragent mit einem Profil ohne eigenes `tools`-Feld hatte `Write` und `Edit` nicht im Vorrat; der Kontrolllauf mit demselben Skill ohne das Feld schrieb. Der Unteragent ist kein Umgehungsweg. Grenze 2 reicht allerdings mit: Mit gesperrtem `Write, Edit` schrieb der Unteragent über `Bash`. Ergänzt am 2026-09-13 (`tests/protocols/2026-09-13-erhebung-unteragent-tiefe.md`), je mit Kontrolllauf: Die Sperre gilt auch für einen Unteragenten mit `run_in_background: true` und reicht mindestens zwei Ebenen tief – der Start der zweiten Ebene gelang, das Werkzeug fehlte auch dort. Bei Widerspruch gewinnt die restriktivere Liste: Ein Profil, das `Write` ausdrücklich in `tools` nennt, bekam es unter einem Skill mit `disallowed-tools: Write, Edit` nicht – eine Erlaubnis holt ein entferntes Werkzeug nicht zurück, gleich ob sie in der Berechtigungsdatei steht oder im Agentenprofil. Man kann die Liste nur enger machen, nie weiter. Beobachtung zum Wortlaut des Clients, keine Messung: Er meldet die Sperre als „Write is disabled for this *session*, in subagents as well as here" – die zweite Hälfte trifft zu, die erste überzeichnet: Gemessen ist der Turn, und Turn 2 derselben Sitzung konnte wieder schreiben. Wer der Meldung glaubt, nimmt mehr Reichweite an, als belegt ist. Weiterhin nicht gemessen: drei Ebenen und tiefer; der umgekehrte Widerspruch (Profil sperrt, Skill erlaubt) – nach dem Ergebnis vorhersagbar, aber eine Vorhersage ist keine Messung; und ob ein blockierender Hook auch auf der zweiten Ebene stoppt (für die erste ist es gemessen) | `[TECHNISCH]`, mit drei benannten Grenzen | **Gemessen am 2026-09-13** (`tests/protocols/2026-09-13-erhebung-disallowed-tools.md`), neun Läufe mit Kontrolllauf, Positivkontrolle und Rekorder-Hook: Ein Skill mit `disallowed-tools: Write, Edit` **konnte nicht schreiben – obwohl `Write` in der `allow`-Liste stand**; derselbe Skill ohne das Feld konnte es. `disallowed-tools` schlägt also eine ausdrückliche Freigabe und ist genau das, was `allowed-tools` nach **B01** nicht ist. Bis 0.34.0 galt diese Zeile als nicht abbildbar, mit dem Satz „nicht erhoben, deshalb hier nicht zugesagt" (`CR-2026-050`, D-50) – **das war nach dem damaligen Belegstand richtig und ist mit der Erhebung überholt** (`CR-2026-057`, D-64). Nach D-41 ist S3 eine **Fähigkeitszusage**; ihr Ausfall sperrt die Inbetriebnahme nicht. **Benannte Grenze, gemessen mit `1.23.0`** (D-525): Die Sperre gilt nur in dem Turn, in dem der Skill läuft – im Folgeturn (`--resume`) meldete der Lauf „Skill: keiner“, und ein Befehl lief, sobald die Regelschicht ihn zuließ; dort tragen Berechtigungsdatei und Schutz-Hook |
|
|
101
|
+
| S4 | Schreibende Skills nur benutzergetriggert | `disable-model-invocation: true` verhindert, dass das Modell den Skill selbst lädt, und hält zusätzlich seine Beschreibung aus dem Kontext; die Installation setzt das Feld für jeden Skill, dessen Quelle `triggers` ohne `model` nennt (9 von 12). Ergänzend wirkt `ask` auf `Edit()`: jede Schreiboperation löst eine Rückfrage aus | `[TECHNISCH]` | [DOK] **`QC-3`** `docs/en/skills` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`); **beobachtet am 2026-09-12** (`tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`): Von zwölf Skills führte die Sitzung genau die drei **ohne** das Feld; die neun mit dem Feld standen nicht in ihrem Kontext, waren als Aufruf mit vorangestelltem Schrägstrich aber vorhanden. Der Wirkungsnachweis steht damit nicht mehr aus. **Reichweite:** Die Zusage gilt für die Skill-Ablage, die das Framework schreibt. Skills aus Ablagen außerhalb des Repositoriums unterliegen diesen Konventionen nicht; sie sind nach Regel 2.6 der Prioritätshierarchie ebenenlos und dürfen den Handlungsspielraum nur einschränken (`CR-2026-032`). 🔴 **Seit 2.1.275 gibt es eine solche Ablage, die das Framework nicht erreicht, und sie ist standardmäßig an** (`FW-AK-01`, 2026-09-18, `K-63`): Der Client lädt die im Konto des Anwenders eingeschalteten Skills nach `~/.claude/skills/synced/` und gleicht sie **während** der Sitzung etwa alle zehn Minuten ab. Für diese Skills gilt das Feld dieser Zeile nur, soweit ihre Quelle es selbst setzt – das Framework schreibt sie nicht. **Die Zusage dieser Zeile bleibt richtig und ihr Geltungsbereich ist kleiner geworden.** **Und eine zweite Reichweitenangabe, gegenläufig:** Ein Unteragentenprofil kann Skills über das Frontmatter-Feld `skills` **vorladen**; `disable-model-invocation: true` verhindert auch das (`QC-3`, `QC-4`). Das Framework nutzt das Feld nicht |
|
|
102
|
+
| S5 | Die geladenen Skills sind vollständig aufzählbar, samt Herkunft und Aufrufbarkeit | Keiner. `claude --help` kennt keinen Unterbefehl für Skills, `claude doctor` nennt keine Skill-Pfade; die Sitzung erhält Skills als Name und Kurzbeschreibung ohne Pfad | `[NICHT ABBILDBAR]` | **Erhoben am 2026-09-12** (`tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`). Zwei Teilantworten. **Fremde Skill-Ablagen führt dieser Client nicht mit:** Vier gleich gebaute Sonden in `.devin/skills/`, `.windsurf/skills/`, `.cursor/skills/` und `~/.devin/skills/` blieben sämtlich ungeführt, die fünfte in der eigenen Ablage wurde geführt (Positivkontrolle im selben Lauf). Die Gegenrichtung zu `AP2-DD-16` fällt damit entgegengesetzt aus; ein Import ist hier ein ausdrücklicher Befehl (`claude import`), kein stilles Mitführen. **Die Aufzählbarkeit selbst ist nicht eingelöst:** Die Sitzung antwortete auf die Frage nach der Herkunft wörtlich „Herkunft unbekannt — für alle 84", und ihre Liste ist zudem konstruktionsbedingt unvollständig (S4). Die nutzerglobale **eigene** Ablage `~\.claude\skills\` lädt in jedes Projekt mit – 67 Skills in einer Sitzung, deren Projekt keinen davon enthält; sie fällt unter den Auskunftsabschnitt nach D-34. **Ersatz: `python .koolie/core/install.py --client claude-code --root <projekt> --list-skills`** – Name, Herkunft, Aufrufbarkeit und Pfad je Skill dieser Installation (`CR-2026-041` E3, D-42). **Kein vollständiger Ersatz, und die Ausgabe sagt das selbst:** Skills aus Ablagen außerhalb des Projektverzeichnisses sieht auch das Framework nicht – also genau die 67, um die es hier geht. Nach D-41 ist S5 eine **Fähigkeitszusage**; ihr Ausfall sperrt die Inbetriebnahme nicht. 🔴 **Nachtrag 2026-09-18 (`FW-AK-01`): Der Abstand ist seit 2.1.275 größer, nicht kleiner.** Zu den nutzerglobalen Skills tritt eine **Kontoquelle**: `~/.claude/skills/synced/`, standardmäßig eingeschaltet, im Hintergrund geladen und **während** der Sitzung etwa alle zehn Minuten nachgezogen (`QC-3`). Damit kann sich der Skillbestand **innerhalb** einer Sitzung ändern – eine Aufzählung ist dann nicht nur unvollständig, sondern hat einen Zeitpunkt. Der Ersatz über `--list-skills` sieht sie so wenig wie die 67 nutzerglobalen (`K-63`) |
|
|
105
103
|
|
|
106
104
|
### B – Berechtigungen
|
|
107
105
|
|
|
108
|
-
> **`[TECHNISCH]` heißt in diesem Block:** Die Engine setzt die Regel durch,
|
|
106
|
+
> **`[TECHNISCH]` heißt in diesem Block:** Die Engine setzt die Regel durch, solange der Betriebsmodus die Berechtigungsprüfung nicht abschaltet. Bei diesem Client gilt das auch im Modus ohne Rückfragen, den `03-security.md` Abschnitt 4 untersagt (erhoben am 2026-09-12, `tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`): Mit dem Bypass-Schalter griffen die Verweigerungsregeln weiter, für Lesewerkzeug und Shell-Befehl; ohne sie trug der Schutz-Hook allein; ein Kontrolllauf ohne beide las die Datei. Beide Linien halten hier gemeinsam, anders als bei `devin-desktop`. Der Modus ist zudem sperrbar (`permissions.disableBypassPermissionsMode`), in verwalteten Einstellungen unüberschreibbar. Das Verbot des Modus bleibt; der Lauf war Testnachweis, kein Betriebszustand.
|
|
109
107
|
>
|
|
110
|
-
> **
|
|
108
|
+
> **Nur für eine Sitzung, die im Verzeichnis der Installation startet** (gemessen am 2026-09-26 mit 2.1.283, `tests/protocols/2026-09-26-mehrprojekt-tokenlast.md`). Startet sie in einem Unterverzeichnis mit eigenem git-Repositorium, lädt der Client die Wurzel-Anweisung der Elternebene mit, aber weder Berechtigungsdatei noch Hooks: Die `.env` des Unterverzeichnisses wurde gelesen, ein aufzeichnender Hook lief nicht. Eine eigene Installation im Unterverzeichnis trägt; dann laden beide Wurzel-Anweisungen. Alle Einstufungen `[TECHNISCH]` dieses Blocks und des H-Blocks stehen unter dieser Bedingung, und nichts meldet einen falschen Startort. Die Einsatzszenarien stehen im Übernahmeleitfaden, Abschnitt 4.
|
|
111
109
|
|
|
112
110
|
| ID | Zusage des Frameworks | Kern | Mechanismus beim Client | Einstufung | Beleg |
|
|
113
111
|
|---|---|---|---|---|---|
|
|
114
112
|
| B1 | Berechtigungen versioniert im Repository | ja | `.claude/settings.json` | `[TECHNISCH]` | `[DOK]` **`QC-5`** (Zuordnung `K-62`) |
|
|
115
|
-
| B2 | Verweigern vor Rückfragen vor Erlauben | ja | `permissions.deny` / `.ask` / `.allow`.
|
|
116
|
-
| B3 | Secret-Dateien per Pfadmuster lesegeschützt | ja | Verweigerungsregeln auf `./.env`,
|
|
117
|
-
| B4 | Framework- und Overlay-Artefakte schreibgeschützt | ja | Je Pfad
|
|
118
|
-
| B5 | CI-, Quality-Gate- und Lockdateien schreibgeschützt | ja | dito, je Pfad eine `Edit(...)`-Regel.
|
|
119
|
-
| B6 | Befehle per Muster verweigerbar | ja | Präfixmuster, z. B. `Bash(git push:*)`. Wirkt
|
|
120
|
-
| B7 | Schreiboperationen fragen zurück | – | `ask` auf `Edit(
|
|
121
|
-
| B8 | Netzwerkzugriff standardmäßig unterbunden | – | Verweigerung der Abrufwerkzeuge sowie der Befehle `curl`, `wget`, `ssh` und `scp`.
|
|
122
|
-
| B9 | Nutzerlokale Konfiguration kann nur verschärfen | – | `.claude/settings.local.json` rangiert
|
|
123
|
-
| B10 | Externer Abruf auf freigegebene Domains beschränkbar | – |
|
|
113
|
+
| B2 | Verweigern vor Rückfragen vor Erlauben | ja | `permissions.deny` / `.ask` / `.allow`. Die Kette hat drei Paare, und zwei davon sind gemessen. `deny` über `allow`: gemessen am 2026-09-17 – derselbe Befehl in beiden Körben, der Lauf ruft ihn auf und wird abgewiesen. `ask` über `allow`: gemessen am 2026-09-18 – bei `ask` = `Edit()` bleibt eine ausdrückliche `allow`-Regel auf einen einzelnen Pfad wirkungslos; der Schreibzugriff wird abgewiesen. Die praktische Folge steht in der Zeile, weil sie sonst niemand sieht: Ein Projekt kann eine einzelne Datei nicht vorab zum Schreiben freigeben, solange `Edit()` im `ask`-Korb steht – der Korb schluckt die engere Regel. `deny` über `ask`: unbelegt Ein Befehl in keinem Korb (gemessen 2026-10-01 mit 2.1.285 im Druckmodus): `git ls-files` lief ohne Eintrag und ohne Rückfrage – der Client gibt lesende Befehle selbst frei; mit `Bash(git ls-files:*)` in `deny` wurde er abgewiesen. Der `allow`-Korb ist damit für lesende Befehle keine Grenze, `deny` ist es | `[TECHNISCH]` | **Gemessen am 2026-09-18** (`tests/protocols/2026-09-18-sitzungstest-pi-ds-2.md` Abschnitt 5.2) für `ask` über `allow`: ein Paar, das sich in **genau einer Zeile** der Berechtigungsdatei unterscheidet – mit `Edit(**)` im `ask`-Korb ein `permission_denial` auf `Edit`, ohne ihn keines und die Datei geschrieben. **Gemessen am 2026-09-17** (D-121, `tests/protocols/2026-09-17-sitzungstest-schranken.md`) für `deny` über `allow`. Zuvor vollständig `[DOK]`; **`deny` über `ask` bleibt `[DOK]` `QC-2` (Zuordnung `K-62`) – der Fall ist nicht gemessen** |
|
|
114
|
+
| B3 | Secret-Dateien per Pfadmuster lesegeschützt | ja | Verweigerungsregeln auf `./.env`, `/*.pem`, `/secrets/` und weitere. Mustersemantik: gitignore-Syntax; ein bloßer Dateiname trifft in jeder Tiefe (`Read(.env)` ist gleichbedeutend mit `Read(/.env)`); ein einsegmentiges Verzeichnismuster trifft in `deny` und `ask` in jeder Tiefe, in `allow` nur am verankerten Ort. Unter Windows werden Pfade vor dem Vergleich auf POSIX-Form normalisiert, und der Vergleich unterscheidet nicht zwischen Groß- und Kleinschreibung: `Read(/*.secret)` weist `UNTEN/NOTIZ.SECRET` ab wie `klein/notiz.secret` (gemessen am 2026-09-30, 2.1.285) – anders als bei `devin-desktop`. Je Kanal: direktes Lesen wirkt (Regel und Hook); Shell wirkt (der Schutz-Hook zerlegt den Befehl in Tokens); Suche wirkt allein über den Hook, weil dieser Client für `Grep` und `Glob` keine Pfadregeln auswertet (`AP2-CC-02`); Unterprozess nicht nachgewiesen | `[TECHNISCH]` für Lesen, Shell und Suche; `[TEXTUELL]` für den Unterprozess | [DOK] **`QC-2`** `docs/en/permissions` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`). **Reichweite je Kanal gemessen am 2026-09-12** (`tests/protocols/2026-09-12-B04-B05-gegenpruefung.md`, B04): Vor 0.30.0 passierte eine Suche über einen Secret-Pfad beide Schichten (Lauf B04-5); der Hook-Eintrag schließt den Kanal, nachgewiesen mit zwei Sonden und zwei Gegenproben **PowerShell** (seit `1.18.2`, D-469): `Get-Content .env` weist der Schutz-Hook ab (`PreToolUse:PowerShell`), gemessen; der Matcher nennt das Werkzeug |
|
|
115
|
+
| B4 | Framework- und Overlay-Artefakte schreibgeschützt | ja | Je Pfad eine `Edit(...)`-Regel; das Kernverzeichnis ist als Ganzes erfasst (`Edit(.koolie/core/)`). Eine zusätzliche `Write(...)`-Pfadregel wäre wirkungslos und wird nicht erzeugt. Je Kanal: direktes Schreiben wirkt (Regel und Hook); Shell und Unterprozess wirken nicht – die Berechtigungsdatei führt für `exec` ausschließlich Befehlsverbote und keine einzige Pfadregel, und der Schutz-Hook prüft das Kernverzeichnis nur bei schreibenden Werkzeugen. Was den Shell-Schreibweg aufhält, ist die Regelschicht | `[TECHNISCH]` für das direkte Schreiben; `[TEXTUELL]` für Shell und Unterprozess | wie B3. **Reichweite je Kanal gemessen am 2026-09-12** (`tests/protocols/2026-09-12-B04-B05-gegenpruefung.md`, B04): `sed -i … <kern>/VERSION`, ein Änderungsskript mit Kernpfad und eine Umleitung in die Wurzel-Anweisungsdatei passieren den Hook sämtlich (B04-1 bis B04-3). **Eine technische Durchsetzung bräuchte eine Isolationsschicht des Betriebssystems; deren Reichweite ist auf dieser Plattform unerhoben** |
|
|
116
|
+
| B5 | CI-, Quality-Gate- und Lockdateien schreibgeschützt | ja | dito, je Pfad eine `Edit(...)`-Regel. Je Kanal wie B4: direktes Schreiben wirkt, Shell und Unterprozess nicht | `[TECHNISCH]` für das direkte Schreiben; `[TEXTUELL]` für Shell und Unterprozess | wie B4 |
|
|
117
|
+
| B6 | Befehle per Muster verweigerbar | ja | Präfixmuster, z. B. `Bash(git push:*)`. Wirkt breiter als eine Verweigerung des vollständigen Befehls – und schmaler als der Befehl: Das Muster trifft jedes Kommando, das mit der Zeichenfolge beginnt, und eine andere Schreibweise desselben Befehls beginnt nicht damit. Gemessen am 2026-09-17: Bei `deny` = `Bash(git push:*)` und `allow` = `Bash(git:*)` wird `git push origin main` abgewiesen, `git -C <pfad> push origin main` läuft durch und erreicht das Remote. In der ausgelieferten Fassung hält die Sperre trotzdem – der `allow`-Korb führt nur fünf lesende `git`-Kommandos, und was dort nicht steht, fällt im nicht-interaktiven Betrieb ohnehin auf eine Abweisung (gemessen im Zuschnitt `W`). Aber: Ein Projekt, das seinen `allow`-Korb auf `Bash(git:*)` verbreitert, verliert den Schutz auf Fernwirkung ohne jede Meldung | `[TECHNISCH]` | wie B3 für den Mechanismus; **die Grenze gemessen am 2026-09-17** (`tests/protocols/2026-09-17-sitzungstest-schranken.md` Abschnitt 6, Läufe `PX1` und `PX2`, Wirkung am Remote nachgeprüft). Der Satz stand seit 0.15.0 als unbelegte Notiz in Abschnitt 4 und verwies für seinen Inhalt auf **diese** Zeile, die ihn nicht trug (`K-48`) 🟢 **PowerShell seit `1.18.2` gleichgestellt** (D-469, gemessen am 2026-09-29 mit 2.1.284, Modus `bypassPermissions`, Baum ohne Regeltexte): `PowerShell(git push:*)` weist `git push origin main` ab, auch verkettet (`git status; git push origin main`) und in Großschreibung (`GIT PUSH origin main`); `Remove-Item -Recurse -Force` und `curl` wurden ebenfalls abgewiesen, ohne dass eine eigene Regel für das Cmdlet besteht – die Zuordnung zu `PowerShell(rm:*)` und `PowerShell(curl:*)` (Aliase) ist gefolgert, nicht getrennt gemessen. `PowerShell(git status:*)` in `allow` lässt `git status` durch. 🔴 **Und ohne diese Regeln fehlt das Werkzeug:** Steht in `deny` eine `Bash(…)`-Regel und keine `PowerShell(…)`-Regel, bietet der Client das Werkzeug gar nicht an (Startmeldung, ohne Modellaufruf); jede `PowerShell(…)`-Regel in `allow` oder `deny` schaltet es ein, der Hook-Matcher allein nicht. Undokumentiert – deshalb trägt die Sperre die Regel, nicht die Ausblendung (D-470) |
|
|
118
|
+
| B7 | Schreiboperationen fragen zurück | – | `ask` auf `Edit()` | `[TECHNISCH]` | `[DOK]` **`QC-2`** (Zuordnung `K-62`) |
|
|
119
|
+
| B8 | Netzwerkzugriff standardmäßig unterbunden | – | Verweigerung der Abrufwerkzeuge sowie der Befehle `curl`, `wget`, `ssh` und `scp`. Je Kanal: die Abrufwerkzeuge wirken (`deny` auf das Abrufverb); der Shell-Kanal nur für diese vier Programme – jedes andere netzfähige Programm (`python`, `node`, `git`, Bordmittel der Shell, ein eigenes Skript) ist nicht erfasst. Die Liste wird bewusst nicht verlängert: Jedes ergänzte Programm suggeriert eine Vollständigkeit, die ein Befehlsmuster nicht herstellen kann | `[TECHNISCH]` für die Abrufwerkzeuge; `[TEXTUELL]` für den Shell-Kanal | `[DOK]` **`QC-2`** (Zuordnung `K-62`). **Reichweite je Kanal gemessen am 2026-09-12** (`tests/protocols/2026-09-12-B04-B05-gegenpruefung.md`, B04) (Lauf B04-6). Wer eine vollständige Netzsperre braucht, betreibt den Agenten ohne automatische Befehlsausführung |
|
|
120
|
+
| B9 | Nutzerlokale Konfiguration kann nur verschärfen | – | `.claude/settings.local.json` rangiert über der Projektdatei, kann eine dort gesetzte Verweigerung aber nicht aufheben: „If a tool is denied at any level, no other level can allow it." Ergänzend greifen `deny`- und `ask`-Regeln sofort, `allow`-Regeln erst nach dem Vertrauen in den Ordner | `[TECHNISCH]` für die Verweigerungen; `[TEXTUELL]` für den Rest | [DOK] **`QC-2`, `QC-5`** (`docs/en/permissions`, `docs/en/settings`) (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`); **beobachtet am 2026-09-12** (`tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`), fünf Läufe gegen die **nutzerglobale** Datei `~/.claude/settings.json`, jeder mit Positivkontrolle: Projekt `deny` gegen Benutzer `allow` – nicht gelesen; Projekt `allow` gegen Benutzer `deny` – nicht gelesen; **ohne jede Verweigerung gelesen** (Kontrolllauf, ohne den die anderen nichts bedeuten). Ebenso wirkungslos blieb ein nutzerglobales `defaultMode: bypassPermissions`, mit und ohne projektseitiges `defaultMode`. **Die Zusage bestätigt sich – und das ist bemerkenswert, weil dieselbe Frage beim anderen Pack das Gegenteil ergab** (`ERH-11`, K-27: dort setzt sich die Benutzerkonfiguration in beide Richtungen durch). Gemessen sind die Mechaniken `deny` und `defaultMode`; für Verschärfungen anderer Art gilt die Aussage nicht |
|
|
121
|
+
| B10 | Externer Abruf auf freigegebene Domains beschränkbar | – | Keiner. Die Abbildung führt die Abrufwerkzeuge in `permission_tools_bare`: Ein Muster wird verworfen, die erzeugte Regel lautet `WebFetch` und `WebSearch` ohne Argument – das ganze Werkzeug, nicht ein Ziel. Eine Domain-Angabe ist damit nicht ausdrückbar. Ersatz: das vollständige Verbot, das dadurch entsteht und als Verbot `[TECHNISCH]` wirkt (B8) – es ist strenger als die Zusage, nicht schwächer, und deshalb kein Schutzverlust. Für eine Websuche gibt es überhaupt kein Domain-Ziel; auch ein künftiger Mechanismus könnte sie nicht abdecken | `[NICHT ABBILDBAR]` | `[DOK]` **`QC-2`** (Zuordnung `K-62`) für die Produktseite: Pfadregeln werden nur für `Read` und `Edit` ausgewertet, für andere Werkzeuge angenommen und **nie konsultiert** – ein Domänenmuster am Abrufwerkzeug hat deshalb keinen Ort. 🔴 **Bis 0.84.0 belegte diese Zelle gegen den eigenen Bestand** (`K-62`, 2026-09-22): Der Zusatz „für die Abbildung" nannte `permission_tools_bare` im Manifest und die erzeugte Datei (nachgeprüft am 2026-09-13) – beides Nachweise **des Frameworks über sich selbst**, während die Marke `[DOK]` „in der Herstellerdokumentation beschrieben" heißt. Die Abbildung ist damit nicht weniger belegt, sondern **anders**. Seit 0.33.0 sagt der Kern diese Beschränkung nicht mehr zu (B11, D-59) |
|
|
124
122
|
|
|
125
123
|
### H – Hooks
|
|
126
124
|
|
|
127
125
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
128
126
|
|---|---|---|---|---|
|
|
129
|
-
| H1 | Prüfung vor Werkzeugausführung | `hooks.PreToolUse` in `settings.json`, Matcher auf
|
|
130
|
-
| H2 | Prüfung kann
|
|
127
|
+
| H1 | Prüfung vor Werkzeugausführung | `hooks.PreToolUse` in `settings.json`, Matcher auf lesende, schreibende und ausführende Werkzeuge und auf MCP-Werkzeuge (`mcp__.*`). Bei einem MCP-Werkzeug prüft der Hook den Inhalt gegen die Secret-Muster und die Pfadfelder gegen die Secret-Pfade, nicht die Strukturpfade. Jede Entscheidung steht im Entscheidungsprotokoll `.git/koolie-hook.jsonl`, ohne Inhalt und Pfad | `[TECHNISCH]` | `[DOK]` **`QC-6`** (Zuordnung `K-62`, D-159); das Lesewerkzeug seit 0.25.0 (`CR-2026-030`, D-33) – bis dahin erreichte ein Lesezugriff den Hook nicht. **MCP gemessen am 2026-09-29** (2.1.284, Messreihe `1200`, `tests/protocols/2026-09-29-schutzschicht.md`): Ohne den Matcher erreichte ein Köderwert einen lokalen MCP-Server, und ein Dateisystem-Werkzeug las `.env`; mit ihm sperrte der Hook beides, und eine Notiz, die `.env` nur nennt, kam an. Die Wirkung im Projekt prüft `install.py --probe` (D-488) |
|
|
128
|
+
| H2 | Prüfung kann blockieren | Exit-Code 2 des Hook-Befehls blockiert die Ausführung, und zwar bevor die Berechtigungsregeln ausgewertet werden – ein blockierender Hook geht damit auch einer `allow`-Regel vor. Umgekehrt hebt eine Hook-Entscheidung keine `deny`- oder `ask`-Regel auf. Fail-closed: Das erzeugte Hook-Kommando trägt `--fail-closed`, eine Werkzeugeingabe, die der Hook nicht lesen kann, wird blockiert statt durchgelassen. Reichweite, gemessen am 2026-09-13: Der Hook erfasst auch die Werkzeugaufrufe eines Unteragenten und blockiert sie – nicht nur mit dem Matcher `*`, sondern auch mit der benannten Form `Edit\|Write\|NotebookEdit`, die `clientmap.py` aus `hook_tools` erzeugt. Der Unteragent ist kein Weg am Schutz-Hook vorbei. Ein Aufruf aus einem Unteragenten ist am Umschlag erkennbar: Er führt zusätzlich `agent_id` und `agent_type`. Nicht gemessen: derselbe Lauf mit dem Schutz-Hook des Frameworks in einer vollständigen Installation – gemessen ist ein synthetischer Sperr-Hook in der erzeugten Form | `[TECHNISCH]` | **Reichweite gemessen am 2026-09-13** (`tests/protocols/2026-09-13-erhebung-unteragent.md`, Läufe H1 bis H3 mit Gegenprobe); im Übrigen [DOK] **`QC-2`** `docs/en/permissions` (AP2, Clientversion 2.1.267) – **stärker belegt als beim Client Pack `devin-desktop`**, siehe Abschnitt 5 |
|
|
131
129
|
| H3 | Statusmeldung beim Sitzungsstart | `hooks.SessionStart`; das Kommando gibt `hookSpecificOutput.additionalContext` aus | `[TECHNISCH]` | **Gemessen am 2026-09-18** (`.koolie/core/tests/protocols/2026-09-18-sitzungstest-5.md` Abschnitt 4, D-176), an drei Bäumen, die sich in genau einem Schlüssel der Berechtigungsdatei unterscheiden. **Zustellung:** Die `additionalContext`-Zeichenkette des Hooks steht **wörtlich in der Sitzungsmitschrift** der beiden Läufe mit Hook und fehlt in dem ohne. **Wirkung:** Mit geschnittenem Regeltext blieb der Lauf **mit** Hook nur lesend und änderte **ohne** ihn `bestand.ts:15` – obwohl zwanzig Fundstellen derselben Regel im Baum blieben. **Grenze, und sie gehört in diese Zeile:** Das ist eine **Verhaltensdifferenz eines Paares**, keine Zusage – der Hook sperrt nichts, er liefert Text. Bis 0.65.0 war die Zeile mit `[DOK]` belegt; die Übergabe führte H3 unter *Ungemessenes*. **Zweite Messung desselben Tages, von der anderen Seite:** In einem Baum ohne Overlay hat genau dieser Hook (*„Status unbekannt → nur lesend"*) den Schreibversuch verhindert, den `FW-AK-02` messen sollte – **wer die Regelschicht für einen Zuschnitt entfernt, entfernt ihn mit** |
|
|
132
|
-
| H4 | Eingabeschema und Pfadidentität des Schutz-Hooks | Der Hook prüft ein
|
|
130
|
+
| H4 | Eingabeschema und Pfadidentität des Schutz-Hooks | Der Hook prüft ein Ereignis: JSON-Objekt, nicht leerer `tool_name`, `tool_input` als Objekt; alles andere gilt als unprüfbar und blockiert hier, weil dieses Pack `hook_fail_closed: true` führt. Geprüft wird die Operation, nicht der Umschlag – `transcript_path`, `cwd` und `session_id` sind kein Ziel. Pfadangaben werden gegen `cwd` aufgelöst und in aufgelöster Form noch einmal gegen die Muster gehalten; alle Pfadmuster sind groß-/kleinschreibungsunempfindlich. Eine Angabe in POSIX-Schreibweise (`/c/…`) löst der Hook unter Windows in beiden Lesarten auf, `C:\…` und `C:\c\…`, und die strengere gewinnt: Das Werkzeug `Write` dieses Clients legt `/c/lw-1201/msys-ziel/probe.txt` unter `C:\lw-1201\…` an (gemessen am 2026-09-30). Grenze, und sie gehört in diese Zeile: Ein Hook prüft vor dem Zugriff. Eine Verknüpfung, die zwischen Prüfung und Zugriff umgebogen wird, kann er nicht ausschließen – das kann nur die ausführende Dateischicht oder eine Isolation | `[TECHNISCH]`, mit benannter Zeitlücke | **Gemessen am 2026-09-13** (`tests/protocols/2026-09-13-B06-gegenpruefung.md`, Befund **B06**): Das Eingabeschema dieses Clients ist an 15 Hook-Aufzeichnungen belegt. Bis 0.33.0 blockierte der Hook hier **jeden** Schreibzugriff, weil `transcript_path` unter `~/.claude/projects/` liegt – am Client nachgemessen, mit Kontrolllauf. Prüfung 32 ruft den Hook seit 0.34.0 mit dem vollständigen Umschlag auf |
|
|
133
131
|
|
|
134
132
|
### A – Agentenprofile
|
|
135
133
|
|
|
136
134
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
137
135
|
|---|---|---|---|---|
|
|
138
|
-
| A1 | Rein lesendes Reviewprofil | `.claude/agents/
|
|
136
|
+
| A1 | Rein lesendes Reviewprofil | `.claude/agents/koolie-reviewer.md`, Frontmatter-Feld `tools` (ergänzend `disallowedTools`, das zuerst angewandt wird). Die Beschränkung wirkt technisch, und sie wirkt als Entfernung: Ein Profil mit `tools: Read, Grep, Glob` hatte kein Schreibwerkzeug im Vorrat, und `permission_denials` blieb leer – es ist keine Verweigerung, die man gegen eine Freigabe abwägt, sondern derselbe Mechanismus wie bei S3. Eine `allow`-Regel holt das Werkzeug nicht zurück. Und es kann sich nicht selbst erweitern (gemessen am 2026-09-13): Ein Profil mit `tools: Read, Grep, Glob` – genau die Form, die `koolie-reviewer` nach der Abbildung trägt – hat kein Startwerkzeug und konnte deshalb keinen weiteren Unteragenten starten, dessen Profil weniger beschränkt wäre. Ohne diesen Befund wäre die Zusage „rein lesend" über eine zweite Ebene aushebelbar. Die Zusage hängt allerdings daran, dass `agent_frontmatter.tool_names` kein Startwerkzeug abbildet – Prüfung 35 hält das fest, weil es sonst lautlos fallen könnte. Weiterhin nur dokumentiert und nicht gemessen: dass ein Profil, dessen `tools`-Liste sich zu keinem Werkzeug auflöst, gar nicht erst gestartet wird | `[TECHNISCH]` | **Gemessen am 2026-09-13** (`tests/protocols/2026-09-13-erhebung-unteragent.md`), Lauf A1-M gegen den Kontrolllauf A1-K: dasselbe Profil ohne das Feld schrieb. Zuvor `[DOK]` **`QC-4`** `docs/en/sub-agents` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) – der Teilsatz zum Startabbruch bleibt `[DOK]` **`QC-4`** |
|
|
139
137
|
|
|
140
138
|
### M – Modi und Sitzungsfreigaben
|
|
141
139
|
|
|
142
140
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
143
141
|
|---|---|---|---|---|
|
|
144
142
|
| M1 | Standardmodus fragt bei Schreiben und Befehlen zurück | `permissions.defaultMode` auf `default` | `[TECHNISCH]` | `[DOK]` **`QC-5`** (Zuordnung `K-62`) – `defaultMode` steht dort als Schlüssel der Einstellungsdatei |
|
|
145
|
-
| M2 | Modus ohne Rückfragen ausschließbar |
|
|
143
|
+
| M2 | Modus ohne Rückfragen ausschließbar | Untersagt (`03-security.md` Abschnitt 4) und technisch sperrbar: `permissions.disableBypassPermissionsMode` auf `"disable"`, in verwalteten Einstellungen nicht überschreibbar, wirkt aber aus jeder Ebene. Ab Clientversion 2.1.257 wirken `bypassPermissions` und `auto` nicht aus Projekt- oder nutzerlokalen Einstellungen. Offen: Ein Subagentenprofil kennt ein eigenes Feld `permissionMode`, das den Wert `bypassPermissions` annimmt; ob die Sperre auch dort greift, ist nicht dokumentiert (AP2-CC-12) | `[TECHNISCH]` (Sperre in verwalteten Einstellungen setzt eine Enterprise-Verwaltung voraus) | [DOK] **`QC-2`** `docs/en/permissions` (AP2, Clientversion 2.1.267, `tests/protocols/2026-09-10-AP2-claude-code.md`) |
|
|
146
144
|
| M3 | Freigabe auf die Sitzung begrenzbar | Rückfragen bieten eine einmalige und eine sitzungsweite Bestätigung an | `[TECHNISCH]` | `[DOK]` – 🔴 **QUELLE NICHT ZUGEORDNET** (`K-62`, 2026-09-22): Keine der sechs Seiten der Quellenliste führt die **Sitzungs-Grant-Stufen**; beim Schwesterpack trägt sie `QD-11`. Eine Zuordnung wäre hier **geraten, und eine geratene sähe wie ein Beleg aus** (D-156). ➡️ **Damit hat der nächste Durchgang von `FW-AK-01` seinen ersten gezielten Auftrag:** eine Zeile gegen eine Seite statt 44 gegen 22 |
|
|
147
|
-
| M4 | Eigener Planungsmodus für Modus M2 |
|
|
145
|
+
| M4 | Eigener Planungsmodus für Modus M2 | Unerhoben: ob der Client einen Planungsmodus mit eigener Plan-Ablage außerhalb des Repositorys führt. Bis dahin ist die Ablage von `koolie-plan` und `koolie-bugfix-prepare` die Sitzungsausgabe | `[TEXTUELL]` | **`BELEG OFFEN`** (2026-09-25, `K-149`): weder gemessen noch einer Quelle `QC-1` bis `QC-6` zugeordnet. **Unabhängig davon lässt sich M2 seit `1.20.2` an den Schutz-Hook binden** (`mandat.py modus M2 --ablage <pfad>`, D-501), **gemessen am 2026-09-30:** Der Hook wies `Write` auf `src/Neu.java` ab und ließ `docs/plaene/plan.md` durch (Entscheidungsprotokoll); danach fragte die Berechtigungsschicht zurück (`ask Edit(**)`). **Seit `1.23.0` lassen sich auch M3 bis M5 binden** (`mandat.py modus M3\|M4\|M5`, D-523), **gemessen am 2026-10-01** mit `haiku`: Gebunden ließ der Hook je Modus das Ziel in der Pfadliste durch und wies `Write` außerhalb ab – M3 mit `--umfang src/ui/**` auch einen Nur-Lese-Pfad und ein Ziel außerhalb des Umfangs, M4 den Produktivcode neben einer Testdatei aus `src/**/*.test.ts`; ohne Bindung ließ er beide Ziele durch (Entscheidungsprotokoll) |
|
|
148
146
|
|
|
149
147
|
### X – Externe Anbindung
|
|
150
148
|
|
|
151
149
|
| ID | Zusage des Frameworks | Mechanismus beim Client | Einstufung | Beleg |
|
|
152
150
|
|---|---|---|---|---|
|
|
153
|
-
| X1 | Keine externe Anbindung ohne Einzelfreigabe | Keine `.mcp.json` ausgeliefert, nur die `.example`-Vorlage; Rückfrageregel auf alle MCP-Werkzeuge | `[TECHNISCH]`,
|
|
151
|
+
| X1 | Keine externe Anbindung ohne Einzelfreigabe | Keine `.mcp.json` ausgeliefert, nur die `.example`-Vorlage; Rückfrageregel auf alle MCP-Werkzeuge | `[TECHNISCH]`, mit einer benannten Grenze | `[DOK]` **`QC-3`, `QC-5`** (`docs/en/skills`, `docs/en/settings`), Stand 2.1.275 (`FW-AK-01`, 2026-09-18). **Die Grenze:** Der Mechanismus deckt die Werkzeuganbindung. Seit 2.1.275 gibt es einen **zweiten** Kanal nach außen, den er nicht deckt – der Client lädt die im Konto des Anwenders eingeschalteten Skills und Erweiterungen in die Sitzung, *„This is enabled by default"*, mit Abgleich etwa alle zehn Minuten. **Und das Framework kann ihn nicht abschalten:** Der Schalter `syncClaudeAiSkills: false` wirkt aus verwalteten Einstellungen, aus `--settings`, aus der Benutzerdatei und aus der unversionierten Projektdatei – *„a `false` in `.claude/settings.json` is ignored"*, und genau diese Datei liefert dieses Pack aus. **Die Zusage gilt damit für die Werkzeuganbindung und nicht für die Kontoquelle**; wer sie schließen will, setzt den Schalter außerhalb des Repositoriums (`K-63`). Das Gegenstück, das das Framework **sehr wohl** liefern kann, steht in Abschnitt 8: `autoMemoryEnabled: false` (D-154). **Freigabe je Werkzeug, gemessen am 2026-09-28** (2.1.283, D-459): `mcp__<server>__<werkzeug>` in `allow` lässt ein Lesewerkzeug ohne Rückfrage laufen, ein Schreibwerkzeug in `ask` wird im Druckmodus abgewiesen – aber die Rückfrage `mcp__*`, die die Kernquelle erzeugt, **schlägt** die Einzelfreigabe. Gibt ein Projekt einen Server zum Lesen frei (Overlay Abschnitt 13.2), ersetzt der Mensch die Pauschale durch die Einzelregeln; Prüfung 101 gleicht ab (`mcp_permission_rule` im Manifest) |
|
|
154
152
|
| X2 | Art und Ort der Codebasis-Indexierung bekannt | Kein Indexierungsmechanismus dokumentiert; Dateien werden bei Bedarf gelesen | `[TECHNISCH]` | `[DOK]` **`QC-1` bis `QC-5`** – **Abwesenheit** belegt über `docs/en/memory`, `permissions`, `skills`, `sub-agents`, `settings`, Stand 2.1.267 (AP2), **erneut geprüft am 2026-09-18 gegen 2.1.275** (`FW-AK-01`): unverändert kein Indexierungsmechanismus dokumentiert. Ein Beleg durch Abwesenheit bleibt schwächer als ein Beleg |
|
|
155
153
|
|
|
156
154
|
## 3. Zusammenfassung der Durchsetzungstiefe
|
|
157
155
|
|
|
158
|
-
> **Zählregel (normativ für diese Tabelle):** Eine Zeile zählt bei ihrer
|
|
156
|
+
> **Zählregel (normativ für diese Tabelle):** Eine Zeile zählt bei ihrer schwächsten Einstufung. Trägt sie je Zugriffskanal zwei Angaben – `[TECHNISCH]` für direktes Lesen und Schreiben, `[TEXTUELL]` für Shell und Unterprozess –, zählt sie als `[TEXTUELL]`. Zugesagt wird je Kanal, was gemessen ist. Prüfung 31 rechnet die Summen aus der Matrix nach.
|
|
159
157
|
|
|
160
|
-
| Klasse | Anzahl | davon Kernzusagen |
|
|
161
|
-
|
|
162
|
-
| `[TECHNISCH]` | 22 von 32 | 3 von 6 (B1, B2, B6) |
|
|
163
|
-
| `[TEXTUELL]` | 8 von 32 (R5, R6, B9, M4; dazu B3, B4, B5, B8 – je Kanal teils technisch) | 3 von 6 (B3, B4, B5 – Shell und Unterprozess) |
|
|
164
|
-
| `[NICHT ABBILDBAR]` |
|
|
165
|
-
| ohne Einstufung | 0 von 32 | 0 |
|
|
166
|
-
|
|
167
|
-
Die Spalte „Stand vor AP2“ bezieht sich auf den kleineren Zeilensatz vor dem ersten Abgleich und wird nicht fortgeschrieben.
|
|
158
|
+
| Klasse | Anzahl | davon Kernzusagen |
|
|
159
|
+
|---|---|---|
|
|
160
|
+
| `[TECHNISCH]` | 22 von 32 | 3 von 6 (B1, B2, B6) |
|
|
161
|
+
| `[TEXTUELL]` | 8 von 32 (R5, R6, B9, M4; dazu B3, B4, B5, B8 – je Kanal teils technisch) | 3 von 6 (B3, B4, B5 – Shell und Unterprozess) |
|
|
162
|
+
| `[NICHT ABBILDBAR]` | 2 von 32 (S5, B10) | 0 |
|
|
163
|
+
| ohne Einstufung | 0 von 32 | 0 |
|
|
168
164
|
|
|
169
|
-
|
|
165
|
+
Alle sechs Kernzusagen sind abgebildet: B1, B2 und B6 technisch in jedem Kanal, B3, B4 und B5 nur für den direkten Zugriff; für Shell und Unterprozess trägt dort die Regelschicht.
|
|
170
166
|
|
|
171
|
-
|
|
167
|
+
S5 und B10 stehen auf `[NICHT ABBILDBAR]`. Für S5 gibt es kein Aufzählungskommando (erhoben am 2026-09-12), für B10 tragen die Abrufwerkzeuge kein Domainmuster. Beide sind keine Kernzusage; der Ersatz steht in der Zeile.
|
|
172
168
|
|
|
173
|
-
|
|
169
|
+
Mit `devin-desktop` lassen sich die Zahlen nur eingeschränkt vergleichen: Die Packs führen verschiedene Zeilensätze, und ihre Belege sind verschieden gewonnen.
|
|
174
170
|
|
|
175
|
-
**Belegstand:**
|
|
171
|
+
**Belegstand:** `BELEG OFFEN` steht bei M4. Offen ist außerdem eine Teilfrage in M2: ob die Sperre des Modus ohne Rückfragen auch für das Feld `permissionMode` eines Subagentenprofils gilt. In laufenden Sitzungen gemessen oder beobachtet sind S2, S3, S4, A1, B2 (zwei der drei Vorrangpaare), B6, B9, H2, H3 und H4; ihre Belegspalte nennt Datum und Protokoll. Die übrigen Zeilen sind gegen die Herstellerdokumentation und die erzeugten Artefakte belegt (`tests/protocols/2026-09-10-AP2-claude-code.md`, Abschnitt „Offen").
|
|
176
172
|
|
|
177
173
|
## 4. Kernzusagen ohne technische Durchsetzung
|
|
178
174
|
|
|
179
|
-
**Keine.** Alle sechs Kernzusagen (B1 bis B6) sind für den direkten Zugriff als `[TECHNISCH]` abgebildet, B1, B2 und B6 in jedem Kanal. Für B3, B4 und B5 tragen Shell und Unterprozess nur die Regelschicht
|
|
175
|
+
**Keine.** Alle sechs Kernzusagen (B1 bis B6) sind für den direkten Zugriff als `[TECHNISCH]` abgebildet, B1, B2 und B6 in jedem Kanal. Für B3, B4 und B5 tragen Shell und Unterprozess nur die Regelschicht (Matrix und Abschnitt 3).
|
|
180
176
|
|
|
181
|
-
|
|
177
|
+
B6 weicht in der Form ab, nicht in der Tiefe: Was das Muster trifft, setzt die Engine durch, auch gegen ein ausdrückliches `allow` (gemessen am 2026-09-17).
|
|
182
178
|
|
|
183
179
|
| ID | Abweichung | Wirkung |
|
|
184
180
|
|---|---|---|
|
|
185
|
-
| B6 | Befehlsverbote wirken präfixbasiert: `Bash(git reset:*)` sperrt
|
|
181
|
+
| B6 | Befehlsverbote wirken präfixbasiert: `Bash(git reset:*)` sperrt jedes Kommando, das mit der Zeichenfolge `git reset` beginnt, nicht nur `--hard` | Verschärfung und Lockerung zugleich, beide gemessen. *Verschärfung:* Die Abbildung verlangt, dass die Präfixform ein Präfix der wörtlichen Form ist, und weist sie sonst zurück. *Lockerung:* Eine andere Schreibweise desselben Befehls beginnt nicht mit der Zeichenfolge – `git -C <pfad> reset` ist nicht erfasst. Die Grenze steht in Matrixzeile B6 |
|
|
186
182
|
|
|
187
183
|
## 5. Bekannte Abweichungen im Verhalten
|
|
188
184
|
|
|
189
|
-
- **`model_decision` lädt hier unbedingt.**
|
|
190
|
-
|
|
191
|
-
- **Eine pfadgebundene Regel lädt beim Lesen einer passenden Datei, nicht bei jedem Werkzeugaufruf.** Ein Technology Pack steht damit nicht schon zu Beginn der Aufgabe im Kontext, sondern erst nach der ersten Berührung einer Datei seiner Technologie. Für Regeln, die vorher gelten müssen, ist `paths` ungeeignet; sie bleiben unbedingt. Nach einer Verdichtung des Kontexts lädt eine pfadgebundene Regel erst wieder, wenn erneut eine passende Datei gelesen wird.
|
|
185
|
+
- **`model_decision` lädt hier unbedingt.** Dieser Client kennt für Regeldateien nur die Bindung an Dateimuster. `10-privacy-security` und `15-development-rules`, die bei `devin-desktop` nur bei Relevanz laden, stehen hier deshalb stets im Kontext. Für die Regelwirkung ist das eine Verschärfung, für den Kontext eine ständige Belegung, die mit jedem unbedingt geladenen Pack wächst. Der Validator warnt ab 40.000 Zeichen.
|
|
192
186
|
|
|
193
|
-
- **
|
|
187
|
+
- **Eine pfadgebundene Regel lädt erst, wenn eine passende Datei gelesen wird** – nicht zu Beginn der Aufgabe und nach einer Verdichtung des Kontexts erst beim nächsten Lesen. Regeln, die vorher gelten müssen, bleiben unbedingt.
|
|
194
188
|
|
|
195
|
-
- **
|
|
189
|
+
- **Ein Glob-Muster kann still ins Leere greifen.** Ein `[`, das kein Klammerausdruck ist (`photos [2024/**`), macht das Muster ungültig; die übrigen Muster der Regel wirken weiter. Die `paths`-Liste einer Regel teilt sich ein Budget von 1.000 expandierten Mustern und 4 MiB; ein Muster darüber trifft ebenfalls nichts. Die Regel meldet ihr Nichtgreifen nicht – beim Schreiben eines Technology Packs beachten.
|
|
196
190
|
|
|
197
|
-
- **
|
|
191
|
+
- **Regeldateien sind nutzerlokal ausschließbar – eine Lücke in B9.** `claudeMdExcludes` in `.claude/settings.local.json` nimmt Anweisungs- und Regeldateien per Glob-Muster vom Laden aus; die Listen aller Ebenen werden zusammengeführt. Gemessen am 2026-09-25 mit Gegenlauf: Der Eintrag wirkt aus der nutzerlokalen Datei wie aus der Berechtigungsdatei. Das ist eine Lockerung, nach der Prioritätshierarchie unzulässig, technisch aber nicht verhindert. Der KI-Client kann die Datei nicht schreiben (`Edit(.claude/**)` steht in `deny`), ein Mensch schon. Nur verwaltete Einstellungen schützen davor.
|
|
198
192
|
|
|
199
|
-
|
|
193
|
+
- **Der Schutz-Hook läuft fail-closed.** Das Blockierverhalten über den Exit-Code ist dokumentiert und in einer Installation beobachtet. Das Manifest führt `hook_fail_closed: true`, und die Abbildung hängt dem Kommando des durchsetzenden Hooks `--fail-closed` an: Eine Werkzeugeingabe, die der Hook nicht als JSON lesen kann, wird blockiert.
|
|
200
194
|
|
|
201
|
-
|
|
195
|
+
Der Schalter steht im Kommando, nicht in `env`, weil nicht belegt ist, dass der Client Umgebungsvariablen an den Hook-Prozess weiterreicht. `FW_HOOK_FAIL_CLOSED` wirkt zusätzlich und erprobt fail-closed ohne Neuinstallation.
|
|
202
196
|
|
|
203
|
-
- **Die Berechtigungsdatei trägt hier auch die Hooks.**
|
|
197
|
+
- **Die Berechtigungsdatei trägt hier auch die Hooks.** Dieser Client kennt keine eigene Hook-Datei. Die Berechtigungsdatei ist Saat: Sie gehört nach der Erstinstallation dem Projekt, und `install.py --update` überschreibt sie nie. Eine Änderung an den Hooks des Kerns – auch das Argument `--fail-closed` – erreicht ein bestehendes Projekt deshalb nicht von selbst; Prüfung 17 meldet sie als Fehler und nennt den Weg. Beim Release-Wechsel von Hand prüfen.
|
|
204
198
|
|
|
205
|
-
- **Das Suchwerkzeug führt Punktdateien nicht auf.** Gemessen am 2026-09-12 (
|
|
206
|
-
|
|
207
|
-
**Folge für Nachweise.** Ein Abwesenheitsnachweis über dieses Werkzeug ist für Punktdateien keiner. Nummer 7 des Testkatalogs verlangt dafür eine Anwesenheitsprobe desselben Gegenstandstyps – eine zweite Punktdatei, die gefunden werden **muss**.
|
|
199
|
+
- **Das Suchwerkzeug führt Punktdateien nicht auf.** Gemessen am 2026-09-12 (`.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`): Zwei Muster meldeten `No files found` für eine Datei, die im Verzeichnis lag und im selben Lauf anders lesbar war. Ein Abwesenheitsnachweis über dieses Werkzeug ist für Punktdateien deshalb keiner; Nummer 7 des Testkatalogs verlangt eine Anwesenheitsprobe desselben Gegenstandstyps.
|
|
208
200
|
|
|
209
201
|
## 6. Beobachtung während der Erstellung
|
|
210
202
|
|
|
211
|
-
Beim Anlegen der Skills unter `.claude/skills/` hat die Sitzung, in der dieses Pack entstand, die
|
|
212
|
-
|
|
213
|
-
Dieselbe Beobachtung deckte einen Konvertierungsfehler auf: Die Skills erschienen zunächst mit einer Beschreibung, die aus dem Dateikörper statt aus dem Frontmatter stammte. Ursache war ein Rest der Devin-Frontmatter-Felder, der beim Umschreiben stehen geblieben war. Der Fehler wäre bei einer rein statischen Prüfung nicht aufgefallen – die Konvertierung prüft seitdem nach dem Umschreiben, dass nur dokumentierte Felder übrig sind.
|
|
203
|
+
Beim Anlegen der Skills unter `.claude/skills/` hat die Sitzung, in der dieses Pack entstand, die Skills selbsttätig erkannt und angeboten. Das stützt S1 über die Dokumentation hinaus, ist aber keine Belegprüfung im Sinne des Testkatalogs.
|
|
214
204
|
|
|
215
|
-
|
|
205
|
+
Die Konvertierung prüft nach dem Umschreiben, dass im Frontmatter nur Felder stehen, die dieser Client dokumentiert. Ein fremdes Feld lässt die Beschreibung sonst aus dem Dateikörper statt aus dem Frontmatter erscheinen.
|
|
216
206
|
|
|
217
207
|
## 7. Installation und Prüfung
|
|
218
208
|
|
|
@@ -222,39 +212,34 @@ Aus dem entpackten Archiv – über den Starter `install.cmd` (Windows) beziehun
|
|
|
222
212
|
python .koolie/core/install.py --target <projekt> --client claude-code
|
|
223
213
|
```
|
|
224
214
|
|
|
225
|
-
Ohne `--client` gilt bei einer Erstinstallation das Standardpack `devin-desktop`;
|
|
215
|
+
Ohne `--client` gilt bei einer Erstinstallation das Standardpack `devin-desktop`; für dieses Pack ist die Angabe also nötig. `--update` hebt ein vorhandenes Projekt. Liegt der Kern schon unter `.koolie/core/` im Projekt, installiert der Aufruf aus der Projektwurzel; danach prüft der Validator:
|
|
226
216
|
|
|
227
217
|
```text
|
|
228
218
|
python .koolie/core/install.py --client claude-code
|
|
229
219
|
python .koolie/core/tests/scripts/validate-framework.py
|
|
230
220
|
```
|
|
231
221
|
|
|
232
|
-
Vor der ersten produktiven Nutzung
|
|
222
|
+
Vor der ersten produktiven Nutzung die Basistests des Testkatalogs (`.koolie/core/tests/TEST_CATALOG.md`, Kennzeichnung „Basis") gegen diesen Client fahren und protokollieren.
|
|
233
223
|
|
|
234
224
|
### Pfadregeln nur für `Read` und `Edit` (AP2-CC-02)
|
|
235
225
|
|
|
236
|
-
Der Client wertet Pfadregeln
|
|
237
|
-
`Write`, `NotebookEdit`, `Glob` oder `MultiEdit` wird angenommen, nie konsultiert und beim
|
|
238
|
-
Sitzungsstart als Warnung gemeldet. Die Abbildung bildet deshalb `write` auf `Edit` ab und
|
|
239
|
-
`search` auf nichts (`CR-2026-016`, D-26). Der Validator meldet eine Pfadregel für ein Werkzeug
|
|
240
|
-
ohne Pfadauswertung als Fehler (`permission_path_tools` im Manifest).
|
|
226
|
+
Der Client wertet Pfadregeln nur für `Read` und `Edit` aus. Eine Pfadregel für `Write`, `NotebookEdit`, `Glob` oder `MultiEdit` wird angenommen, nie konsultiert und beim Sitzungsstart als Warnung gemeldet. Die Abbildung bildet deshalb `write` auf `Edit` ab und `search` auf nichts; der Validator meldet eine Pfadregel für ein Werkzeug ohne Pfadauswertung als Fehler (`permission_path_tools` im Manifest).
|
|
241
227
|
|
|
242
|
-
|
|
243
|
-
Werkzeugnamens `Write` wirkt überall.
|
|
228
|
+
Eine Regel ohne Pfad wirkt dagegen überall: Eine Verweigerung des bloßen Werkzeugnamens `Write` sperrt das Werkzeug.
|
|
244
229
|
|
|
245
230
|
## 8. Anweisungs- und Konfigurationsquellen außerhalb des Projekts
|
|
246
231
|
|
|
247
|
-
Was dieser Client aus Ablagen
|
|
232
|
+
Was dieser Client aus Ablagen außerhalb des Repositoriums lädt. Solche Quellen haben nach Regel 2.6 der Prioritätshierarchie keine Ebene: Sie dürfen einschränken, nie über die Ebenen 1 bis 4 hinaus erweitern und keine Governance-, Datenschutz- oder Sicherheitsregeln setzen.
|
|
248
233
|
|
|
249
|
-
**Erhebungsstand
|
|
234
|
+
**Erhebungsstand:** 2026-09-11 mit 2.1.268 in einer frischen Installation, dazu die Schlüssel (ohne Werte) der nutzerglobalen Einstellungsdatei (`tests/protocols/2026-09-11-erhebungen-K21-K26.md`). Ergänzt am 2026-09-12 (Skill-Ablage, `tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`), am 2026-09-18 gegen 2.1.275 (`FW-AK-01`; Abschnitt 8a, Zeilen S4, S5, X1) und am 2026-09-29 gegen 2.1.284 (Connectoren des Kontos, `tests/protocols/2026-09-29-schutzschicht.md`).
|
|
250
235
|
|
|
251
236
|
### 8.1 Anweisungsquellen
|
|
252
237
|
|
|
253
238
|
| Quelle | Ladebedingung | Belegstatus | Maßnahme des Frameworks |
|
|
254
239
|
|---|---|---|---|
|
|
255
|
-
| `<Elternverzeichnis>\CLAUDE.md` | lädt zusätzlich zur Anweisungsdatei des Projekts, in jedes darunterliegende Projekt | **Gemessen
|
|
240
|
+
| `<Elternverzeichnis>\CLAUDE.md` | lädt zusätzlich zur Anweisungsdatei des Projekts, in jedes darunterliegende Projekt | **Gemessen**: Ohne Einstellung lud die Sitzung **zwei** `CLAUDE.md` – die des Projekts und eine aus einem Elternverzeichnis, die mit dem Projekt nichts zu tun hat. Die Quelle ist nicht an das Benutzerprofil gebunden; ein Elternverzeichnis genügt | keine Vorgabe (R6). `claudeMdExcludes` in der Berechtigungsdatei nimmt sie aus, wenn ein Projekt das will – **empfohlen, nicht ausgeliefert**; derselbe Eintrag wirkt auch nutzerlokal (Abschnitt 5, gemessen) |
|
|
256
241
|
| `~\.claude\CLAUDE.md` | laut Herstellerdokumentation nutzerglobale Anweisungsdatei | **Nicht belegt.** Die Datei existiert auf der Messstation nicht; ob diese Ablage zusätzlich lädt, ist damit unbekannt – nicht verneint | keine |
|
|
257
|
-
| `~\.claude\skills\` | Skill-Ablage im Benutzerprofil, lädt in jedes Projekt mit | **Gemessen am 2026-09-12** (S5): 67 Skills standen in einer Sitzung, deren Projekt keinen davon enthält. Seit 2.1.275 tritt die Kontoquelle `~/.claude/skills/synced/` hinzu, standardmäßig an (`FW-AK-01
|
|
242
|
+
| `~\.claude\skills\` | Skill-Ablage im Benutzerprofil, lädt in jedes Projekt mit | **Gemessen am 2026-09-12** (S5): 67 Skills standen in einer Sitzung, deren Projekt keinen davon enthält. Seit 2.1.275 tritt die Kontoquelle `~/.claude/skills/synced/` hinzu, standardmäßig an (`FW-AK-01`) | keine; `--list-skills` sieht diese Ablagen nicht (S5). Die Kontoquelle lässt sich aus der ausgelieferten Datei nicht abschalten (X1, Abschnitt 8a) |
|
|
258
243
|
|
|
259
244
|
### 8.2 Konfigurationsquellen
|
|
260
245
|
|
|
@@ -264,86 +249,44 @@ Berechtigungen, Hooks und Einstellungen außerhalb des Repositoriums betreffen g
|
|
|
264
249
|
|---|---|---|
|
|
265
250
|
| `~\.claude\settings.json` (nutzerglobal) | führt **Berechtigungen und Hooks**: am 2026-09-11 sechs `allow`-Regeln sowie `SessionStart`-, `PreToolUse`- und `PostToolUse`-Hooks | **Gemessen** (ERH-07), Schlüssel ausgelesen, Werte nicht. Ein Hook von dort läuft vor jedem Werkzeugaufruf – dieselbe Stelle, an der die zweite Linie des Frameworks steht |
|
|
266
251
|
| `<Elternverzeichnis>\.claude\settings.local.json` | nutzerlokale Einstellungsdatei **über** dem Projekt | **Gemessen** (ERH-07) |
|
|
267
|
-
| Connectoren des claude.ai-Kontos | MCP-Server, die im Konto des Anwenders verbunden sind, stehen mit ihren Werkzeugen – darunter schreibende – in **jeder** Sitzung, auch im Messbaum; sie verbinden sich nebenläufig nach dem Start | **Gemessen am 2026-09-29** (2.1.284, ohne Modellaufruf
|
|
252
|
+
| Connectoren des claude.ai-Kontos | MCP-Server, die im Konto des Anwenders verbunden sind, stehen mit ihren Werkzeugen – darunter schreibende – in **jeder** Sitzung, auch im Messbaum; sie verbinden sich nebenläufig nach dem Start | **Gemessen am 2026-09-29** (2.1.284, ohne Modellaufruf): In der Startmeldung stehen die Server mit der Quelle `claudeai`. **Abschalten aus dem Projekt:** `mcp__claude_ai_*` in `permissions.deny` nimmt alle ihre Werkzeuge aus der Sitzung, ein projekteigener Server bleibt – **empfohlen, nicht ausgeliefert**, weil `deny` auch eine Freigabe nach Overlay 13.2 schlüge. `env` in der Projektdatei schaltet sie **nicht** ab, mit und ohne Vertrauen; die Umgebungsvariable `ENABLE_CLAUDEAI_MCP_SERVERS=false` beim Start tut es. Die Rückfrage `mcp__*` fängt ihre Aufrufe auch im Modus `bypassPermissions` (Druckmodus, gemessen). `install.py --probe` warnt, solange sie in der Sitzung stehen (M1) |
|
|
268
253
|
| Vertrauen in das Verzeichnis (`~\.claude.json`) | Ohne Vertrauen werden die `allow`-Regeln des Projekts ignoriert – der Client meldet es beim Sitzungsstart | **Gemessen** (`AP2-CC-14`, ERH-06): „Ignoring 6 permissions.allow entries from .claude/settings.json: this workspace has not been trusted." `deny`- und `ask`-Regeln sowie die Regeltexte bleiben davon unberührt |
|
|
269
254
|
|
|
270
255
|
### 8.3 Was dieser Abschnitt nicht leistet
|
|
271
256
|
|
|
272
|
-
**Eine Auskunft ist keine Schranke.** Dieser Abschnitt macht die Quellen sichtbar
|
|
257
|
+
**Eine Auskunft ist keine Schranke.** Dieser Abschnitt macht die Quellen sichtbar, verhindert sie aber nicht; das Framework liest das Benutzerprofil nicht und sperrt dort nichts.
|
|
273
258
|
|
|
274
|
-
**Ein Abwesenheitsbeleg altert.** Der Erhebungsstand
|
|
259
|
+
**Ein Abwesenheitsbeleg altert.** Der Erhebungsstand gilt bis zur nächsten Clientversion. Prüfung 19 prüft, dass diese Auskunft da ist, nicht, dass sie stimmt.
|
|
275
260
|
|
|
276
|
-
**Die Liste ist nicht vollständig
|
|
261
|
+
**Die Liste ist belegt, nicht vollständig.** Eine Anweisungsquelle steht ausdrücklich auf „nicht belegt" – ein Ergebnis, keine Lücke.
|
|
277
262
|
|
|
278
|
-
**Das Entscheidungsprotokoll des Schutz-Hooks ist kein Nachweis gegen den Agenten
|
|
263
|
+
**Das Entscheidungsprotokoll des Schutz-Hooks ist kein Nachweis gegen den Agenten.** Es liegt unter `.git/`, der Agent kann es über die Shell ändern, und eine Eingabe, die der Hook nicht lesen kann, hinterlässt keine Zeile.
|
|
279
264
|
|
|
280
265
|
### 8a. Die selbstgeschriebene Anweisungsquelle des Clients – abgeschaltet
|
|
281
266
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
`
|
|
291
|
-
Manifest unter `settings_extra`, geprüft von Prüfung 54). Der Grund ist kein
|
|
292
|
-
Geschmack: Ein Anweisungstext, der in jeder Sitzung steht, gehört in die
|
|
293
|
-
Prioritätshierarchie – er ist sonst weder versioniert noch gegengezeichnet, der
|
|
294
|
-
Validator sieht ihn nicht, und kein Review erreicht ihn.
|
|
295
|
-
|
|
296
|
-
**Es ist ein Standard, keine Schranke.** `.claude/settings.local.json` hat höheren
|
|
297
|
-
Vorrang; ein Projekt, das die Quelle braucht, holt sie dort zurück und weist die
|
|
298
|
-
Abweichung aus – dieselbe Bauform wie bei D-10.
|
|
299
|
-
|
|
300
|
-
**Reichweite, gemessen:** `install.py --update` führt
|
|
301
|
-
`.claude/settings.json` unter *Projektdateien unberührt gelassen* – die Datei trägt
|
|
302
|
-
Projektwerte und wird von einem Update nie überschrieben. **Der Schlüssel erreicht jede
|
|
303
|
-
Erstinstallation und kein bestehendes Projekt.** Wer ein Projekt hebt, trägt die Zeile
|
|
304
|
-
von Hand nach.
|
|
305
|
-
|
|
306
|
-
**Der Gegenfall, der nicht geht:** Für die Kontoquelle der Skills
|
|
307
|
-
(`syncClaudeAiSkills`) gibt es diesen Weg nicht. Die Herstellerdokumentation nimmt
|
|
308
|
-
für diesen Schlüssel die versionierte Projektdatei ausdrücklich aus – *„a `false` in
|
|
309
|
-
`.claude/settings.json` is ignored"*. **Damit hat das Framework für diesen einen
|
|
310
|
-
Kanal keinen Ort, an dem seine Entscheidung ankommt**; es bleibt beim Benennen in
|
|
311
|
-
`X1` und `S5` (`K-63`).
|
|
267
|
+
Neben Wurzel-Anweisungsdatei und Regelablage führt dieser Client eine dritte Anweisungsquelle, die er selbst schreibt: Notizen unter `~/.claude/projects/<projekt>/memory/`, deren Index `MEMORY.md` mit den ersten 200 Zeilen beziehungsweise 25 KB in jede Sitzung geladen wird. *„Auto memory is on by default."* (`QC-1`, erhoben in `FW-AK-01` am 2026-09-18).
|
|
268
|
+
|
|
269
|
+
**Das Framework schaltet sie ab:** Die erzeugte Berechtigungsdatei trägt auf oberster Ebene `autoMemoryEnabled: false` (im Manifest unter `settings_extra`, geprüft von Prüfung 54). Ein Anweisungstext, der in jeder Sitzung steht, gehört in die Prioritätshierarchie; diese Notizen sind weder versioniert noch geprüft.
|
|
270
|
+
|
|
271
|
+
Es ist ein Standard, keine Schranke: `.claude/settings.local.json` hat Vorrang. Ein Projekt, das die Quelle braucht, schaltet sie dort ein und weist die Abweichung aus.
|
|
272
|
+
|
|
273
|
+
**Reichweite:** `install.py --update` lässt `.claude/settings.json` unberührt, weil sie Projektwerte trägt. Der Schlüssel erreicht jede Erstinstallation, aber kein bestehendes Projekt; wer hebt, trägt ihn von Hand nach.
|
|
274
|
+
|
|
275
|
+
Für die Kontoquelle der Skills (`syncClaudeAiSkills`) gibt es diesen Weg nicht: Die Herstellerdokumentation nimmt die versionierte Projektdatei für diesen Schlüssel aus – *„a `false` in `.claude/settings.json` is ignored"*. Das Framework kann diesen Kanal nur benennen (`X1`, `S5`).
|
|
312
276
|
|
|
313
277
|
### 8b. Die Attributionsvorgabe des Clients für Commits – abgeschaltet
|
|
314
278
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
Zeile in der Beschreibung eines Merge Requests ist ein Vermerk an der Stelle, die Q5
|
|
327
|
-
dafür vorsieht.
|
|
328
|
-
|
|
329
|
-
🔴 **Die Objektform ist Absicht, nicht Umständlichkeit.** Die Kurzform
|
|
330
|
-
`"attribution": false` kennt der Client erst ab 2.1.281, und ältere Stände **verwerfen
|
|
331
|
-
die ganze Einstellungsdatei**, die sie enthält (`QC-7`) – mit allen Berechtigungen und
|
|
332
|
-
Hooks. Die Zielspanne dieses Packs ist `2.1.x`.
|
|
333
|
-
|
|
334
|
-
**Beobachtbar ohne Modellurteil:** Das Sitzungstranskript trägt eine Anlage vom Typ
|
|
335
|
-
`remote_session_change` mit dem Feld `commit` – der Text, den der Client dem Modell als
|
|
336
|
-
Attribution vorgibt. In allen 51 Läufen von `1.14.1` stand dort der Trailer; mit der
|
|
337
|
-
Einstellung steht dort die leere Zeichenkette (D-433, gemessen im Nachlauf von
|
|
338
|
-
`1.14.2`).
|
|
339
|
-
|
|
340
|
-
**Es ist ein Standard, keine Schranke** – wie in 8a: `.claude/settings.local.json` und
|
|
341
|
-
verwaltete Einstellungen haben Vorrang. Die Einstellung ist eine Anweisung an das
|
|
342
|
-
Modell, keine Nachbearbeitung von `git commit`.
|
|
343
|
-
|
|
344
|
-
**Reichweite:** wie in 8a – jede Erstinstallation, kein bestehendes Projekt. Seit
|
|
345
|
-
`1.14.2` meldet `install.py --update` einen deklarierten Zusatzschlüssel, der in der
|
|
346
|
-
vorhandenen Einstellungsdatei fehlt (D-434); nachtragen muss ihn weiter der Mensch.
|
|
279
|
+
Der Client gibt dem Modell eine Vorgabe für Commits mit: einen Trailer `Co-Authored-By` mit einer Adresse des Herstellers, in Cloud- und Remote-Control-Sitzungen zusätzlich `Claude-Session` (`QC-7`). Das Modell übernahm sie in Commit-Vorschläge von `koolie-change-small`, obwohl der Skill Q5 nennt. Q5 verlangt eine Nachricht, die das Warum beschreibt; der Vermerk der KI-Nutzung gehört in den Merge Request.
|
|
280
|
+
|
|
281
|
+
**Das Framework schaltet sie ab:** Die erzeugte Berechtigungsdatei trägt auf oberster Ebene `"attribution": {"commit": "", "sessionUrl": false}` (im Manifest unter `settings_extra`, geprüft von Prüfung 54). `pr` bleibt unberührt – die Zeile in der Beschreibung eines Merge Requests ist der Ort, den Q5 vorsieht.
|
|
282
|
+
|
|
283
|
+
⚠️ Die Kurzform `"attribution": false` kennt der Client erst ab 2.1.281; ältere Stände verwerfen die ganze Einstellungsdatei mit allen Berechtigungen und Hooks (`QC-7`). Deshalb steht hier die Objektform – die Zielspanne ist `2.1.x`.
|
|
284
|
+
|
|
285
|
+
Beobachtbar ohne Modellurteil: Das Sitzungstranskript trägt eine Anlage `remote_session_change` mit dem Feld `commit`, dem Text, den der Client als Attribution vorgibt. Mit der Einstellung steht dort die leere Zeichenkette.
|
|
286
|
+
|
|
287
|
+
Es ist ein Standard, keine Schranke: `.claude/settings.local.json` und verwaltete Einstellungen haben Vorrang. Die Einstellung ist eine Anweisung an das Modell, keine Nachbearbeitung von `git commit`.
|
|
288
|
+
|
|
289
|
+
**Reichweite:** wie in 8a. `install.py --update` meldet einen deklarierten Zusatzschlüssel, der in der vorhandenen Einstellungsdatei fehlt; nachtragen muss ihn der Mensch.
|
|
347
290
|
|
|
348
291
|
## 9. Änderungsverlauf
|
|
349
292
|
|
|
@@ -352,7 +295,7 @@ vorhandenen Einstellungsdatei fehlt (D-434); nachtragen muss ihn weiter der Mens
|
|
|
352
295
|
| 0.22.0 | 2026-09-18 | **H3 ist gemessen – von `[DOK]` auf eine Messung mit benannter Grenze** (`CR-2026-091`, D-176). Die Statusmeldung des `SessionStart`-Hooks erreicht die Sitzung – ihre `additionalContext`-Zeichenkette steht wörtlich in der Mitschrift –, **und sie steuert**: Mit geschnittenem Regeltext blieb der Lauf mit Hook nur lesend und änderte ohne ihn eine Produktivzeile. Die Grenze steht in der Zeile: eine Verhaltensdifferenz, keine Zusage | `<FRAMEWORK_OWNER>` |
|
|
353
296
|
| 0.23.0 | 2026-09-19 | 🔴 **Zeile S2 führte zwei Wege als einen, und für einen davon war sie falsch (`CR-2026-094`, D-187).** Der Aufruf mit Schrägstrich ist eine Slash-Befehls-Erweiterung ohne Werkzeugmeldung; die drei Grenzen gelten für den modellseitigen Aufruf, den die Erhebung vom 2026-09-14 gemessen hat. **Zeile S3 nennt seither, was in der Mitschrift steht** (D-188): `command_permissions` trägt genau die Werkzeuge aus `allowed-tools`, und zwei Läufe haben `Bash` aufgerufen, obwohl der Skill es sperrt (`K-73`) | `<FRAMEWORK_OWNER>` |
|
|
354
297
|
| 0.24.0 | 2026-09-22 | 🟢 **Die Markerform ist abgeschafft; die Vorbemerkung nennt `BELEG OFFEN`** (`CR-2026-121`, D-291). 🔴 **Und der Belegstand dieses Packs war seit `0.62.0` falsch** (D-297): Er sagte *„Eine Zeile trägt einen VERIFY-Marker – R5"*, während **der Änderungsverlauf desselben Packs** die Auflösung dieses Markers seit Pack-Version `0.21.0` führt (D-158) und **keine Fundstelle die Form trug** – *die Zusage, deren Widerlegung im eigenen Dokument steht.* **Richtig ist: keine.** Zwei weitere Zahlen desselben Absatzes waren überholt: *„9 von 36"* für das Schwesterpack (richtig: 1) und der Satz, dort sei *„keine einzige Einstufung gegen eine Installation geprüft"* – seit `0.53.0` überholt, seit `0.86.0` grob falsch | `<FRAMEWORK_OWNER>` |
|
|
355
|
-
| 0.24.3 | 2026-09-25 | Zeile M4 (Planungsmodus) ergänzt, auf die `
|
|
298
|
+
| 0.24.3 | 2026-09-25 | Zeile M4 (Planungsmodus) ergänzt, auf die `koolie-plan` und `koolie-bugfix-prepare` für die Planablage verweisen: `[TEXTUELL]`, `BELEG OFFEN`; Summen und Belegstand nachgezogen (`CR-2026-147`, D-402, K-149) | `<FRAMEWORK_OWNER>` |
|
|
356
299
|
| 0.24.4 | 2026-09-26 | Vorbemerkung des B-Blocks: **die Startort-Bedingung**, gemessen mit Clientversion 2.1.283 – im Unterverzeichnis mit eigenem Repositorium lädt die Wurzel-Anweisung, Berechtigungen und Hooks nicht; eine eigene Installation dort trägt (`CR-2026-148`, D-408) | `<FRAMEWORK_OWNER>` |
|
|
357
300
|
| 0.24.5 | 2026-09-26 | Abschnitt 8b: **die Attributionsvorgabe des Clients für Commits abgeschaltet** – `attribution` in Objektform auf der obersten Ebene der Einstellungsdatei, weil die Kurzform `false` ältere Stände der Zielspanne die ganze Datei verwerfen lässt; Quelle `QC-7` (`CR-2026-153`, D-433, K-171) | `<FRAMEWORK_OWNER>` |
|
|
358
301
|
| 0.14.0 | 2026-09-13 | **S3 ist zurückgewonnen – von `[NICHT ABBILDBAR]` auf `[TECHNISCH]` mit drei benannten Grenzen** (`CR-2026-057`, D-64 bis D-66). `disallowed-tools` ist **gemessen** eine echte Werkzeugsperre je Skill und schlägt sogar eine ausdrückliche `allow`-Regel; `permissions.deny` der Quelle wird darauf abgebildet, die Werkzeugnamen kommen aus `hook_tools`. Die drei Grenzen – Turnbereich, Aufzählung, keine Argumentmuster – stehen in der Zeile, im Arbeitsmodell und in der Grenzfalltabelle. **Ein Argumentmuster wirkt lautlos gar nicht**; Prüfung 33 weist es ab | `<FRAMEWORK_OWNER>` |
|
|
@@ -381,3 +324,4 @@ vorhandenen Einstellungsdatei fehlt (D-434); nachtragen muss ihn weiter der Mens
|
|
|
381
324
|
| 0.26.3 | 2026-10-01 | **Die Modusbindung M3 bis M5 ist gemessen** (`CR-2026-169`, D-523, `K-201`). Zeile M4: je ein Lauf M3, M4, M5 und ein Kontrolllauf ohne Bindung; Zeile S3: die Sperre eines Skills gilt nur in seinem Turn (D-525) | `<FRAMEWORK_OWNER>` |
|
|
382
325
|
| 0.26.4 | 2026-10-01 | **Ein lesender Befehl in keinem Korb ist gemessen** (`CR-2026-172`, D-537, `K-208`). Zeile B2: ohne Eintrag lief `git ls-files` im Druckmodus ohne Rückfrage, mit `deny` wurde er abgewiesen – der Client gibt lesende Befehle selbst frei | `<FRAMEWORK_OWNER>` |
|
|
383
326
|
| 0.26.1 | 2026-09-30 | **Die POSIX-Schreibweise und die Schreibweise der Muster sind gemessen** (`CR-2026-163`, D-491, D-492, `K-92`, `K-96`). Zeile B3: Die Berechtigungsschicht dieses Clients unterscheidet unter Windows nicht zwischen Groß- und Kleinschreibung. Zeile H4: Der Hook löst `/c/…` in beiden Lesarten auf; der Client liest sie als `C:\…` | `<FRAMEWORK_OWNER>` |
|
|
327
|
+
| 0.27.0 | 2026-10-02 | Sprachlich überarbeitet; Zusagen, Einstufungen und Belege unverändert | `<FRAMEWORK_OWNER>` |
|