<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
    <title>aSPARK — Blog</title>
    <subtitle>Notizen zu deterministischer Softwarelieferung, Policy-as-Code und dem Bau der aSPARK-Plattform.</subtitle>
    <link href="https://aspark.lottes.dev/de/feed.xml" rel="self"/>
    <link href="https://aspark.lottes.dev/de/blog/"/>
    <updated>2026-09-21T00:00:00.000Z</updated>
    <id>https://aspark.lottes.dev/de/blog/</id>
    <author><name>Andreas Lottes</name><email>andreas@lottes.dev</email></author>
    <entry>
        <title>Was ein vollständiger Loop kostet: 42 Millionen Tokens, 35 Dollar — und 96 % davon Cache</title>
        <link href="https://aspark.lottes.dev/de/blog/was-ein-loop-kostet/"/>
        <updated>2026-09-21T00:00:00.000Z</updated>
        <id>https://aspark.lottes.dev/de/blog/was-ein-loop-kostet/</id>
        <summary>Sieben Rollen-Agenten über fünf Phasen: Ein gemessener Durchlauf, aufgeschlüsselt nach Rolle, mit den Einschränkungen, die dazugehören.</summary>
        <content type="html">&lt;p&gt;Die erste Frage, die ein Entwickler stellt, wenn er hört, dass sieben Agenten ein Feature durch fünf Phasen tragen, ist nicht „wie gut wird das Ergebnis&amp;quot;. Sie lautet: &lt;strong&gt;was kostet mich das.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die übliche Antwort in dieser Produktkategorie ist Schweigen. Also hier die Zahl, gemessen statt geschätzt.&lt;/p&gt;
