@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.
Files changed (232) hide show
  1. package/.github/workflows/publish.yml +177 -0
  2. package/.koolie/QUELLREPOSITORIUM.md +9 -14
  3. package/.koolie/core/CHANGELOG.md +59 -0
  4. package/.koolie/core/LICENSE-HINWEIS.md +5 -6
  5. package/.koolie/core/OWNERS.md +2 -2
  6. package/.koolie/core/VERSION +1 -1
  7. package/.koolie/core/build/doc/00-kopf.md +6 -6
  8. package/.koolie/core/build/doc/01-executive-summary.md +8 -8
  9. package/.koolie/core/build/doc/03-ziele-nichtziele.md +2 -2
  10. package/.koolie/core/build/doc/04-geltungsbereich.md +4 -4
  11. package/.koolie/core/build/doc/05-glossar.md +3 -3
  12. package/.koolie/core/build/doc/07-architektur.md +2 -2
  13. package/.koolie/core/build/doc/07a-abbildungsschicht.md +9 -9
  14. package/.koolie/core/build/doc/08-trennung.md +3 -3
  15. package/.koolie/core/build/doc/09-betriebsmodi.md +8 -8
  16. package/.koolie/core/build/doc/15-referenzstruktur.md +56 -27
  17. package/.koolie/core/build/doc/16-agentenanweisung.md +2 -2
  18. package/.koolie/core/build/doc/20-referenz-skills.md +46 -46
  19. package/.koolie/core/build/doc/25-governance.md +9 -1
  20. package/.koolie/core/build/doc/26-qs-test.md +32 -3
  21. package/.koolie/core/build/doc/27-pilot.md +2 -2
  22. package/.koolie/core/build/doc/28-uebernahme.md +9 -1
  23. package/.koolie/core/build/doc/30-roadmap.md +3 -1
  24. package/.koolie/core/build/doc/31-anhaenge.md +1 -1
  25. package/.koolie/core/checklists/01-preflight.md +3 -3
  26. package/.koolie/core/checklists/02-privacy-context.md +1 -1
  27. package/.koolie/core/checklists/03-before-code-change.md +2 -2
  28. package/.koolie/core/checklists/04-review-ai-code.md +1 -1
  29. package/.koolie/core/checklists/05-testing.md +1 -1
  30. package/.koolie/core/checklists/06-security.md +1 -1
  31. package/.koolie/core/checklists/08-merge-request.md +1 -1
  32. package/.koolie/core/checklists/09-onboarding.md +2 -2
  33. package/.koolie/core/checklists/10-project-adoption.md +8 -8
  34. package/.koolie/core/checklists/11-framework-release.md +14 -14
  35. package/.koolie/core/clientmap.py +2 -2
  36. package/.koolie/core/clients/README.md +54 -52
  37. package/.koolie/core/clients/_template/CLIENT_PACK.md +19 -19
  38. package/.koolie/core/clients/claude-code/CLIENT_PACK.md +108 -164
  39. package/.koolie/core/clients/claude-code/manifest.json +5 -5
  40. package/.koolie/core/clients/claude-code/root-template/.claude/README.md +9 -9
  41. package/.koolie/core/clients/cursor/CLIENT_PACK.md +66 -60
  42. package/.koolie/core/clients/cursor/manifest.json +3 -3
  43. package/.koolie/core/clients/cursor/root-template/.cursor/README.md +3 -3
  44. package/.koolie/core/clients/devin-desktop/CLIENT_PACK.md +62 -64
  45. package/.koolie/core/clients/devin-desktop/manifest.json +5 -5
  46. package/.koolie/core/clients/devin-desktop/root-template/.devin/README.md +9 -9
  47. package/.koolie/core/clients/kiro/CLIENT_PACK.md +55 -48
  48. package/.koolie/core/clients/kiro/manifest.json +4 -4
  49. package/.koolie/core/clients/kiro/root-template/.kiro/README.md +3 -3
  50. package/.koolie/core/clients/openai-codex/CLIENT_PACK.md +98 -103
  51. package/.koolie/core/clients/openai-codex/manifest.json +3 -3
  52. package/.koolie/core/clients/openai-codex/root-template/.codex/README.md +2 -2
  53. package/.koolie/core/decision-trees/02-may-ai-do-task.md +2 -2
  54. package/.koolie/core/decision-trees/03-analyze-or-modify.md +12 -12
  55. package/.koolie/core/decision-trees/04-required-review.md +1 -1
  56. package/.koolie/core/docs/ADOPTION_GUIDE.md +281 -385
  57. package/.koolie/core/docs/DOCUMENTATION_STANDARD.md +44 -36
  58. package/.koolie/core/docs/PLACEHOLDER_REGISTRY.md +8 -8
  59. package/.koolie/core/docs/ROADMAP.md +34 -17
  60. package/.koolie/core/docs/RUNTIME_GLOSSARY.md +34 -35
  61. package/.koolie/core/examples/example-ergebnisbericht.md +1 -1
  62. package/.koolie/core/examples/example-mr-description.md +2 -2
  63. package/.koolie/core/framework/core/00-principles.md +1 -1
  64. package/.koolie/core/framework/core/01-governance.md +8 -8
  65. package/.koolie/core/framework/core/02-privacy.md +12 -12
  66. package/.koolie/core/framework/core/03-security.md +13 -11
  67. package/.koolie/core/framework/core/05-working-model.md +22 -22
  68. package/.koolie/core/framework/core/06-prompting-rules.md +5 -5
  69. package/.koolie/core/framework/core/07-review-rules.md +1 -1
  70. package/.koolie/core/framework/core/08-skill-conventions.md +11 -11
  71. package/.koolie/core/framework/core/09-risk-model.md +6 -6
  72. package/.koolie/core/framework/core/10-error-escalation.md +1 -1
  73. package/.koolie/core/framework/org-policies/MAPPING_CLASSIFICATION.md +1 -1
  74. package/.koolie/core/framework/overlay-patterns/general.md +63 -75
  75. package/.koolie/core/framework/role-packs/README.md +16 -28
  76. package/.koolie/core/framework/role-packs/_template/ROLE_PACK.md +3 -3
  77. package/.koolie/core/framework/role-packs/requirements-engineering/ROLE_PACK.md +23 -22
  78. package/.koolie/core/framework/role-packs/requirements-engineering/runtime/30-role-requirements-engineering.md +5 -5
  79. package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/CHANGELOG.md +2 -1
  80. package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/EXAMPLES.md +5 -5
  81. package/.koolie/core/framework/role-packs/requirements-engineering/skills/{role-re-ticket → koolie-ticket}/SKILL.md +9 -9
  82. package/.koolie/core/framework/role-packs/requirements-engineering/skills/koolie-ticket/TESTS.md +22 -0
  83. package/.koolie/core/framework/role-packs/software-development/ROLE_PACK.md +16 -16
  84. package/.koolie/core/framework/role-packs/software-development/runtime/30-role-software-development.md +1 -1
  85. package/.koolie/core/framework/runtime/agents/{fw-reviewer.md → koolie-reviewer.md} +2 -2
  86. package/.koolie/core/framework/runtime/permissions.json +13 -13
  87. package/.koolie/core/framework/runtime/root-instruction.md +5 -5
  88. package/.koolie/core/framework/runtime/rules/10-privacy-security.md +2 -2
  89. package/.koolie/core/framework/runtime/rules/15-development-rules.md +1 -1
  90. package/.koolie/core/framework/runtime/rules/16-plan-spezifikation.md +1 -1
  91. package/.koolie/core/framework/runtime/rules/20-project-overlay.md +2 -2
  92. package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/CHANGELOG.md +2 -1
  93. package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/EXAMPLES.md +8 -8
  94. package/.koolie/core/framework/skills/{fw-bugfix-prepare → koolie-bugfix-prepare}/SKILL.md +21 -21
  95. package/.koolie/core/framework/skills/koolie-bugfix-prepare/TESTS.md +15 -0
  96. package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/CHANGELOG.md +2 -1
  97. package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/EXAMPLES.md +6 -6
  98. package/.koolie/core/framework/skills/{fw-change-analyze → koolie-change-analyze}/SKILL.md +12 -12
  99. package/.koolie/core/framework/skills/koolie-change-analyze/TESTS.md +16 -0
  100. package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/CHANGELOG.md +2 -1
  101. package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/EXAMPLES.md +4 -4
  102. package/.koolie/core/framework/skills/{fw-change-small → koolie-change-small}/SKILL.md +15 -15
  103. package/.koolie/core/framework/skills/koolie-change-small/TESTS.md +13 -0
  104. package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/CHANGELOG.md +2 -1
  105. package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/EXAMPLES.md +4 -4
  106. package/.koolie/core/framework/skills/{fw-code-explain → koolie-code-explain}/SKILL.md +10 -10
  107. package/.koolie/core/framework/skills/koolie-code-explain/TESTS.md +11 -0
  108. package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/CHANGELOG.md +2 -1
  109. package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/EXAMPLES.md +3 -3
  110. package/.koolie/core/framework/skills/{fw-docs-update → koolie-docs-update}/SKILL.md +8 -8
  111. package/.koolie/core/framework/skills/koolie-docs-update/TESTS.md +12 -0
  112. package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/CHANGELOG.md +2 -1
  113. package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/EXAMPLES.md +6 -6
  114. package/.koolie/core/framework/skills/{fw-error-analyze → koolie-error-analyze}/SKILL.md +15 -15
  115. package/.koolie/core/framework/skills/koolie-error-analyze/TESTS.md +12 -0
  116. package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/CHANGELOG.md +2 -1
  117. package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/EXAMPLES.md +6 -6
  118. package/.koolie/core/framework/skills/{fw-mr-description → koolie-mr-description}/SKILL.md +8 -8
  119. package/.koolie/core/framework/skills/koolie-mr-description/TESTS.md +12 -0
  120. package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/CHANGELOG.md +2 -1
  121. package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/EXAMPLES.md +4 -4
  122. package/.koolie/core/framework/skills/{fw-overlay-pflege → koolie-overlay-pflege}/SKILL.md +8 -8
  123. package/.koolie/core/framework/skills/koolie-overlay-pflege/TESTS.md +13 -0
  124. package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/CHANGELOG.md +2 -1
  125. package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/EXAMPLES.md +7 -7
  126. package/.koolie/core/framework/skills/{fw-plan → koolie-plan}/SKILL.md +14 -14
  127. package/.koolie/core/framework/skills/koolie-plan/TESTS.md +14 -0
  128. package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/CHANGELOG.md +2 -1
  129. package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/EXAMPLES.md +4 -4
  130. package/.koolie/core/framework/skills/{fw-refactor → koolie-refactor}/SKILL.md +12 -12
  131. package/.koolie/core/framework/skills/koolie-refactor/TESTS.md +14 -0
  132. package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/CHANGELOG.md +2 -1
  133. package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/EXAMPLES.md +4 -4
  134. package/.koolie/core/framework/skills/{fw-repo-analyze → koolie-repo-analyze}/SKILL.md +8 -8
  135. package/.koolie/core/framework/skills/koolie-repo-analyze/TESTS.md +11 -0
  136. package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/CHANGELOG.md +2 -1
  137. package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/EXAMPLES.md +3 -3
  138. package/.koolie/core/framework/skills/{fw-review-support → koolie-review-support}/SKILL.md +7 -7
  139. package/.koolie/core/framework/skills/koolie-review-support/TESTS.md +13 -0
  140. package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/CHANGELOG.md +2 -1
  141. package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/EXAMPLES.md +5 -5
  142. package/.koolie/core/framework/skills/{fw-tests → koolie-tests}/SKILL.md +11 -11
  143. package/.koolie/core/framework/skills/koolie-tests/TESTS.md +12 -0
  144. package/.koolie/core/framework/tech-packs/README.md +2 -2
  145. package/.koolie/core/framework/tech-packs/_template/TECH_PACK.md +2 -2
  146. package/.koolie/core/governance/ADOPTION_REGISTRY.md +22 -58
  147. package/.koolie/core/governance/CHANGE_REQUEST_TEMPLATE.md +1 -1
  148. package/.koolie/core/governance/DECISION_LOG.md +7 -1
  149. package/.koolie/core/governance/EXCEPTION_PROCESS.md +1 -1
  150. package/.koolie/core/governance/FEEDBACK_PROCESS.md +1 -1
  151. package/.koolie/core/governance/FRAMEWORK_DEV_PROFILE.md +64 -66
  152. package/.koolie/core/governance/PRIORITY_HIERARCHY.md +13 -13
  153. package/.koolie/core/governance/RACI.md +3 -3
  154. package/.koolie/core/governance/RELEASE_PROCESS.md +101 -108
  155. package/.koolie/core/governance/change-requests/CR-2026-173-oeffentlicher-auftritt-koolie-praefix.md +67 -0
  156. package/.koolie/core/install.py +99 -0
  157. package/.koolie/core/koexistenz.py +2 -2
  158. package/.koolie/core/onboarding/GUIDE.md +7 -7
  159. package/.koolie/core/onboarding/KNOWLEDGE_CHECK.md +1 -1
  160. package/.koolie/core/onboarding/MENTOR_CHECKLIST.md +3 -3
  161. package/.koolie/core/onboarding/QUICKSTART.md +2 -2
  162. package/.koolie/core/onboarding/REFERENCE.md +14 -14
  163. package/.koolie/core/onboarding/exercises/EXERCISES.md +8 -8
  164. package/.koolie/core/onboarding/exercises/README.md +47 -65
  165. package/.koolie/core/pilot/PILOT_CONCEPT.md +1 -1
  166. package/.koolie/core/prompts/01-understand-codebase.md +11 -7
  167. package/.koolie/core/prompts/02-impact-analysis.md +17 -7
  168. package/.koolie/core/prompts/03-implementation-planning.md +10 -6
  169. package/.koolie/core/prompts/04-code-generation.md +11 -5
  170. package/.koolie/core/prompts/05-test-generation.md +13 -7
  171. package/.koolie/core/prompts/06-refactoring.md +14 -8
  172. package/.koolie/core/prompts/07-debugging.md +13 -11
  173. package/.koolie/core/prompts/08-security-review.md +2 -2
  174. package/.koolie/core/prompts/09-performance-analysis.md +2 -2
  175. package/.koolie/core/prompts/10-documentation.md +6 -4
  176. package/.koolie/core/prompts/11-merge-request-review.md +7 -5
  177. package/.koolie/core/prompts/12-developer-training.md +5 -3
  178. package/.koolie/core/prompts/README.md +17 -15
  179. package/.koolie/core/templates/MR_AI_DISCLOSURE.md +2 -2
  180. package/.koolie/core/templates/PLAN_TEMPLATE.md +2 -2
  181. package/.koolie/core/templates/SKILL_TEMPLATE.md +3 -3
  182. package/.koolie/core/templates/project-overlay/OVERLAY.md +28 -22
  183. package/.koolie/core/templates/project-overlay/documents/architecture/decisions/README.md +1 -1
  184. package/.koolie/core/tests/EDGE_CASES.md +4 -7
  185. package/.koolie/core/tests/TEST_CATALOG.md +33 -33
  186. package/.koolie/core/tests/protocols/2026-10-02-oeffentlicher-auftritt-2.0.0.md +42 -0
  187. package/.koolie/core/tests/scripts/hook-check-secrets.py +2 -2
  188. package/.koolie/core/tests/scripts/hook-overlay-status.py +1 -1
  189. package/.koolie/core/tests/scripts/probe-pruefungen.py +4 -2
  190. package/.koolie/core/tests/scripts/pruefungen/berechtigungen.py +7 -7
  191. package/.koolie/core/tests/scripts/pruefungen/bestand.py +20 -3
  192. package/.koolie/core/tests/scripts/pruefungen/dokumente.py +88 -0
  193. package/.koolie/core/tests/scripts/pruefungen/gemeinsam.py +1 -1
  194. package/.koolie/core/tests/scripts/pruefungen/hooks.py +1 -1
  195. package/.koolie/core/tests/scripts/pruefungen/overlay.py +5 -5
  196. package/.koolie/core/tests/scripts/pruefungen/testkatalog.py +5 -5
  197. package/.koolie/core/tests/scripts/pruefungen/werkzeuge.py +81 -2
  198. package/.koolie/core/tests/scripts/sonden/teil02_packs_mandat_mcp.py +6 -6
  199. package/.koolie/core/tests/scripts/sonden/teil03_pruefungen_26_bis_36.py +11 -11
  200. package/.koolie/core/tests/scripts/sonden/teil04_pruefungen_37_bis_45.py +11 -11
  201. package/.koolie/core/tests/scripts/sonden/teil05_pruefungen_46_bis_55.py +4 -4
  202. package/.koolie/core/tests/scripts/sonden/teil06_pruefungen_57_bis_65.py +33 -33
  203. package/.koolie/core/tests/scripts/sonden/teil07_overlay_und_lieferung.py +3 -3
  204. package/.koolie/core/tests/scripts/sonden/teil08_pruefungen_66_bis_80.py +3 -3
  205. package/.koolie/core/tests/scripts/sonden/teil10_pruefungen_83_bis_95.py +3 -3
  206. package/.koolie/core/tests/scripts/sonden/teil11_pruefungen_104_und_105.py +2 -2
  207. package/.koolie/core/tests/scripts/sonden/teil14_modi_ausnahmen_skills.py +1 -1
  208. package/.koolie/core/tests/scripts/sonden/teil16_koexistenz.py +5 -5
  209. package/.koolie/core/tests/scripts/sonden/teil17_paketquellen.py +33 -0
  210. package/.koolie/core/tests/scripts/sonden/teil19_skillnamen.py +97 -0
  211. package/.koolie/core/tests/scripts/sonden/teil20_kennungen.py +70 -0
  212. package/.koolie/core/tests/scripts/validate-framework.py +15 -6
  213. package/.koolie/core/tests/scripts/validate-output.py +1 -1
  214. package/CONTRIBUTING.md +16 -10
  215. package/QUICKSTART.en.md +44 -51
  216. package/QUICKSTART.md +44 -50
  217. package/package.json +2 -2
  218. package/paketquellen/README.md +11 -11
  219. package/.koolie/core/framework/role-packs/requirements-engineering/skills/role-re-ticket/TESTS.md +0 -22
  220. package/.koolie/core/framework/skills/fw-bugfix-prepare/TESTS.md +0 -15
  221. package/.koolie/core/framework/skills/fw-change-analyze/TESTS.md +0 -16
  222. package/.koolie/core/framework/skills/fw-change-small/TESTS.md +0 -13
  223. package/.koolie/core/framework/skills/fw-code-explain/TESTS.md +0 -11
  224. package/.koolie/core/framework/skills/fw-docs-update/TESTS.md +0 -12
  225. package/.koolie/core/framework/skills/fw-error-analyze/TESTS.md +0 -12
  226. package/.koolie/core/framework/skills/fw-mr-description/TESTS.md +0 -12
  227. package/.koolie/core/framework/skills/fw-overlay-pflege/TESTS.md +0 -13
  228. package/.koolie/core/framework/skills/fw-plan/TESTS.md +0 -14
  229. package/.koolie/core/framework/skills/fw-refactor/TESTS.md +0 -14
  230. package/.koolie/core/framework/skills/fw-repo-analyze/TESTS.md +0 -11
  231. package/.koolie/core/framework/skills/fw-review-support/TESTS.md +0 -13
  232. 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.26.4 |
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` (D-112). Die Spanne ist der Geltungsbereich dieses Packs; der gemessene Punktwert steht in der Zeile darunter (D-113). **Für dieses Pack ist die Spanne festgelegt, nicht erhoben** – erhoben ist der Punktwert |
12
- | Geprüfte Clientversion | 2.1.267 (AP2-Dokumentenabgleich, `tests/protocols/2026-09-10-AP2-claude-code.md`). **Am 2026-09-16 war auf dem Arbeitsplatz des Frameworks 2.1.273 installiert** – sechs Patchstände weiter, in derselben Zielspanne |
13
- | Stand der Produktbeobachtung | **2026-09-18, gegen 2.1.275** (`FW-AK-01`, `tests/protocols/2026-09-18-FW-AK-01.md`). Der Dokumentenabgleich der fünf Quellen `QC-1` bis `QC-5` und der Changelog der Stände 2.1.268 bis 2.1.275 sind gefahren; die Zielspanne `2.1.x` trägt weiter. **Zwei Befunde blieben, beide neue Anweisungs- beziehungsweise Skillquellen außerhalb des Repositoriums** – siehe `S4`, `S5`, `X1` und `K-63` |
14
- | Datum der Prüfung | 2026-09-10 – Dokumentenabgleich und Prüfung der erzeugten Artefakte; Wirkungsnachweise in laufenden Sitzungen folgten ab 2026-09-12 für einzelne Zeilen (Abschnitt 3, Belegstand) |
15
-
16
- > **Teilweise belegt.** Die Zeilen mit `[DOK]` sind gegen die Herstellerdokumentation
17
- > abgeglichen – zuerst gegen Clientversion 2.1.267 und eine reale Erstinstallation
18
- > (AP2, `tests/protocols/2026-09-10-AP2-claude-code.md`), zuletzt in der Produktbeobachtung
19
- > `FW-AK-01` gegen 2.1.275; die Zielspanne `2.1.x` ist festgelegt (D-112). **Zwei Einstufungen stehen auf `[NICHT ABBILDBAR]`: S5 und B10** – beide keine
20
- > Kernzusage (D-41), je mit benanntem Ersatz in der Zeile. Wirkungsnachweise aus laufenden
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
- > **Zur Lesart der Spalten.** Die Spalte „Einstufung" nennt die **vorgesehene** Durchsetzungstiefe, die Spalte „Beleg" ihren Nachweisstand: `[DOK]` = in der Herstellerdokumentation beschrieben, `[EMPF]` = Empfehlung des Frameworks, `BELEG OFFEN` = noch nicht belegt, mit Grund und Datum in der Zelle – ohne Frist (D-291).
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 (D-456). Ein Server der Projektdatei lädt erst nach Zustimmung (`enabledMcpjsonServers` im Projekteintrag des Benutzers) |
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 (D-18). Was dabei abgebildet wird, steht maschinenlesbar im `manifest.json`; diese Tabelle ist die menschenlesbare Fassung. Dieser Client ist der Grund, weshalb es die Abbildungsschicht überhaupt braucht: Vier der sechs Zeilen sind keine Umbenennung, sondern eine andere Mengenlehre.
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 eigenen Suchwerkzeuge (`Grep`, `Glob`) werten **keine** Pfadregeln aus; für dieses Verb wird keine Regel erzeugt (`CR-2026-016`). **Eine `Read(**)`-Regel deckt sie nicht mit ab** (gemessen, B04, Lauf B04-5). Den Kanal trägt der Schutz-Hook über `hook_tools.search`, nicht die Berechtigungsdatei (`CR-2026-047`, D-47) |
50
- | `write` | `Edit(muster)` | Ändern und Anlegen sind zwar getrennte Werkzeuge, eine **Pfadregel** wertet der Client aber nur für `Read` und `Edit` aus; eine `Write(muster)`-Regel wäre wirkungslos und wird nicht erzeugt (AP2-CC-02, Abschnitt 7) |
51
- | `exec` | `Bash(präfix:*)` | präfixbasiert statt wörtlich – die Sperre ist damit breiter. **Seit `1.18.2` je Regel zweimal: `Bash(…)` und `PowerShell(…)`** (D-469) – das zweite Befehlswerkzeug des Clients unter Windows, gleiche Regelform, gemessen |
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, statt sich auf Sorgfalt zu verlassen: 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 – damit ist sie nachweislich mindestens so breit. Bei `allow` ist jede Verbreiterung unzulässig.
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 künftige Regel, die es täte, erzwingt damit eine Entscheidung, statt ihre Ladebedingung stillschweigend zu verlieren |
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 (D-27), und ein Ladetrigger, der auf `paths` abbildet, muss Dateimuster mitbringen – eine leere Ladebedingung wäre keine. 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, eine Ladebedingung wäre dort eine Lockerung.
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 **nicht** dokumentiert und entfällt deshalb im Frontmatter (K-18). Zweck, Ladeverhalten und der Ladetrigger der Kernquelle stehen stattdessen in einem HTML-Kommentar oberhalb des Regeltextes. Für `CLAUDE.md`-Dateien ist dokumentiert, dass Block-Kommentare vor dem Einspeisen entfernt werden; für Regeldateien ist das **nicht** dokumentiert. Der Kommentar ist deshalb knapp gehalten und zählt hier vorsorglich zum ständigen Kontext.
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 **Quellenkennung** der Liste in Anhang 31.4.2 (`QC-1` bis `QC-6`). Die Kennung ist die verbindliche Form, weil allein sie gegen die Liste gehalten werden kann; ein Seitenpfad darf danebenstehen. **Prüfung 73 setzt es durch.** Eine Zelle, die auf eine andere Zeile verweist (*„wie B3"*), erbt deren Kennung – die Prüfung löst den Verweis auf, und eine Zeile, deren Ziel keine Kennung trägt, nimmt die Nachbarzeilen mit.
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 der Zusatz `(Zuordnung K-62)` sagt – und was nicht.** Die Zuordnung ist am 2026-09-22 aus dem Bestand gewonnen – aus der Quellenliste und den Protokollen zu AP2 und `FW-AK-01` –, nicht aus einem eigenen Abruf. Der Recherchestand der Seiten bleibt deshalb der von `FW-AK-01` (2026-09-18); eine Zuordnung ist keine Aktualitätsaussage. Wofür der Bestand keine Seite hergibt, sagt die Zeile das, statt zu raten: `M3` tut es (D-156, D-263).
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 **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`) |
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 | **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`) |
93
- | 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 |
94
- | 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** (D-37): 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 |
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 | **Zwei Wege, verschieden gebaut** (D-187, 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 (D-146) – 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(fw-code-explain)` lässt den Aufruf durch, `Skill(fw-*)` weist ihn ab. **Ein Präfixmuster gäbe lautlos nichts frei** – die Bauform von D-66, mit umgekehrtem Vorzeichen. 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(fw-plan)` weist `fw-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 |
102
- | 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` (D-65). `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** (D-188): 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 (D-122). **Die Sperre weist ab, sie entfernt nicht** (D-195). 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** (`K-73` bleibt insoweit offen): 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: **`fw-change-small`, `fw-refactor`, `fw-tests` bekommen gar keine Schranke je Skill**, **`fw-mr-description` und `fw-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`, D-67): 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`, D-72), 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 (D-64). 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, D-69) | `[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 |
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(**)`: 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 |
104
- | 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`) |
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, **solange der Betriebsmodus die Berechtigungsprüfung nicht abschaltet.** Im Modus ohne Rückfragen, den D-05 untersagt, ist diese Linie aus; dann trägt allein der Schutz-Hook (D-35). **Für diesen Client trifft das nicht zu – erhoben am 2026-09-12** (`tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`, Auflage E5 zu `CR-2026-033`). Drei Läufe mit dem Bypass-Schalter der Befehlszeile, der Modus in der Hook-Aufzeichnung als `bypassPermissions` belegt: Die Verweigerungsregeln griffen **auch dort** – für das Lesewerkzeug und für den Shell-Befehl (E1). Nimmt man sie ganz weg, trägt der Schutz-Hook allein, ebenfalls für beide Werkzeuge (E2). Ein Kontrolllauf ohne beide Schranken las die Datei anstandslos (E0) und macht die anderen zwei erst zu Messungen. **Beide Linien halten hier also gemeinsam, wo sie beim Pack `devin-desktop` nacheinander fallen.** Hinzu kommt, dass der Modus bei diesem Client sperrbar ist (`permissions.disableBypassPermissionsMode`, `AP2-CC-05`) und in verwalteten Einstellungen unüberschreibbar. D-05 bleibt unberührt: Der Lauf war Testnachweis, kein Betriebszustand.
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
- > **Und nur für eine Sitzung, die im Verzeichnis der Installation startet** (D-408, gemessen am 2026-09-26 mit Clientversion 2.1.283, `tests/protocols/2026-09-26-mehrprojekt-tokenlast.md`). Startet die Sitzung in einem Unterverzeichnis mit eigenem git-Repositorium, lädt der Client die Wurzel-Anweisung der Elternebene mit – die Sitzung kennt ihre Regeln –, aber **weder die Berechtigungsdatei noch die Hooks**: Die `.env` des Unterverzeichnisses wurde gelesen, ein aufzeichnender Hook lief nicht; in der Wurzel wurde derselbe Zugriff abgewiesen, und der Hook lief. **Eine eigene Installation im Unterverzeichnis trägt** (Zugriff abgewiesen, Hook lief), und dann laden beide Wurzel-Anweisungen. Alle Einstufungen `[TECHNISCH]` dieses Blocks und des H-Blocks stehen unter dieser Bedingung; **nichts meldet einen falschen Startort** (`K-159`). Die Einsatzszenarien stehen im Übernahmeleitfaden, Abschnitt 4.
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`. **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 (D-121). **`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** (`K-208`, D-537, 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** |
116
- | 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, `K-92`, D-492) – anders als bei `devin-desktop` (D-277). **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 |
117
- | B4 | Framework- und Overlay-Artefakte schreibgeschützt | ja | Je Pfad **eine** `Edit(...)`-Regel; das Kernverzeichnis ist seit `CR-2026-012` als Ganzes erfasst (`Edit(.koolie/core/**)`). Eine zusätzliche `Write(...)`-Pfadregel wäre wirkungslos und wird seit `CR-2026-016` nicht mehr 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** |
118
- | 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 |
119
- | 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** (D-123): 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`). **Der Gurt hat ein Loch, die Hosenträger halten:** Ein Projekt, das seinen `allow`-Korb auf `Bash(git:*)` verbreitert, verliert den Schutz auf Fernwirkung **ohne jede Meldung** (`K-47`) | `[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) |
120
- | B7 | Schreiboperationen fragen zurück | – | `ask` auf `Edit(**)` | `[TECHNISCH]` | `[DOK]` **`QC-2`** (Zuordnung `K-62`) |
121
- | 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 |
122
- | 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 |
123
- | 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 (Paket 6) | `[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) |
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 **lesende**, schreibende und ausführende Werkzeuge und seit `1.20.0` 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 (D-486). Jede Entscheidung steht im Entscheidungsprotokoll `.git/koolie-hook.jsonl`, ohne Inhalt und Pfad (D-487) | `[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) |
130
- | 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 (D-31). **Reichweite, gemessen am 2026-09-13** (D-69): 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 |
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 **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, `K-96`, D-491); bis `1.20.0` löste der Hook sie als `C:\c\…` auf, und mit einem Punktsegment oder einem 8.3-Kurznamen erreichte ein Schreibvorgang den Kern. **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 (`CR-2026-047` E5) | `[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 |
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/fw-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 (D-68). Eine `allow`-Regel holt das Werkzeug nicht zurück. **Und es kann sich nicht selbst erweitern** (D-73, gemessen am 2026-09-13): Ein Profil mit `tools: Read, Grep, Glob` – genau die Form, die `fw-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`** |
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 | Per D-05 untersagt **und** technisch sperrbar: `permissions.disableBypassPermissionsMode` auf `"disable"`, in verwalteten Einstellungen nicht überschreibbar, wirkt aber aus jeder Ebene. Zusätzlich wirken `bypassPermissions` und `auto` seit Clientversion 2.1.257 nicht mehr 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`) |
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 | **Unerhoben:** ob der Client einen Planungsmodus mit eigener Plan-Ablage außerhalb des Repositorys führt. Bis dahin ist die Ablage von `fw-plan` und `fw-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) |
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]`, **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) |
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 **schwächsten** Einstufung. Trägt sie zwei Angaben je Zugriffskanal – `[TECHNISCH]` für direktes Lesen und Schreiben, `[TEXTUELL]` für Shell und Unterprozess –, zählt sie als `[TEXTUELL]`. Das folgt D-47: Zugesagt wird je Kanal, was gemessen ist; eine Zeile, deren Zusage in einem Kanal nur als Anweisung trägt, ist nicht technisch durchgesetzt. Prüfung 31 rechnet die Summen aus der Matrix nach (D-60).
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 | Stand vor AP2 |
161
- |---|---|---|---|
162
- | `[TECHNISCH]` | 22 von 32 | 3 von 6 (B1, B2, B6) | 20 |
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) | 2 |
164
- | `[NICHT ABBILDBAR]` | **2 von 32** (S5, B10) | 0 | 4 |
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
- **Der entscheidende Befund:** Alle sechs Kernzusagen sind abgebildet – **drei davon technisch in jedem Kanal** (B1, B2, B6), drei nur für den direkten Zugriff (B3, B4, B5); für Shell und Unterprozess tragen sie die Regelschicht (D-47).
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
- **Zwei Zeilen stehen auf `[NICHT ABBILDBAR]`.** S5 ist gemessen, keine Unterschätzung: Es gibt kein Aufzählungskommando (Erhebung vom 2026-09-12). B10 ist nicht ausdrückbar, weil die Abrufwerkzeuge kein Domainmuster tragen; der Kern sagt diese Beschränkung nicht mehr zu (D-59). Beide sind **keine Kernzusage** (D-41); der Ersatz steht jeweils in der Zeile.
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
- Ein Vergleich mit dem Client Pack `devin-desktop` trägt nur eingeschränkt: Beide Packs führen verschiedene Zeilensätze, und ihre Belege sind auf verschiedenen Wegen gewonnen. Die Zahlen jenes Packs stehen in dessen Abschnitt 3.
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:** Eine Zeile sagt `BELEG OFFEN` – M4 (`K-149`); der frühere VERIFY-Marker auf R5 ist aufgelöst (D-158). Offen ist eine **Teilfrage** innerhalb von M2: ob die Sperre gegen den Modus ohne Rückfragen auch für das Feld `permissionMode` eines Subagentenprofils gilt (AP2-CC-12). Welche Zeilen in einer laufenden Sitzung gemessen oder beobachtet sind, sagt ihre Belegspalte (*„Gemessen am …“*, *„beobachtet am …“*) – darunter S2, S3, S4, A1, B2 (zwei der drei Vorrangpaare, D-134), B6 (D-123), B9, H2, H3 und H4. Für die übrigen Zeilen stehen die Wirkungsnachweise aus; sie sind gegen die Herstellerdokumentation und die erzeugten Artefakte belegt (`tests/protocols/2026-09-10-AP2-claude-code.md`, Abschnitt „Offen“).
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; das steht je Kanal in der Matrix und in der Zählung von Abschnitt 3 (D-47).
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
- Eine der sechs weicht in der **Form** ab, nicht in der Tiefe – und die Abweichung wirkt in **beide** Richtungen (gemessen am 2026-09-17, D-123). **Die Tiefe bleibt `[TECHNISCH]`:** Was das Muster trifft, setzt die Engine durch, und es schlägt sogar ein ausdrückliches `allow` (D-121).
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 **jedes Kommando, das mit der Zeichenfolge `git reset` beginnt** – also auch unkritische Varianten, nicht nur `--hard` | **Verschärfung und Lockerung zugleich, und seit dem 2026-09-17 sind beide gemessen** (D-123). *Verschärfung* (`CR-2026-008`): 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 selbst, wo die Einstufung steht (`K-48`) |
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.** Bei `devin-desktop` laden `10-privacy-security` und `15-development-rules` nur bei Relevanz. Dieser Client kennt für Regeldateien keine modellentschiedene Bedingung, nur die Bindung an Dateimuster; beide Texte sind deshalb stets geladen. Für die Regelwirkung ist das eine **Verschärfung**; für den Kontext bedeutet es eine ständige Belegung durch `CLAUDE.md` und die vier unbedingten Regeltexte einer frischen Installation. Least Context ist ein Prinzip zur Ergebnisqualität, keine Sicherheitszusage – die Abweichung ist deshalb vertretbar, wächst aber mit jedem unbedingt geladenen Pack. Der Validator warnt ab 40.000 Zeichen.
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
- - **Ein Glob-Muster kann still ins Leere greifen.** Ein `[`, das sich nicht als Klammerausdruck lesen lässt (`photos [2024/**`), macht das Muster ungültig: Es trifft keine Datei, während die übrigen Muster derselben Regel weiterwirken. Die `paths`-Liste einer Regel teilt sich außerdem ein Budget von 1.000 expandierten Mustern und 4 MiB; ein Muster darüber wird unexpandiert verwendet und trifft dann ebenfalls nichts. Beides ist beim Schreiben eines Technology Packs zu beachten – die Regel meldet ihr eigenes Nichtgreifen nicht.
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
- - **Regeldateien sind nutzerlokal ausschließbar – eine Lücke in B9.** `claudeMdExcludes` in `.claude/settings.local.json` nimmt Anweisungs- und Regeldateien über ein Glob-Muster vom Laden aus; die Listen aller Ebenen werden zusammengeführt. **Gemessen am 2026-09-25 mit Gegenlauf** (D-397): Derselbe Eintrag wirkt aus der nutzerlokalen Datei wie aus der Berechtigungsdatei – ohne Eintrag lud die Sitzung die `CLAUDE.md` des Projekts und die eines Elternverzeichnisses, mit ihm in beiden Dateien nur die des Projekts. Das ist eine **Lockerung** und damit nach der Prioritätshierarchie unzulässig, technisch aber nicht verhindert. Der KI-Client selbst kann die Datei nicht schreiben – `Edit(.claude/**)` steht in `deny` –, ein Mensch schon. Nur verwaltete Einstellungen sind gegen Ausschluss geschützt.
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
- - **Der Schutz-Hook läuft hier fail-closed** (bei `devin-desktop` ebenfalls). Für diesen Client ist das Blockierverhalten über den Exit-Code dokumentiert und in einer Installation beobachtet (WN-5), das Eingabeschema damit bestätigt. Das Manifest führt deshalb `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, statt ungeprüft durchzulaufen.
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
- **Der Schalter steht im Kommando, nicht in `env`** (D-31). Eine Umgebungsvariable hinge die Sperre an eine zweite, für kein Pack belegte Clientzusage – dass der Client die Variable an den Hook-Prozess weiterreicht. Das Argument steht in derselben Konfiguration, die der Client ohnehin ausführt: Läuft der Hook, kommt es an. Die Umgebungsvariable `FW_HOOK_FAIL_CLOSED` wirkt zusätzlich und ist der Weg, fail-closed ohne Neuinstallation zu erproben.
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
- **Beim Release-Wechsel von Hand nachzuziehen.** Weil die Hooks hier in der Berechtigungsdatei und damit in der Saat liegen, erreicht das Argument eine bestehende Installation nicht über `install.py --update`. Prüfung 17 meldet das als Fehler und nennt den Weg – die Pflicht ist damit sichtbar, nicht stillschweigend.
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.** Weil dieser Client keine eigene Hook-Datei kennt, stehen die Hooks in derselben Datei – und die ist Saat, gehört nach der Erstinstallation also dem Projekt und wird von `install.py --update` nie überschrieben. Eine Änderung an den Hooks des Kerns erreicht ein bestehendes Projekt dieses Packs deshalb nicht von selbst; bei `devin-desktop` mit eigener Hook-Datei tut sie es. Beim Release-Wechsel ist das hier ausdrücklich zu prüfen.
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 (ERH-12, `.koolie/core/tests/protocols/2026-09-12-erhebungen-K28-S5-B9-bypass.md`): Zwei Muster – eines ohne und eines mit Verzeichnisdurchlauf – meldeten `No files found` für eine Datei, die im Verzeichnis lag und im selben Lauf über einen anderen Weg lesbar war; ihr Inhalt steht in drei späteren Läufen desselben Protokolls. **Das ist kein stiller Abbruch:** Das Werkzeug hat gearbeitet und ein falsches Ergebnis geliefert.
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 zwölf Skills **selbsttätig erkannt und zur Verfügung gestellt**. Das belegt S1 über die Dokumentationslage hinaus.
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
- Das ist keine Belegprüfung im Sinne des Testkatalogs und ersetzt Roadmap-AP2 nicht.
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`; die Angabe ist für dieses Pack also nötig. Ein vorhandenes Projekt hebt `--update`. Liegt der Kern bereits unter `.koolie/core/` im Projekt, installiert der klassische Weg aus der Projektwurzel; danach prüft der Validator die Installation:
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 sind die Basistests des Testkatalogs (`.koolie/core/tests/TEST_CATALOG.md`, Kennzeichnung „Basis") gegen diesen Client zu fahren und zu protokollieren.
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 ausschließlich für `Read` und `Edit` aus: Eine Pfadregel für
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
- Für eine Regel **ohne** Pfad gilt die Trennung weiterhin: Eine Verweigerung des bloßen
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 **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 (D-34).
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: 2026-09-11**, Clientversion 2.1.268, erhoben in einer frischen Installation in einem Temporärverzeichnis und durch Auslesen der Schlüssel der nutzerglobalen Einstellungsdatei (ohne Werte); `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 und Zeilen S4, S5, X1) und am 2026-09-29 gegen 2.1.284 (Connectoren des Kontos, `tests/protocols/2026-09-29-schutzschicht.md`, D-489).
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** (K-22): 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, D-397) |
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`, `K-63`) | keine; `--list-skills` sieht diese Ablagen nicht (S5). Die Kontoquelle lässt sich aus der ausgelieferten Datei nicht abschalten (X1, Abschnitt 8a) |
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, `K-191`, D-489): 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) |
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; er verhindert sie nicht. Das Framework liest das Benutzerprofil nicht und sperrt dort nichts.
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 oben ist am Tag der nächsten Clientversion eine Aussage über die Vergangenheit. Prüfung 19 prüft die **Anwesenheit** dieser Auskunft, nicht ihre Richtigkeit.
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, sie ist belegt.** Eine der drei Anweisungsquellen oben trägt ausdrücklich „nicht belegt". Das ist ein Ergebnis, kein fehlendes Ergebnis – und es ist der Unterschied zu einem Pack, das schweigt.
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** (`K-200`, D-487). 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. Es zeigt, was der Hook entschieden hat, nicht, was er nicht gesehen hat.
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
- **Gefunden von `FW-AK-01` am 2026-09-18.** Dieser Client führt neben der
283
- Wurzel-Anweisungsdatei und der Regelablage eine **dritte** Anweisungsquelle, die er
284
- sich selbst schreibt: Er legt Notizen unter `~/.claude/projects/<projekt>/memory/`
285
- ab, und deren Index `MEMORY.md` wird mit den ersten 200 Zeilen beziehungsweise 25 KB
286
- **in jede Sitzung** geladen. Die Quelle sagt wörtlich *„Auto memory is on by
287
- default."* (`QC-1`).
288
-
289
- **Das Framework schaltet sie ab.** Die erzeugte Berechtigungsdatei trägt
290
- `autoMemoryEnabled: false` auf ihrer **obersten** Ebene (D-154, deklariert im
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
- **Gefunden im Nachlauf von `1.14.1`** (`K-171`). Der Client gibt dem
316
- Modell von sich aus eine Vorgabe für Commits mit: einen Trailer `Co-Authored-By` mit
317
- einer Adresse des Herstellers, in Cloud- und Remote-Control-Sitzungen zusätzlich einen
318
- Trailer `Claude-Session` (`QC-7`). Das Modell übernahm sie in den Commit-Vorschlag des
319
- Skills `fw-change-small`, obwohl der Skill Q5 nennt – nicht in jedem Lauf. Q5 verlangt
320
- eine Nachricht, die das Warum beschreibt; der Vermerk der KI-Nutzung gehört in den
321
- Merge Request.
322
-
323
- **Das Framework schaltet sie ab.** Die erzeugte Berechtigungsdatei trägt auf ihrer
324
- obersten Ebene `"attribution": {"commit": "", "sessionUrl": false}` (D-433, deklariert
325
- im Manifest unter `settings_extra`, geprüft von Prüfung 54). `pr` bleibt unberührt: Die
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 `fw-plan` und `fw-bugfix-prepare` für die Planablage verweisen: `[TEXTUELL]`, `BELEG OFFEN`; Summen und Belegstand nachgezogen (`CR-2026-147`, D-402, K-149) | `<FRAMEWORK_OWNER>` |
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>` |