Automatischer Push: 32 Datei(en) geändert
- .claude/agents/executer.md - .claude/agents/planer.md - .claude/agents/pruefer.md - .claude/agents/recherche.md - .claude/skills/plan-executer-pruefung/SKILL.md - .claude/workflows/executer-welle.js - .claude/workflows/plankritik.js - .claude/workflows/pruefung.js - .claude/workflows/welle-mit-pruefung.js - .gitignore - .vault-tools/regelwerk-check/ENTWURF.md - .vault-tools/regelwerk-check/regelwerk_check.py - … und 20 weitere Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
1 parent
d7ffc9a5b5
commit
67d674cd0b
32 files changed
+1618
-88
No files matched your search
@@ -6,7 +6,10 @@ Angriffsliste und Begründung: .vault-tools/regelwerk-check/ENTWURF.md
|
||||
|
||||
Der Treiber baut aus dem echten Vault einen Minimalvault, in dem die Prüfung
|
||||
sauber durchläuft — das ist die GRUNDLINIE. Läuft sie nicht grün, misst der
|
||||
Rest nichts und der Treiber bricht ab.
|
||||
Rest nichts und der Treiber bricht ab. Dazu normalisiert die Grundlinie jede
|
||||
Frontmatter-Zeile status: pending-review auf status: reference — ohne das
|
||||
bricht der Lauf nach jeder Selbstpflege an der Grundlinie ab, weil Prüfung 4
|
||||
dann anschlägt (gemessen am 2026-09-23).
|
||||
|
||||
Danach je Angriffsfall: frische Kopie der Grundlinie, genau eine Beschädigung,
|
||||
Prüfung fahren, Exit-Code und auslösende Meldung protokollieren. Ein Fall gilt
|
||||
@@ -64,6 +67,15 @@ def baue_grundlinie(ziel: Path) -> None:
|
||||
unter.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy2(skill, unter / "SKILL.md")
|
||||
|
||||
# jede Zeile status: pending-review auf status: reference normalisieren.
|
||||
# Ohne das bricht der Lauf nach jeder Selbstpflege an der Grundlinie ab,
|
||||
# weil Prüfung 4 (Freigabe) dann anschlägt — gemessen am 2026-09-23.
|
||||
for datei in (ziel / "AI" / "Regelwerk").glob("*.md"):
|
||||
t = datei.read_text(encoding="utf-8")
|
||||
neu = re.sub(r"^status: pending-review$", "status: reference", t, flags=re.M)
|
||||
if neu != t:
|
||||
datei.write_text(neu, encoding="utf-8")
|
||||
|
||||
# Jedes Linkziel außerhalb des Geltungsbereichs als leere Datei anlegen,
|
||||
# damit die Grundlinie nicht an fehlendem Umfeld scheitert.
|
||||
for datei in list(ziel.rglob("*.md")):
|
||||
@@ -158,6 +170,144 @@ def s_keine_rollentabelle(v: Path) -> None:
|
||||
f.write_text(re.sub(r"^\|.*$", "", t, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_wertebereich_xhigh(v: Path) -> None:
|
||||
f = v / ".claude" / "agents" / "pruefer.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort: high$"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "effort: xhigh", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_wertebereich_ungueltig(v: Path) -> None:
|
||||
f = v / ".claude" / "agents" / "planer.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort: high$"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "effort: hoch", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_fehlt_erste(v: Path) -> None:
|
||||
"""Reihenfolge-Fall: effort: fehlt in der ERSTEN Agentendatei (executer.md)."""
|
||||
f = v / ".claude" / "agents" / "executer.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort:.*\n"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_fehlt_letzte(v: Path) -> None:
|
||||
"""Reihenfolge-Fall: derselbe Schaden in der LETZTEN Agentendatei (recherche.md)."""
|
||||
f = v / ".claude" / "agents" / "recherche.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort:.*\n"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_null(v: Path) -> None:
|
||||
f = v / ".claude" / "agents" / "planer.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort:.*$"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "effort:", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_spalte_fehlt(v: Path) -> None:
|
||||
"""Entfernt in der Rollentabelle bei der Kopfzeile und allen direkt
|
||||
folgenden Tabellenzeilen die letzte Zelle — die Effort-Spalte."""
|
||||
f = v / "CLAUDE.md"
|
||||
zeilen = f.read_text(encoding="utf-8").split("\n")
|
||||
kopfzeilen = [
|
||||
i for i, z in enumerate(zeilen)
|
||||
if z.startswith("|") and "Agent" in z and "Effort" in z
|
||||
]
|
||||
assert len(kopfzeilen) == 1
|
||||
start = kopfzeilen[0]
|
||||
ende = start
|
||||
while ende < len(zeilen) and zeilen[ende].startswith("|"):
|
||||
ende += 1
|
||||
for i in range(start, ende):
|
||||
teile = zeilen[i].split("|")
|
||||
kern = teile[1:-1]
|
||||
if len(kern) < 2:
|
||||
continue
|
||||
zeilen[i] = "|" + "|".join(kern[:-1]) + "|"
|
||||
f.write_text("\n".join(zeilen), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_verweis_leer(v: Path) -> None:
|
||||
"""Entfernt in der Tabellenzeile mit `pruefer` die Backticks um 'high'."""
|
||||
f = v / "CLAUDE.md"
|
||||
zeilen = f.read_text(encoding="utf-8").split("\n")
|
||||
treffer = [i for i, z in enumerate(zeilen) if z.startswith("|") and "`pruefer`" in z]
|
||||
assert len(treffer) == 1
|
||||
i = treffer[0]
|
||||
assert zeilen[i].count("`high`") == 1
|
||||
zeilen[i] = zeilen[i].replace("`high`", "high", 1)
|
||||
f.write_text("\n".join(zeilen), encoding="utf-8")
|
||||
|
||||
|
||||
def s_effort_freigabe_pending(v: Path) -> None:
|
||||
f = v / "AI" / "Regelwerk" / "schreibstil.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^status:.*$"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, "status: pending-review", t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def g_effort_anfuehrung(v: Path) -> None:
|
||||
"""Kein Schaden: effort in passenden Anführungszeichen ist gültiges YAML.
|
||||
|
||||
Muss stumm bleiben — Regressionslauf-Fall zu Punkt 4 der Effort-Prüfung
|
||||
(Prüfwerkzeuge.md, Abschnitt 5: neuer Code bekommt seinen eigenen Fall).
|
||||
"""
|
||||
f = v / ".claude" / "agents" / "pruefer.md"
|
||||
t = f.read_text(encoding="utf-8")
|
||||
muster = r"^effort: high$"
|
||||
assert len(re.findall(muster, t, flags=re.M)) == 1
|
||||
f.write_text(re.sub(muster, 'effort: "high"', t, count=1, flags=re.M), encoding="utf-8")
|
||||
|
||||
|
||||
def g_zusatzspalte(v: Path) -> None:
|
||||
"""Kein Schaden: eine Spalte hinter Effort mit eigenem Backtick-Wert.
|
||||
|
||||
Muss stumm bleiben — die Effort-Spalte wird über ihre Überschrift
|
||||
gefunden, nicht über die letzte Spalte.
|
||||
"""
|
||||
f = v / "CLAUDE.md"
|
||||
zeilen = f.read_text(encoding="utf-8").split("\n")
|
||||
kopfzeilen = [
|
||||
i for i, z in enumerate(zeilen)
|
||||
if z.startswith("|") and "Agent" in z and "Effort" in z
|
||||
]
|
||||
assert len(kopfzeilen) == 1
|
||||
start = kopfzeilen[0]
|
||||
zeilen[start] = zeilen[start].rstrip() + " Notiz |"
|
||||
zeilen[start + 1] = zeilen[start + 1].rstrip() + " --- |"
|
||||
i = start + 2
|
||||
while i < len(zeilen) and zeilen[i].startswith("|"):
|
||||
zeilen[i] = zeilen[i].rstrip() + " `xhigh` |"
|
||||
i += 1
|
||||
f.write_text("\n".join(zeilen), encoding="utf-8")
|
||||
|
||||
|
||||
def g_zweiter_backtick(v: Path) -> None:
|
||||
"""Kein Schaden: ein zweiter Backtick-Ausdruck in der Effort-Zelle.
|
||||
|
||||
Muss stumm bleiben — genommen wird der erste Backtick-Ausdruck.
|
||||
"""
|
||||
f = v / "CLAUDE.md"
|
||||
zeilen = f.read_text(encoding="utf-8").split("\n")
|
||||
treffer = [i for i, z in enumerate(zeilen) if z.startswith("|") and "`pruefer`" in z]
|
||||
assert len(treffer) == 1
|
||||
i = treffer[0]
|
||||
assert zeilen[i].count("`high` (Frontmatter)") == 1
|
||||
zeilen[i] = zeilen[i].replace(
|
||||
"`high` (Frontmatter)", "`high` (Frontmatter, nicht `xhigh`)", 1
|
||||
)
|
||||
f.write_text("\n".join(zeilen), encoding="utf-8")
|
||||
|
||||
|
||||
def g_link_im_codeblock(v: Path) -> None:
|
||||
"""Kein Schaden, sondern eine Falle: Wikilink-artiges IN Code.
|
||||
|
||||
@@ -187,6 +337,9 @@ def g_link_im_codeblock(v: Path) -> None:
|
||||
# seinen eigenen Fall (pruefwerkzeuge.md, Abschnitt 5).
|
||||
GEGENFAELLE = [
|
||||
("codeblock | Wikilink-artiges in Code und Backticks", g_link_im_codeblock),
|
||||
("anfuehrung | effort in Anführungszeichen", g_effort_anfuehrung),
|
||||
("zusatzspalte | Spalte mit Backtick-Wert hinter Effort", g_zusatzspalte),
|
||||
("zweiter-backtick | Effort-Zelle mit zweitem Backtick-Wert", g_zweiter_backtick),
|
||||
]
|
||||
|
||||
|
||||
@@ -203,6 +356,14 @@ FAELLE = [
|
||||
("umgebung | CLAUDE.md fehlt", s_kein_stamm, "fehlt — nichts prüfbar"),
|
||||
("umgebung | AI/Regelwerk fehlt", s_kein_regelwerk, "Verzeichnis fehlt"),
|
||||
("umgebung | Rollentabelle unauffindbar", s_keine_rollentabelle, "Rollentabelle nicht auffindbar"),
|
||||
("wertebereich| effort: xhigh statt high", s_effort_wertebereich_xhigh, "effort: xhigh — Rollentabelle im Stamm sagt high"),
|
||||
("wertebereich| effort: hoch (ungültig)", s_effort_wertebereich_ungueltig, "ist nicht in der Vorgabe"),
|
||||
("fehlt | effort fehlt, ERSTE Agentendatei", s_effort_fehlt_erste, ".claude/agents/executer.md — kein effort: im Frontmatter"),
|
||||
("fehlt | effort fehlt, LETZTE Agentendatei", s_effort_fehlt_letzte, ".claude/agents/recherche.md — kein effort: im Frontmatter"),
|
||||
("null | effort ohne Wert", s_effort_null, ".claude/agents/planer.md — kein effort: im Frontmatter"),
|
||||
("umgebung | Effort-Spalte fehlt", s_effort_spalte_fehlt, "Effort-Spalte der Rollentabelle nicht auffindbar"),
|
||||
("verweis | Effort-Zelle ohne Wert", s_effort_verweis_leer, "Rollentabelle nennt für 'pruefer' keinen Effort"),
|
||||
("freigabe | status: pending-review", s_effort_freigabe_pending, "Freigabe steht aus"),
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user