&lt;h2&gt;Der Fall&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;todo-filter-bar&lt;/code&gt; — eine Filterleiste für eine Todo-App, gebaut am 19. September 2026 in einem Durchlauf. Von &lt;code&gt;/spark&lt;/code&gt; mit einem Satz Feature-Idee bis &lt;code&gt;v0.1.0 released&lt;/code&gt;. Alle fünf Phasen, sieben Rollen-Agenten, 29 Acceptance Criteria, QA im echten Browser auf Desktop und bei 375 px. 47 Minuten, fünf Gates, an jedem eine menschliche Entscheidung.&lt;/p&gt;
&lt;p&gt;Es ist dieselbe Session, aus der das Demo-Video geschnitten ist.&lt;/p&gt;
&lt;h2&gt;Das Ergebnis&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tokens gesamt&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42.307.448&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zu API-Listenpreisen (Opus 5)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35,52 $&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dieselbe Arbeit ohne Prompt-Caching&lt;/td&gt;
&lt;td&gt;217,37 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ersparnis durch Caching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;181,85 $ — 83,7 %&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die erste Zahl ist die, bei der man erschrickt. Die letzte ist die, auf die es ankommt.&lt;/p&gt;
&lt;h2&gt;Warum 42 Millionen Tokens die falsche Größe sind&lt;/h2&gt;
&lt;p&gt;Von den 42,31 Millionen Tokens sind &lt;strong&gt;40,76 Millionen Cache-Reads — 96,3 %&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Frischer Input über den gesamten Loop: 960 Tokens. Output: 291.732.&lt;/p&gt;
&lt;p&gt;Ein gegateter Loop liest denselben Kontext immer wieder. Die Spec, die beim Planen vorliegt. Der Plan, den der Reviewer gegen den Diff hält. Die Acceptance Criteria, die QA einzeln abhakt. Genau diese Form von Arbeitslast ist der Fall, für den Prompt-Caching gebaut wurde — und deshalb kostet das Wiederlesen ein Zehntel des ersten Lesens.&lt;/p&gt;
&lt;p&gt;Wer die Bruttozahl zitiert, misst die Datenmenge. Wer die Rechnung aufmacht, misst die Kosten. Das ist nicht dasselbe.&lt;/p&gt;
&lt;h2&gt;Aufschlüsselung nach Rolle&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rolle&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Output&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Cache-Read&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Cache-Write&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Kosten&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hauptsession (Orchestrator + Gates)&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;145.113&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;29.697.805&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;411.863&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;21,05 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA-Tester&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;38.576&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;7.365.329&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;281.134&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;6,41 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewer&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;25.416&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1.787.327&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;161.016&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;2,54 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Owner&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;39.135&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;682.356&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;128.610&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;2,12 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release Manager&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;16.023&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;980.193&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;103.122&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1,54 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineering Manager&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;16.846&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;178.398&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;82.279&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;1,02 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Designer&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;10.623&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;69.156&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;86.168&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;0,84 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Zwei Dinge fallen auf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die Hauptsession trägt 59 Prozent.&lt;/strong&gt; Sie ist kein Agent, sondern der Orchestrator: Sie hält den Kontext über alle 47 Minuten, führt jedes Gate und spricht mit Ihnen. Die spezialisierten Rollen laufen als Subagenten mit eigenem, kürzerem Kontext — sie bekommen, was sie brauchen, und nicht die ganze Sitzung. Das ist der Grund, warum sechs Agenten zusammen weniger kosten als der eine Faden, der sie zusammenhält.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Der QA-Tester ist der teuerste Einzelagent.&lt;/strong&gt; Das passt zur Sache: Er ist der Einzige, der tatsächlich einen Browser bedient — 29 Kriterien, per Maus und per Tastatur, einmal auf Desktop und einmal in einem 375 Pixel breiten Rahmen, dazu ein Durchlauf mit hundert Todos. Prüfen ist teurer als planen. Das sollte es auch sein.&lt;/p&gt;
&lt;h2&gt;Wie gerechnet wurde&lt;/h2&gt;
&lt;p&gt;Nicht aus dem Bauch und nicht aus einer Statusanzeige. Die Zahlen stammen aus den &lt;code&gt;usage&lt;/code&gt;-Feldern der Claude-Code-Transkripte dieser Session: alle Assistant-Nachrichten der Hauptsitzung plus die zwölf Subagenten-Transkripte. Die Zuordnung zu den Rollen kommt aus den &lt;code&gt;agentType&lt;/code&gt;-Feldern der zugehörigen Metadaten, nicht aus einer Zuordnung von Hand.&lt;/p&gt;
&lt;p&gt;Preise, Stand heute, &lt;code&gt;claude-opus-5&lt;/code&gt;, API-Liste:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;pro 1 Mio. Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;5,00 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;25,00 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache-Read&lt;/td&gt;
&lt;td&gt;0,50 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache-Write, 5-Minuten-TTL&lt;/td&gt;
&lt;td&gt;6,25 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache-Write, 1-Stunden-TTL&lt;/td&gt;
&lt;td&gt;10,00 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Der Anteil der beiden TTLs ist nicht angenommen, sondern aus &lt;code&gt;usage.cache_creation&lt;/code&gt; gelesen: 842.329 Tokens auf fünf Minuten, 411.863 auf eine Stunde.&lt;/p&gt;
&lt;h2&gt;Was diese Zahl nicht sagt&lt;/h2&gt;
&lt;p&gt;Ohne diesen Abschnitt wäre der Rest unredlich.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Es sind Listenpreise.&lt;/strong&gt; Die Session lief über Claude Code. Wer ein Abonnement hat, hat diese 35,52 $ nicht bezahlt. Die Zahl beantwortet eine andere Frage: &lt;em&gt;Was kostet diese Arbeitslast, wenn man sie zu API-Preisen abrechnet?&lt;/em&gt; Das ist die Vergleichsgröße für jemanden, der aSPARK gegen eine Alternative hält — nicht Ihre Abrechnung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Es ist ein Modell.&lt;/strong&gt; Opus 5. Mit einem günstigeren Modell sieht die Rechnung anders aus, und die Frage, ob das Ergebnis dann noch durch dieselben Gates kommt, ist offen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Es ist ein Messpunkt.&lt;/strong&gt; Ein Feature, eine kleine Anwendung, ein Projekt. Daraus einen Durchschnitt zu machen wäre genau die Sorte Verallgemeinerung, die dieses Projekt an anderer Stelle vermeidet. Ein zweiter Durchlauf auf einem größeren Feature wäre ehrlicher als dieser eine, hochgerechnet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die 47 Minuten sind nicht 47 Minuten Modellzeit.&lt;/strong&gt; An fünf Gates hat ein Mensch gelesen und entschieden. Diese Zeit steht in der Uhr, aber nicht in der Rechnung.&lt;/p&gt;
&lt;h2&gt;Warum das hier steht&lt;/h2&gt;
&lt;p&gt;Weil niemand sonst diese Zahl nennt, und weil eine Software, die ihren Wert aus Nachprüfbarkeit zieht, bei der eigenen Kostenfrage nicht ausweichen darf.&lt;/p&gt;
&lt;p&gt;Die Rechnung ist aus den Transkripten reproduzierbar. Wenn Sie aSPARK laufen lassen, können Sie Ihre eigene aufmachen — und wenn sie deutlich anders ausfällt, ist das ein Ergebnis, das uns mehr wert ist als dieses hier.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <title>Der erste Durchlauf: mit /charter anfangen, nicht mit dem Feature</title>
        <link href="https://aspark.lottes.dev/de/blog/erster-durchlauf-mit-charter/"/>
        <updated>2026-09-20T00:00:00.000Z</updated>
        <id>https://aspark.lottes.dev/de/blog/erster-durchlauf-mit-charter/</id>
        <summary>Installation, Projektprofil, erstes Feature: Was Sie in der ersten Stunde mit aSPARK tun — und welche Entscheidung an jedem Gate wirklich Ihre ist.</summary>
        <content type="html">&lt;p&gt;aSPARK ist seit &lt;code&gt;v0.11.0&lt;/code&gt; an einer Stelle deutlich einfacher geworden: Es gibt jetzt einen klaren Startpunkt. Wer früher mit &lt;code&gt;/spark&lt;/code&gt; oder &lt;code&gt;/next-steps&lt;/code&gt; auf einem Projekt ohne Constitution begann, wurde von beiden auf das jeweils andere verwiesen. Heute führen beide zuerst zu &lt;code&gt;/charter&lt;/code&gt; — und &lt;code&gt;/charter&lt;/code&gt; weiß, was zu tun ist, egal ob das Repository leer ist oder seit zwei Jahren wächst.&lt;/p&gt;
