Stufe „Stoff auswählen“ vor der Gliederung: Auswahl und Tiefe je Thema

Neuer Agent entscheidet aus Quellen und Leitfrage, welche Themen ins Buch
kommen und wie tief (herleiten, erklären, nennen, weggelassen), mit
Begründung in buch/STOFF.md. Die Gliederung baut nur daraus, das Gewicht
folgt der Tiefe. Autoren und Prüfer halten sich an STOFF.md.
Nachgetragene Stufen gelten als fertig, wenn eine spätere schon fertig ist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
team3
2026-10-12 17:53:12 +02:00
parent 1edc13556a
commit 1e8a057615
9 changed files with 88 additions and 17 deletions

View File

@@ -16,6 +16,7 @@ LESE_WPM = 120
STUFEN = [
("recherche", "Thema deuten und Quellen beschaffen"),
("stoff", "Stoff auswählen"),
("gliederung", "Gliederung"),
("schreiben", "Kapitel schreiben"),
("pruefung", "Kapitel prüfen"),

View File

@@ -136,6 +136,25 @@ async def st_recherche(name: str) -> None:
s["fertig"] = 1
async def st_stoff(name: str) -> None:
"""Auswahl vor der Struktur: welche Themen ins Buch kommen und wie tief (buch/STOFF.md); die Gliederung baut nur daraus."""
thema, hinweise, spez = _thema(name)
s = state.stufe(name, "stoff")
s.update(gesamt=1, fertig=0)
v = state.verzeichnis(name)
if not state.bericht_lesen(name, "stoff") or not (v / "buch" / "STOFF.md").exists():
(v / "berichte" / "stoff.md").unlink(missing_ok=True)
p = prompts.laden("stoff", thema=thema, hinweise_block=prompts.hinweise_block(hinweise),
spezialisierung_block=prompts.spezialisierung_block(spez))
r = await agenten.laufen(name, "stoff", "stoff", "Stoff auswählen", p)
if r["status"] != "fertig":
raise Abbruch("Stoffauswahl gescheitert: " + r["bericht"][:200])
if not (v / "buch" / "STOFF.md").exists():
(v / "berichte" / "stoff.md").unlink(missing_ok=True)
raise Abbruch("Stoffauswahl unvollständig: buch/STOFF.md fehlt")
s["fertig"] = 1
async def st_gliederung(name: str) -> None:
thema, hinweise, spez = _thema(name)
s = state.stufe(name, "gliederung")
@@ -242,5 +261,5 @@ async def st_montage(name: str) -> None:
s["fertig"] = 1
STUFEN_FN = {"recherche": st_recherche, "gliederung": st_gliederung, "schreiben": st_schreiben,
STUFEN_FN = {"recherche": st_recherche, "stoff": st_stoff, "gliederung": st_gliederung, "schreiben": st_schreiben,
"pruefung": st_pruefung, "lektorat": st_lektorat, "konsistenz": st_konsistenz, "montage": st_montage}

View File

@@ -190,13 +190,15 @@ def zustand(name: str) -> dict:
for a in st["agenten"]:
if a["status"] == "laeuft":
a["status"] = "abgebrochen"
# Später hinzugekommene Stufen (z. B. Lektorat) in alte Zustände einfügen, in der Reihenfolge der Konfiguration
# Später hinzugekommene Stufen (z. B. Lektorat, Stoff) in alte Zustände einfügen, in der Reihenfolge der Konfiguration;
# eine nachgetragene Stufe gilt als fertig, wenn eine spätere Stufe schon fertig ist (der Lauf ist darüber hinaus).
vorhanden = {x["id"] for x in st["stufen"]}
if vorhanden != {sid for sid, _ in config.STUFEN}:
alt = {x["id"]: x for x in st["stufen"]}
fertig = st.get("status") == "fertig"
st["stufen"] = [alt.get(sid) or {"id": sid, "titel": t, "status": "fertig" if fertig else "offen", "fertig": 0, "gesamt": 0,
"kosten_usd": 0.0, "tokens": 0, "gestartet": "", "beendet": ""} for sid, t in config.STUFEN]
reihe = [sid for sid, _ in config.STUFEN]
fertig_bis = max((reihe.index(x["id"]) for x in st["stufen"] if x["status"] == "fertig" and x["id"] in reihe), default=-1)
st["stufen"] = [alt.get(sid) or {"id": sid, "titel": t, "status": "fertig" if i <= fertig_bis else "offen", "fertig": 0, "gesamt": 0,
"kosten_usd": 0.0, "tokens": 0, "gestartet": "", "beendet": ""} for i, (sid, t) in enumerate(config.STUFEN)]
_cache[name] = st
return _cache[name]