Core

Von der Idee zum Beleg

Ein Briefing wird zu einer Änderung auf der Platte: recherchiert, zu einer gemeinsamen Seite geformt, in kleinen Schritten geplant, gebaut und von einem zweiten Modell geprüft, bevor jemand es für fertig erklärt.

Behrad Mirafshar
Behrad Mirafshar
Gründer, Bonanza Design
13 Min. Lesezeit

Was du am Ende dieses Moduls hast

Am Ende dieses Moduls hast du eine echte Änderung im Referenzprojekt ausgeliefert: einen Plan auf der Platte, kleine, einzeln rückgängig zu machende Commits und das Review eines zweiten Modells, festgehalten mit dem, was es gefunden hat, und nicht nur grüne Tests des Builders.

Dieses Modul setzt dort an, wo Nie wieder bei null anfangen aufgehört hat: ein Projekt mit einer funktionierenden CLAUDE.md, einem Dev-Doc und einer Lessons-Datei. Die Lücke ist diesmal nicht das Gedächtnis. Es fehlt eine einzige Vergleichsdimension. Sie hinzuzufügen ist die Aufgabe.

Die Route ist dieselbe, die der MVP Blueprint aus der Sicht von Designern durchläuft: recherchieren, daraus etwas Reales formen, planen, klein bauen, eine zweite Meinung einholen.

Was dieses Modul vermittelt

  1. Recherchieren vor dem Bauen
    Nichts wird geplant, bevor es an einer echten Quelle geprüft wurde. Im Referenzprojekt trägt jede Angabe in der Sicherheitsspalte einen Link, ein Prüfdatum und ein Zitat von der eigenen Seite des Tools: nie geraten und nie eine Zusammenfassung von Dritten anstelle des Originals.
  2. Artefakte: eine gemeinsame Seite statt dreißig Dateien
    Die Formulierung aus dem Deck bringt es am klarsten auf den Punkt: dreißig Markdown-Dateien gegen eine Seite mit dem Ablauf darauf. Recherchefunde, offene Fragen und ein Prototyp der neuen Spalte lagen in einer einzigen HTML-Datei, die der Owner direkt öffnen und kommentieren konnte, statt in einem Ordner voller unverbundener Notizen.
  3. Prototyp vor Code
    Die gemeinsame Seite listete nicht nur Funde. Sie bildete genau die Tabellenzelle nach, die der Build später rendern würde, mit derselben Shell und denselben Badge-Styles wie die Live-Seite. Die echte Form zu sehen, brachte zwei Probleme ans Licht (Scope Drift, eine widersprüchliche Zelle), bevor es eine einzige Zeile Produktionscode gab.
  4. Der Umsetzungsplan
    Nachdem der Owner den Scope korrigiert hatte, kam der Plan: zwölf kleine Tasks, jeder mit eigenem Commit, jeder einzeln prüfbar. Ein Plan ist kein Absatz voller Absichten, sondern eine Abfolge, die eine andere Session aufnehmen und ausführen kann, ohne nachzufragen, was „dann den Rest erledigen“ heißt.
  5. Kleine Builds
    Der Build folgte dem Plan Task für Task: ein Commit pro Tool-Daten, ein Commit für den Render-Code, ein Commit für die Doku. Zehn Commits, jeder einzeln rückgängig zu machen, jeder gegen den einen Task prüfbar, den er abgeschlossen hat. Kein großer Commit, dem man als Ganzes vertrauen muss.
  6. Review-Stopps und ein zweites Modell
    Das Check-Skript des Builds bestand 48 von 48 Assertions. Das war nicht die Ziellinie. Ein zweites Modell, in der Rolle des Reviewers und nicht des Builders, las jeden Quell-Link von Hand und fand vier echte Fehler, die das Check-Skript nicht erkennen konnte, weil der Check nur prüft, dass der Code rendert, was data.js sagt, nicht, dass das, was data.js sagt, noch stimmt.

Die Aufgabe

Ausgangspunkt

Das Core-2-Projekt, in dem eine Vergleichsdimension fehlt.

Erwartetes Ergebnis