&lt;h2&gt;Installation: zwei Befehle&lt;/h2&gt;
&lt;p&gt;In einer laufenden &lt;code&gt;claude&lt;/code&gt;-Sitzung:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/plugin marketplace add a-lottes/aSPARK
/plugin install aspark@aspark
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach Claude Code neu starten, denn Plugins werden erst nach einem Neustart aktiv. Ein &lt;code&gt;/plugin&lt;/code&gt; zeigt anschließend &lt;strong&gt;aspark&lt;/strong&gt; als installiert und aktiviert. Es gibt keinen Dienst, kein Konto und keine Datenbank — aSPARK ist Markdown, das in Ihrem Repository arbeitet.&lt;/p&gt;
&lt;h2&gt;Schritt 1: /charter, einmal pro Projekt&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/charter&lt;/code&gt; schreibt die Constitution: die stehenden Regeln, die jede Phase jedes Features erbt. Das Ceremony verhält sich unterschiedlich, je nachdem was es vorfindet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auf einem leeren Repository&lt;/strong&gt; stellt es eine kurze Reihe harter Produktfragen. Für wen ist das? Was tun diese Menschen heute ohne Ihr Produkt? Was ist die kleinste Version, die schon hilft? Woran merken Sie, dass es funktioniert? Welcher Stack, welche harten Einschränkungen? Am Ende steht ein Vorschlag für die Constitution und für den ersten Schnitt — beides zur Freigabe, nichts läuft ungefragt los.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auf einem Projekt mit Code&lt;/strong&gt; liest es stattdessen, was schon da ist: README, ein vorhandenes &lt;code&gt;CLAUDE.md&lt;/code&gt;, bestehende Specs. Daraus entsteht ein begrenzter Projektüberblick — Zielgruppe, Stack, wie man es startet, Konventionen, bekannte Schwachstellen — den Sie einmal korrigieren. Danach müssen Product Owner und Engineering Manager das System nicht bei jedem Feature neu herleiten.&lt;/p&gt;
&lt;p&gt;Drei Angaben lohnen besondere Aufmerksamkeit, weil sie den Rest des Loops prägen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Projekttyp und Merkmale.&lt;/strong&gt; Daraus ergeben sich die aktiven Lenses. Ein öffentlicher &lt;code&gt;website&lt;/code&gt; bekommt SEO-Checks, eine &lt;code&gt;api&lt;/code&gt; bekommt Fehler-Envelope und Versionierung, ein Projekt mit Zahlungsverkehr bekommt die Security-Lens durch alle Phasen. Wichtig: Ohne Constitution ist &lt;strong&gt;keine&lt;/strong&gt; Lens aktiv. Die Constitution ist die einzige Stelle, an der eine Lens eingeschaltet wird.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qualitätslatte.&lt;/strong&gt; Was in §4 steht, muss keine Spec mehr wiederholen. Gibt es kein Testframework und soll auch keines entstehen, schreiben Sie das hin — dann baut niemand eines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QA-Methode.&lt;/strong&gt; Hat Ihr Projekt keine Oberfläche, die ein Browser bedienen kann, deklarieren Sie hier die Ersatzmethode. Sonst fragt jedes Feature erneut danach.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Schritt 2: das erste Feature&lt;/h2&gt;
&lt;p&gt;Entweder Phase für Phase oder am Stück:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/spark Eine Filterleiste über der Todo-Liste mit All, Active, Done …
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/spark&lt;/code&gt; fährt Specify, Plan, Act, Review und Keep und hält an jedem Gate an. Sie sehen jeweils das Artefakt und entscheiden. Das ist kein Formalismus, sondern der Punkt der Übung: Die Agenten entwerfen, prüfen und empfehlen — freigegeben wird von Ihnen.&lt;/p&gt;
&lt;p&gt;Was an den Gates wirklich zur Entscheidung steht:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Ihre Frage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spec&lt;/td&gt;
&lt;td&gt;Ist das das richtige Feature, und sind die Kriterien prüfbar?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan&lt;/td&gt;
&lt;td&gt;Trägt der Ansatz? Hier ist Ablehnen noch billig, danach steht Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review&lt;/td&gt;
&lt;td&gt;Findings verstanden: jetzt beheben, oder bewusst annehmen?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA&lt;/td&gt;
&lt;td&gt;Wurde jedes Akzeptanzkriterium wirklich verifiziert?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release&lt;/td&gt;
&lt;td&gt;Geht das raus? Ohne Ihr ausdrückliches Ja passiert nichts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Zwischendurch bietet &lt;code&gt;/spark&lt;/code&gt; nach schweren Phasen an, &lt;code&gt;/clear&lt;/code&gt; zu machen und wieder einzusteigen. Nehmen Sie das an. Die Artefakte auf der Platte &lt;strong&gt;sind&lt;/strong&gt; der Zustand; ein frischer Kontext nimmt den Loop genau dort wieder auf, ohne alles mitzuschleppen, was die letzte Phase gelesen hat.&lt;/p&gt;
&lt;h2&gt;Schritt 3: optional erweitern&lt;/h2&gt;
&lt;p&gt;Core läuft allein vollständig. Zwei Erweiterungen greifen in den Loop ein, wenn Sie sie installieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/plugin install aspark-guard@aspark
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;aspark-guard&lt;/code&gt; verlegt die Gates aus dem Prompt in eine Prüfung außerhalb des Modells und führt ein Hash-Ledger über jeden Schreibvorgang unter &lt;code&gt;.spark/&lt;/code&gt;. &lt;code&gt;aspark-graph&lt;/code&gt; (&lt;code&gt;pip install aspark-graph&lt;/code&gt;) grenzt Plan, Review und QA auf die Dateien ein, um die es geht. Fehlen beide, verhält sich der Loop exakt wie beschrieben — kein Fehler, keine Warnung.&lt;/p&gt;
&lt;h2&gt;Was Sie nach der ersten Stunde haben&lt;/h2&gt;
&lt;p&gt;Ein Feature, das durch fünf Gates gegangen ist, und einen Ordner &lt;code&gt;.spark/&lt;/code&gt;, den Sie lesen, diffen und committen können: Spec mit Stories und Akzeptanzkriterien, Plan mit Tasks, Review mit Findings, QA-Bericht mit jedem geprüften Kriterium, Release-Notiz mit den Lehren.&lt;/p&gt;
&lt;p&gt;Und eine Constitution, die Sie nie wieder erklären müssen.&lt;/p&gt;
&lt;p&gt;Wie so ein Durchlauf in der Praxis aussieht, zeigt das &lt;a href=&quot;https://aspark.lottes.dev/de/#showcase&quot;&gt;Demo-Video auf der Startseite&lt;/a&gt;: 47 Minuten echte Session, auf 100 Sekunden geschnitten.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <title>Die Idee formulieren, nicht das Ticket: wie das Spec-Gate kurz bleibt</title>
        <link href="https://aspark.lottes.dev/de/blog/die-idee-formulieren/"/>
        <updated>2026-09-20T00:00:00.000Z</updated>
        <id>https://aspark.lottes.dev/de/blog/die-idee-formulieren/</id>
        <summary>Der Product Owner fragt nach, was Sie offengelassen haben. Wer die Leerstellen vorwegnimmt, kommt schneller zu einer besseren Spec — hier ist das Muster, das sich bewährt hat.</summary>
        <content type="html">&lt;p&gt;Der Product Owner in aSPARK ist absichtlich kein Ja-Sager. Nach dem ersten Entwurf läuft ein Clarify-Durchgang, der die Spec gegen eine feste Taxonomie prüft: funktionale Grenzen, Daten, Berechtigungen, Fehler- und Randfälle, nicht-funktionale Anforderungen, Integrationen, UX-Zustände, Out of Scope. Alles, was dort offen ist, kommt als Frage zurück.&lt;/p&gt;
