Vierter Modus 'Idee': Produkt-Idee durchdenken statt Projekt starten

Fuer echte Software-Ideen (z.B. Game-Server-Management), die weder MC2/Lucy-
Umbau noch schon ein Zed-Projekt sind. Volle Denk-Kaskade mit PRODUKT-Blick
(was, fuer wen, was gibt es schon, kleinster Wurf, was spricht dagegen) statt
Umsetzungs-Blick. Ergebnis: NUR KONZEPT.md — keine Roadmap, kein Geruest, keine
Bau-Aufforderung; der Commander entscheidet danach. Kein Ziel-Schalter (eine
Idee braucht noch keine Plattform). Eigene Farbe (sky), Button 'Durchdenken'.
Nebenbei: projektstart-SOUL.md ist jetzt versioniert + deploy-fest (lag bisher
nur auf der Box).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-20 22:57:06 +02:00
parent 40c8ed4754
commit 7389386791
30 changed files with 247 additions and 98 deletions
+4 -2
View File
@@ -14,7 +14,8 @@ class IdeeIn(BaseModel):
notiz: str = ""
welt: str = "box" # "box" = Werkstatt baut · "ide" = vorbereiten für Zed
tiefe: str = "" # nur ide: "simpel" | "gruendlich" (leer = Box schätzt selbst)
ziel: str = "" # nur ide: "lxc" | "docker" (leer = Box entscheidet)
ziel: str = "" # nur ide-Projekt: "lxc" | "docker" (leer = Box entscheidet)
art: str = "projekt" # nur ide: "projekt" (Repo+Roadmap+Bau) | "idee" (nur durchdenken)
class TaskIn(BaseModel):
@@ -33,7 +34,8 @@ def list_queue() -> dict:
@router.post("/ideen")
def add_idea(body: IdeeIn) -> dict:
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe, ziel=body.ziel)
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe,
ziel=body.ziel, art=body.art)
if not res.get("ok"):
raise HTTPException(400, res.get("error", "Idee konnte nicht angelegt werden."))
return res
+42 -12
View File
@@ -307,8 +307,26 @@ _INFRA_LXC = (
"aus per 'ssh pve' erreichbar (root, Key), Steuerung mit 'pct'. Was dort schon laeuft (Reverse-"
"Proxy, DNS, Gitea usw.), schaust du bei Bedarf mit 'ssh pve pct list' nach — nicht annehmen.\n"
"· Gitea ist self-hosted im Heimnetz (CI-Pipelines moeglich).\n"
"· Alles laeuft lokal — KEINE Cloud, kein fremder Hoster, keine Bezahl-Dienste.\n"
"Richte den Tech-Vorschlag an der gewaehlten ZIEL-PLATTFORM aus, nicht am Industrie-Default.")
"· Alles laeuft lokal — KEINE Cloud, kein fremder Hoster, keine Bezahl-Dienste.")
_ZIEL_HINWEIS = ("Richte den Tech-Vorschlag an der gewaehlten ZIEL-PLATTFORM aus, "
"nicht am Industrie-Default.")
# Auftrags-Art „Idee pruefen": Produkt-Blick statt Umsetzungs-Blick, KEIN Projektstart.
_ART_IDEE = (
"AUFTRAGS-ART: IDEE PRUEFEN (KEIN Projektstart!). Der Commander will diese Produkt-Idee erst "
"einmal DURCHDACHT haben — er hat sich NICHT entschieden, sie zu bauen.\n"
"· Blickwinkel zuerst PRODUKT, nicht Technik: Was ist es genau? Welches Problem, fuer wen? Was "
"gibt es dafuer schon und warum reicht das nicht? Was waere der kleinste sinnvolle Wurf? Was "
"spricht DAGEGEN (Aufwand, Betrieb, Wartung, Risiken)? Technik nur so tief, wie es fuer die "
"Machbarkeit noetig ist.\n"
"· Rollen-Cast entsprechend waehlen — NICHT nur Entwickler-Rollen, sondern auch Zielgruppen-, "
"Abgrenzungs-/Markt- und Betriebs-Sicht. Volle Denk-Kaskade mit Advocatus Diaboli.\n"
"· Ergebnis: NUR ein KONZEPT.md im neuen Repo (plus knappes README). KEINE ROADMAP.md, KEINE "
"AGENTS.md, KEIN SAVEPOINT.md, KEIN Geruest — das entsteht erst, wenn der Commander sich fuers "
"Bauen entscheidet.\n"
"· Uebergabe NICHT als Bau-Aufforderung formulieren: sag, was die Idee waere, was sie braeuchte "
"und was dagegen spricht — die Entscheidung liegt beim Commander.")
# Ziel-Plattform je Projekt (vom Commander gewaehlt) — ueberstimmt die Annahmen des Modells.
_ZIEL = {
@@ -327,7 +345,8 @@ _ZIEL_EHRLICH = ("Traegt die gewaehlte Ziel-Plattform fuer dieses Projekt NICHT
def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
welt: str = "box", tiefe: str = "", ziel: str = "") -> dict:
welt: str = "box", tiefe: str = "", ziel: str = "",
art: str = "projekt") -> dict:
"""Idee in die Queue legen.
welt='box' (Default): triage — der Specifier arbeitet sie aus, die Werkstatt baut,
@@ -339,8 +358,9 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
Karte nie an und die Werkstatt baut sie nie (der Fan-out-Fehler vom 20.07.).
tiefe (nur ide): 'simpel' | 'gruendlich' — vom Knopf gewaehlte Konzept-Tiefe; leer =
die Box schaetzt selbst (Fallback fuer Telegram/Lucy).
ziel (nur ide): 'lxc' | 'docker' — Ziel-Plattform des Projekts; leer = die Box
entscheidet (bekommt aber immer den Infrastruktur-Steckbrief)."""
ziel (nur ide-Projekt): 'lxc' | 'docker' — Ziel-Plattform; leer = die Box entscheidet.
art (nur ide): 'projekt' (Default, Repo+Doku+Roadmap, Bau in Zed) oder 'idee'
(Produkt-Idee nur durchdenken: NUR Konzept, keine Roadmap/Geruest, kein Bau-Druck)."""
if not _available():
return {"ok": False, "error": "Die Ideen-Queue lebt auf der Box."}
titel = (titel or "").strip()
@@ -352,12 +372,18 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
args = ["create", titel, "--assignee", "projektstart", "--created-by", created_by, "--json"]
# Vorspann: Aufwand (Tiefe) + Ziel-Plattform + Infrastruktur — überstimmt die
# Annahmen des Modells und macht das Konzept auf die reale Umgebung passend.
zielwahl = _ZIEL.get(str(ziel).lower())
vorspann = [p for p in (_AUFWAND.get(str(tiefe).lower()), zielwahl) if p]
# Heimlabor-Kontext nur beim LXC-Pfad (und ohne Wahl = seine Standard-Welt);
# Docker-Projekte bekommen bewusst den portablen Kontext.
infra = _INFRA_DOCKER if str(ziel).lower() == "docker" else _INFRA_LXC
vorspann.append(infra + (" " + _ZIEL_EHRLICH if zielwahl else ""))
if str(art).lower() == "idee":
# Idee pruefen: Produkt-Blick, volle Kaskade, KEIN Ziel/Geruest/Bau-Druck.
# Sein Heimlabor bleibt Kontext (dort liefe es ja), aber ohne Plattform-Festlegung.
vorspann = [_ART_IDEE, _AUFWAND["gruendlich"], _INFRA_LXC]
else:
zielwahl = _ZIEL.get(str(ziel).lower())
vorspann = [p for p in (_AUFWAND.get(str(tiefe).lower()), zielwahl) if p]
# Heimlabor-Kontext nur beim LXC-Pfad (und ohne Wahl = seine Standard-Welt);
# Docker-Projekte bekommen bewusst den portablen Kontext.
infra = _INFRA_DOCKER if str(ziel).lower() == "docker" else _INFRA_LXC
vorspann.append(infra + " " + _ZIEL_HINWEIS
+ (" " + _ZIEL_EHRLICH if zielwahl else ""))
notiz = "\n\n".join(vorspann) + ("\n\n" + notiz if notiz else "")
else:
args = ["create", titel, "--triage", "--created-by", created_by, "--json"]
@@ -373,7 +399,11 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
_list_cache["ts"] = 0.0 # nächster Poll zeigt die neue Idee sofort
try:
from services import announce
if welt == "ide":
if welt == "ide" and str(art).lower() == "idee":
announce.add(f"Idee wird durchdacht: „{titel}“ ({task['id']}) — die Box arbeitet ein "
"Konzept aus (Produkt-Blick). Danach entscheidest du, ob was draus wird.",
"[Ideen-Queue]", "ideen-queue", "silent")
elif welt == "ide":
announce.add(f"Neues IDE-Projekt in Vorbereitung: „{titel}“ ({task['id']}) — die Box "
"härtet das Konzept und legt das Repo an, dann baust du in Zed.",
"[Ideen-Queue]", "ideen-queue", "silent")