Die ergänzte Dimension, plus der Plan, aus dem sie entstanden ist, und das Review, das sie geprüft hat.

Bestanden, wenn

Die Änderung umgesetzt ist, der Plan, der sie hervorgebracht hat, auf der Platte liegt und ein Review durch ein anderes Modell festgehalten ist, samt dem, was es gefunden hat.

Die Claude Code Route: von der Recherche zur geprüften Änderung

Sechs Stopps, drei Modelle, eine Gewohnheit, die sich wiederholt: erst prüfen, bevor du baust, dann nach dem Bauen noch einmal prüfen. Im Referenzprojekt füllte diese Route die letzte leere Spalte einer Vergleichsseite mit fünf Tools.

  1. Recherche (Sonnet)
    Hole die Aussage ausschließlich von der eigenen Seite des Tools. Zitiere sie wortwörtlich, mit Link und Prüfdatum. Wo eine Seite nicht lesbar ist (eine reine JavaScript-Trust-Seite, ein Browser, der hängt), sag das, statt die Lücke mit einer plausiblen Vermutung zu füllen.
  2. Eine gemeinsame Seite (Sonnet)
    Funde und offene Fragen landen in einer einzigen Datei, die der Owner direkt liest, nicht in einer Chat-Zusammenfassung davon. Hier fällt Scope Drift auf, weil er auf der Seite sichtbar ist, statt in einem Recherche-Dokument zu verschwinden, das niemand erneut liest.
  3. Prototyp (Sonnet)
    Dieselbe Datei bildet die tatsächliche Tabellenzelle nach, mit demselben Markup und denselben Badges wie die Live-Seite. Der Owner sieht genau das, was ein Product Manager sehen würde, bevor er entscheidet, ob sich der Bau lohnt.
  4. Der Plan (Opus)
    Kleine, geordnete, benannte Tasks. Jeder Task nennt seine Dateien, seinen Commit und wie man ihn verifiziert. Ein Plan, den man nicht an eine frische Session übergeben und Schritt für Schritt ausführen lassen kann, ist noch kein Plan.
  5. Kleiner Build (Sonnet)
    Ein Commit pro Task, der Reihe nach. Wenn ein Schritt nicht wie geschrieben machbar ist (eine Seite, die nicht lädt, ein blockierter Abruf), stoppt der Build und sagt es, statt einen Workaround zu erfinden.
  6. Review durch ein zweites Modell (Fable)
    Ein anderes Modell, dem ausdrücklich gesagt wird, dass es prüft und nicht baut, öffnet jeden Quell-Link und gleicht die Aussage mit der Seite ab. Die eigenen Tests reichen als Beleg nicht aus; ein Reviewer, der den Code nicht geschrieben hat, prüft, was der Code sagt, an der Wirklichkeit.

Schritt 2 und 3 passierten in einer einzigen Datei, der gemeinsamen Seite unten, bevor sie auf das zurückgeschnitten wurde, was das Briefing tatsächlich verlangte (siehe den ersten Review-Stopp).

docs/point-4-review.html (the shared page, before it was cut back)
<div class="banner draft">
  Draft for review: this page exists so you can check the findings and the
  prototype column before anything is planned or built into index.html.
</div>

<h2>1. Full findings, side by side</h2>
<!-- Tool | Data location | Certifications | Encryption | Retention & subprocessors | Open items -->
<!-- Encryption and Retention & subprocessors: cut after review stop 1.
     They stayed in docs/research/point-4-security.md, never shipped
     on the live page. -->

<h2>2. Prototype: the "Security & data" column in index.html</h2>
<!-- Same table shell and badge styles as the live page, so the owner sees
     how it will actually read on a call before it's built for real. -->

Würdest du das freigeben?

Drei echte Momente aus dem Durchlauf. Jeder zeigt eine vorgeschlagene nächste Aktion. Entscheide zuerst selbst, dann sieh, was der Reviewer entschieden hat und warum.