&lt;p&gt;Das ist gut so. Genau diese Fragen sind der Grund, warum ein Feature hinterher stimmt. Aber Sie entscheiden mit der Formulierung Ihrer Idee, &lt;strong&gt;welche&lt;/strong&gt; dieser Fragen gestellt werden — die interessanten oder die offensichtlichen.&lt;/p&gt;
&lt;h2&gt;Das Muster&lt;/h2&gt;
&lt;p&gt;Eine gute Idee für &lt;code&gt;/story-time&lt;/code&gt; oder &lt;code&gt;/spark&lt;/code&gt; beantwortet im Vorbeigehen, was ohnehin gefragt würde, und lässt genau das offen, wo Sie eine Meinung hören wollen. Fünf Dinge lohnen sich fast immer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Das sichtbare Verhalten&lt;/strong&gt;, nicht die Umsetzung. Was sieht und tut die Nutzerin? Technische Entscheidungen gehören in den Plan, nicht in die Spec.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Zustände am Rand.&lt;/strong&gt; Was steht da, wenn nichts da ist? Was passiert beim ersten Mal, beim letzten Element, bei 100 Einträgen?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tastatur und Fokus&lt;/strong&gt;, sobald es eine Oberfläche gibt. Das ist die Frage, die sonst garantiert zurückkommt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Zahl oder Form, an der man es messen kann.&lt;/strong&gt; &amp;quot;Zeigt an, wie viele offen sind&amp;quot; ist schwächer als &amp;quot;zeigt &lt;code&gt;N items left&lt;/code&gt;, Singular &lt;code&gt;1 item left&lt;/code&gt;&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Out of Scope, ausdrücklich.&lt;/strong&gt; Ein Satz, der sagt, was &lt;em&gt;nicht&lt;/em&gt; dazugehört, spart im Review eine Diskussion und im Plan einen Umweg.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Ein echtes Beispiel&lt;/h2&gt;
&lt;p&gt;Das Feature aus unserem &lt;a href=&quot;https://aspark.lottes.dev/de/#showcase&quot;&gt;Demo-Video&lt;/a&gt; startete mit genau einem Satz:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Add a filter bar above the todo list with three toggle buttons — All, Active, Done — and a counter that reads &amp;quot;N items left&amp;quot; (singular &amp;quot;1 item left&amp;quot;), counting only active todos. Exactly one filter is selected at a time and is visually marked as selected; All is the default. The list shows only todos matching the selected filter; the counter is independent of the filter. Each filter has its own empty message: &amp;quot;Nothing to do — nice.&amp;quot; for Active, &amp;quot;Nothing done yet.&amp;quot; for Done; the existing &amp;quot;Nothing here yet&amp;quot; message stays for All. Buttons are real &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; elements, operable by keyboard, with the selected one exposed via &lt;code&gt;aria-pressed&lt;/code&gt;. Out of scope: persisting the selected filter across reloads, URL routing, editing todos, animations, and any new dependency or file.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Darin steckt jeder der fünf Punkte: sichtbares Verhalten, drei benannte Leerzustände, Tastaturbedienung, ein prüfbarer Zählertext und eine ausdrückliche Abgrenzung.&lt;/p&gt;
&lt;p&gt;Der Product Owner hat trotzdem nachgehakt — und zwar dort, wo es sich lohnte. Eine der Fragen: Wenn jemand per Tastatur unter &lt;em&gt;Active&lt;/em&gt; ein Todo abhakt, verschwindet die Zeile sofort aus der Liste. Wohin geht dann der Fokus? Darauf hatte ich keine Antwort parat, und sie ist als Akzeptanzkriterium in die Spec gewandert. Genau dieses Detail hat der Reviewer später wieder aufgegriffen, als der Fokusrahmen auch nach Mausklicks stehenblieb.&lt;/p&gt;
&lt;p&gt;Aus dem einen Satz wurden 3 Stories und 29 Akzeptanzkriterien. Der ganze Loop, von der Idee bis zum Release, dauerte 47 Minuten.&lt;/p&gt;
&lt;h2&gt;Was das Muster nicht tut&lt;/h2&gt;
&lt;p&gt;Es macht den Loop nicht kürzer, sondern verschiebt den Aufwand nach vorn. Act, Review und QA dauern so lange wie das Feature groß ist. Und es ersetzt nicht das Nachfragen: Wenn die Clarify-Runde eine Lücke findet, ist das kein Zeichen einer schlechten Idee, sondern der Moment, in dem ein Fehler zwei Stunden früher auffällt als sonst.&lt;/p&gt;
&lt;h2&gt;Wenn Sie keine Idee haben&lt;/h2&gt;
&lt;p&gt;Dann formulieren Sie auch keine. &lt;code&gt;/next-steps&lt;/code&gt; sichtet den Projektstand — was ausgeliefert ist, was in Arbeit ist, was liegengeblieben ist, was die Constitution vorgibt — und schlägt ein konkretes nächstes Feature vor. Der Vorschlag ist beratend; geschrieben oder freigegeben wird nichts. Was dabei herauskommt, geben Sie dann als Idee an &lt;code&gt;/story-time&lt;/code&gt; oder &lt;code&gt;/spark&lt;/code&gt;, und zwar am besten so formuliert wie oben.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <title>Warum Determinismus die interessantere Eigenschaft ist als Geschwindigkeit</title>
        <link href="https://aspark.lottes.dev/de/blog/warum-determinismus/"/>
        <updated>2026-08-07T00:00:00.000Z</updated>
        <id>https://aspark.lottes.dev/de/blog/warum-determinismus/</id>
        <summary>KI-Assistenten machen das Generieren billig. Der Engpass verschiebt sich damit dorthin, wo es vorher schon geklemmt hat — und Determinismus ist das, was ihn wieder öffnet.</summary>
        <content type="html">&lt;p&gt;Wenn Codegenerierung nichts mehr kostet, wird nicht das Schreiben zum Engpass, sondern alles, was danach kommt: verstehen, prüfen, belegen. Genau diese drei Schritte setzen voraus, dass gleiche Eingaben auch gleiche Ergebnisse erzeugen.&lt;/p&gt;