Abgelehnt: Scope Drift. Punkt 4 des Briefings verlangt nur zwei Dinge: wo die Daten liegen und welche Sicherheitsaussagen das Tool veröffentlicht. Die Recherche hat mehr geholt (Verschlüsselung, Aufbewahrung, Subunternehmer, Zeilen zum KI-Training), weil ein guter Recherchierender dem folgt, was auf der Seite steht. Das zusätzliche Material ist nützlich, gehört aber nicht auf die Seite, die das Briefing abgesteckt hat. Es bleibt in der Recherche-Datei; der Owner schneidet die gemeinsame Seite auf die zwei verlangten Dinge zurück, bevor ein Plan geschrieben wird.

Abgelehnt: voreiliges Bauen. Ein Plan auf der Platte ist nicht dasselbe wie ein Plan, den der Owner tatsächlich gelesen hat. Im Beispiel-Build hält der erste Fortschrittseintrag des Dev-Docs den Blocker in einer Zeile fest: „User said 'don't build.'“ Der nächste Eintrag öffnet sich erst, nachdem der Owner den Plan geprüft und Go gesagt hat. Durch das Warten ging nichts verloren (der Plan hat sich nicht geändert), aber wer gegen einen ungelesenen Plan baut, riskiert, gegen einen zu bauen, den der Owner korrigiert hätte, genau wie die Recherche-Seite zuerst eine Korrektur brauchte.

Abgelehnt: Bestandene Tests sind nicht dasselbe wie wahre Aussagen. Ein zweites Modell prüfte dieselben Commits gegen die Live-Quellseiten und fand vier echte Fehler, die das Check-Skript nicht erkennen konnte, weil der Check nur prüft, dass die Seite rendert, was data.js sagt, nicht, dass data.js noch stimmt. Es fand ein Zitat, dem ein Wort fehlte (ein Verstoß gegen die Vertrauensregel), eine Notiz, die behauptete, eine Seite „couldn't be read“, obwohl die Antwort im eigenen Quelltext der Seite stand, eine Regel (Covers builder), die auf dieselbe Art von Satz auf zwei Arten angewendet wurde, und ein Zitat, das eine andere Frage beantwortete, als die Zelle behauptete. Alle vier bestanden die eigenen Tests des Builders. Keiner wäre ohne einen Reviewer aufgefallen, der den Code nicht geschrieben hat.

Das Projekt zu diesem Zeitpunkt

Drei adaptierte Dateien vom Ende von Core 3: der Plan, der Review-Stopp 2 überstanden hat, das Review, das Stopp 3 hervorgebracht hat, und die Daten, die der Build tatsächlich ausgeliefert hat.

docs/plans/2026-09-17-point-4-security-and-data.md
# Point 4 (Security & Data) Implementation Plan

**Goal:** Fill the "Security & data" column in `index.html` from a new
`security` block per tool in `data.js`: data location + published security
claims, each quoted word for word with link, date and
`Covers builder: stated / not stated`.

**Scope source:** dev-docs/2026_09_17-SCOPE-pt2-CP_Security_And_Data.md.
Encryption, retention, subprocessors and AI-training lines are OUT: they
stay in docs/research/point-4-security.md only.

---

### Task 0: Manual recheck of Replit's security page (user, in a browser)
Owner: user (agents couldn't expand the accordions).
Copy any data-location or certification sentence word for word, with link,
check date and Covers builder value.

### Task 1: Fix the Lovable wording in the research file
Old: "The page does not say where data is stored (confirmed Not stated)."
New: "trust.lovable.dev itself doesn't say where data is stored. That's
silence on this one page, not 'Not stated' for Lovable: data location is
sourced from lovable.dev/security above."

### Task 2: Write the failing check script
tests/point4.check.js: runs index.html's real inline script against a
stubbed DOM and asserts on the rendered TEXT, not just "something rendered."

### Tasks 3–8: data.js (header, meta, then one security block per tool)
Lovable, Bolt.new, v0, Replit, Figma Make. Each commit is one tool.

### Task 9–10: index.html (styles, then the render functions)
Run: node tests/point4.check.js → expect ALL PASS, 48/48.

### Task 11: Real browser check (user)
Owner opens index.html, confirms every quote against its source link.

### Task 12: Docs update
CLAUDE.md and the pt2 dev-doc, renamed to READY4QA once Task 11 passes.

---

### Not in this plan (launch gate)
A second person checks every point 4 cell against its link before the team
uses it. Not this review: the brief's own launch gate, still open.
docs/reviews/2026-09-17-point-4-review.md
# Review: point 4 (security & data), 2026-09-17

**Reviewer:** Fable (reviewer role, not builder). Nothing was changed in
index.html, data.js or the docs; findings only.
**Reviewed:** commits core-3-start..40baab9 (13 commits) against
docs/brief.md, the pt2 dev-doc and the plan.

## Verdict

**Not ready for the team yet. Ready for QA after 4 small data fixes.**

- 22 of 26 quotes verified word for word on the live source page.
- node tests/point4.check.js → ALL PASS, 48/48.
- Nothing on the page is a guess. But three cells would mislead a product manager
  by omission, one cell carries a "couldn't read it" note over content that
  is readable in the page source, and the Covers builder badge is applied
  inconsistently.

## Findings (excerpt)

### F1: Replit SOC 2 quote is not word for word
Live page: "...demonstrating **our** ongoing commitment..."
data.js has "demonstrating ongoing commitment": the word "our" is missing.
Ask: add "our" back in data.js and the research file.

### F2: The Replit "FAQ unread" note is contradicted by the page source
The FAQ accordions don't render in a fetched browser session, but the
answers are embedded as structured data (FAQPage JSON-LD) in the HTML
source. Two published Replit claims are missing from the page as a result.

### F3: Covers builder is applied inconsistently
Same tool, same kind of sentence, different badge in three places. The
written rule doesn't say precisely enough what "names the builder" means.

...(F4–F8 fix a plan-gate note, a code-execution quote misfiled as data
location, a cut sentence, and a claim with no certification in it.)
data.js (point 4, Lovable entry)
security: {
  dataLocation: [
    {
      quote: "Lovable Cloud supports regional data hosting in the EU, US, and Asia Pacific.",
      coversBuilder: "stated",
      url: "https://lovable.dev/security",
      checkDate: "2026-09-17",
      checkCountry: "Germany",
    },
    {
      quote: "Customer data remains in the region you select and does not move across regions by default.",
      coversBuilder: "not stated",
      url: "https://lovable.dev/security",
      checkDate: "2026-09-17",
      checkCountry: "Germany",
    },
    {
      quote: "We and our service providers process Personal Data in a number of countries, including the United States.",
      coversBuilder: "not stated",
      url: "https://lovable.dev/privacy",
      checkDate: "2026-09-17",
      checkCountry: "Germany",
    },
  ],
  claims: [
    {
      quote: "AIUC-1, SOC 2 Type I, ISO 27001:2022, GDPR, SOC 2 Type II",
      coversBuilder: "not stated",
      url: "https://trust.lovable.dev",
      checkDate: "2026-09-17",
      checkCountry: "Germany",
      note: "Listed under the Compliance section. Checked by hand in a browser. Badge list doesn't name Lovable in the text itself, so Covers builder: not stated per the brief's rule.",
    },
    {
      quote: "Lovable supports SOC 2 and GDPR requirements and provides security documentation and data protection agreements for enterprise review.",
      coversBuilder: "stated",
      url: "https://lovable.dev/security",
      checkDate: "2026-09-17",
      checkCountry: "Germany",
    },
  ],
},

Geh dieselbe Route an deinem eigenen Projekt

Das kostenlose Prompt-Paket für jeden Stopp der Route: Recherche, eine gemeinsame Seite, ein Prototyp, ein Plan, ein kleiner Build und das Review, das auffängt, was deine eigenen Checks durchgewunken haben.

Die Anfrage

„Füge der Vergleichsseite die Spalte zu Sicherheit und Daten hinzu.“

Ein Satz, keine Quellen, kein Plan und keine Möglichkeit, hinterher festzustellen, ob man dem Ergebnis trauen kann.

Was die Route geliefert hat

Dieselbe Anfrage, durch die Route geschickt (Recherche → eine gemeinsame Seite → Plan → kleiner Build → Review)
Ergebnis
RechercheJede Aussage wortwörtlich von den eigenen Seiten jedes Tools zitiert, mit Link und Prüfdatum. Zwei Seiten, die nicht luden, wurden als ungelesen markiert, statt geraten.
Eine gemeinsame SeiteAlle fünf Tools nebeneinander auf einer einzigen Review-Seite, sodass der Owner den Scope zurückschneiden konnte, bevor irgendetwas gebaut wurde.
Plan12 kleine Schritte, jeder mit der Datei, die er ändert, und woran man erkennt, dass er funktioniert hat.
ReviewEin zweites Modell öffnete jeden Quell-Link: 22 von 26 Zitaten stimmten, 4 nicht. Die eigenen Checks des Builds hatten alle 48 bestanden.

Unlock all course materials

One email unlocks every material in the course. Verify, and they open in that browser.

FAQ

Ein Test, den Sonnet geschrieben hat, kann nur prüfen, woran Sonnet gedacht hat. Im Beispiel-Build bestätigte das Check-Skript korrekt, dass die Seite genau das rendert, was data.js sagt. Es konnte nicht wissen, dass eines der Zitate in data.js selbst falsch war oder dass eine Quellseite mehr zu sagen hatte, als übernommen wurde. Das ist eine andere Art von Fehler, und sie braucht eine andere Art von Check: ein zweites Modell, das die tatsächlichen Quellseiten liest, nicht den Code, der sie rendert.

Der Mechanismus funktioniert trotzdem, wenn eine Claude Code Session die Arbeit einer anderen prüft, solange dem Reviewer ausdrücklich gesagt wird, dass er Aussagen gegen Quellen prüfen und beim Review nichts korrigieren soll. Entscheidend ist die Rollentrennung: Wer etwas gebaut hat, ist am schlechtesten positioniert, um zu finden, was ihm entgangen ist. Im Referenzprojekt baute Sonnet und Fable prüfte; der Review-Stopp ist die Gewohnheit, nicht das konkrete Modell.

Weil ein Plan, der noch nicht gelesen wurde, ein Vorschlag ist und keine Entscheidung. Der Plan selbst musste im Beispiel-Build nicht geändert werden, aber dass der Owner ihn zuerst prüft, macht den späteren Build zu etwas, das er tatsächlich freigegeben hat, statt zu etwas, das er hinterher abfangen muss.

Tool Scout ist ein fiktives Szenario eines Produktteams, adaptiert aus einem Beispiel-Build. Die Checks, der gescheiterte Check und die Review-Funde stammen aus diesem Build; der geschäftliche Kontext ist für die Lehre umgeschrieben. Die Beispiele beschreiben weder einen Kunden noch die Vertriebsaktivität von Bonanza.

Nein. Die Route (Recherche, eine gemeinsame Seite, Prototyp, Plan, kleiner Build, Review) passt auf jede Änderung, bei der ein Fehler später teuer zu bemerken ist. Eine Vergleichsseite macht nur den Recherche-Schritt sichtbar. Dieselbe Route funktioniert bei einer Preisänderung, einer Migration oder einem neuen Feature: erst die Fakten prüfen, die Form zeigen, bevor du baust, in kleinen Schritten planen und eine zweite Meinung einholen, bevor du es für fertig erklärst.

Die gemeinsame Seite ist der Ort, an dem Recherche und Prototyp leben, bevor irgendetwas abgesteckt ist. Sie wird geprüft und korrigiert. Der Plan kommt nach dieser Korrektur und umfasst nur das, was tatsächlich gebaut wird. Wer direkt von der Recherche zum Plan springt, liefert Scope Drift aus, statt ihn abzufangen.

Du willst diese Route an deinem eigenen Projekt durchlaufen?

Dieselbe Disziplin von der Recherche bis zum Review wenden wir bei echten Kundenprojekten an: Plan auf der Platte, Review durch ein zweites Modell.

Workshop-Termin buchenMehr erfahren