&lt;h2&gt;Was Determinismus hier konkret heißt&lt;/h2&gt;
&lt;p&gt;Für aSPARK bedeutet Determinismus nicht, dass ein Sprachmodell zweimal denselben Text produziert — das tut es nicht und muss es auch nicht. Deterministisch sind die &lt;strong&gt;abgeleiteten Modelle&lt;/strong&gt;: Zwei Builds eines unveränderten Repositories erzeugen ein byte-identisches &lt;code&gt;graph.json&lt;/code&gt;. Dieselbe Zusage gilt für die versiegelten Snapshots von aSPARK-insights.&lt;/p&gt;
&lt;p&gt;Das ist ein bewusst enger Anspruch. Er reicht aber aus, um drei Dinge zu ermöglichen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vergleichbarkeit.&lt;/strong&gt; Ein Diff zwischen zwei Snapshots zeigt eine echte Veränderung im Projekt, nicht das Rauschen des Werkzeugs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nachvollziehbarkeit.&lt;/strong&gt; Eine Query-Antwort lässt sich reproduzieren, statt nur geglaubt zu werden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prüfbarkeit.&lt;/strong&gt; Ein Audit kann den Stand nachbauen, statt sich auf eine Momentaufnahme zu verlassen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Der Preis dafür&lt;/h2&gt;
&lt;p&gt;Determinismus kostet Ausdrucksstärke. Ein Graph, der raten dürfte, könnte mehr Verbindungen finden. aSPARK-graph rät stattdessen nicht — es markiert schwache Kanten als &lt;code&gt;inferred&lt;/code&gt; und meldet Template-Drift laut, statt sie stillschweigend zu überbrücken.&lt;/p&gt;
&lt;p&gt;Das ist die richtige Richtung für ein Werkzeug, dessen Antworten in Gate-Entscheidungen einfließen. Eine Graph-Antwort ist eine Karte, nie ein Urteil.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag ist die Vorlage für weitere Artikel. Neue Beiträge landen als Markdown-Datei unter &lt;code&gt;src/blog/de/&lt;/code&gt; und erscheinen automatisch in Übersicht und Feed.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
</feed>
