Verifikation
Status: Nachweisregister. Jeder Abschnitt hält fest, was gelaufen ist, auf welcher Stufe, das beobachtete Ergebnis und seine Grenze. Stufen: Q0 statisch/Unit (Sekunden), Q1 CAD-Verifikation (Minuten), Q2 Simulation und Integrations-Smoke-Tests, Q3 Hardware. Nichts hiervon wurde an einem physischen Roboter durchgeführt (noch kein Q3).
2026-11-01 — Druckpaket nach der zweiten Durchsicht eines Bauenden
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Erkennung von Lochstufen | strido_publish.print_bridges.hole_steps auf jedem Teil des Druckpakets, so wie es liegt | Q0 | 4 Stufen gefunden und ausgeschnitten: je ein Lagersitz in inner_tibia und outer_tibia, zwei 625ZZ-Sitze (16,3 → 12,3 mm) in outer_shoulder_frame (die Teile, die der Bauende genannt hat); Stufen unter einer Extrusionslinie (0,4 mm) und Ränder des Teils werden übersprungen; nach dem Ausschnitt findet die Erkennung keine mehr. Schnittbilder an der Stufe zeigen weites Loch, Schlitz, Quadrat, enges Loch. Das Review hat die ausgeschnittenen Teile gesliced: outer_shoulder_frame druckt Schlitz, Quadrat und Loch bei 4,2/4,4/4,6 mm ohne Stützen; in beiden Tibias liegt der Sitz unter einem Auge 7,4 mm über dem Bett, und PrusaSlicer füllt die Bohrung trotzdem mit Stützen (die Notizen sagen jetzt, sie zu blockieren); die Schnitthöhen sind auf die Slicing-Schichten eingerastet | geometrische Erkennung; ein nicht runder Sitz wird nicht behandelt; Stützenplatzierung des Slicers an diesen drei Teilen von Hand geprüft |
| Druckbarkeit mit neuer Ausrichtung und Ausschnitten | make printability (PrusaSlicer 2.9.6) | Q1 | 34 Teile und 13 Platten: 0 fail, 4 warn (dünne Deckschichten in den Upstream-Servohaltern, 0,38–0,53 mm); Druckpaket 958 g, 100 h; Servohalter 19 mm hoch wie ein U, 2 % Überhang; inner_tibia auf der flachen Seite (1638 mm² Bettkontakt, vorher 71 mm²) | Slicer-Schätzung; noch kein Teil gedruckt |
| Tests für Festigkeit und Druckpaket | python -m strido_verify.strength, pytest tests/verify/test_print_kit.py tests/verify/test_strength.py | Q1 | 19 Prüfungen ok (Querschnitte aus den ausgeschnittenen STLs); 6 Tests bestanden | — |
2026-11-01 — steife lange Koppel und Ausrichtung des Druckpakets
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Festigkeit mit der steifen langen Koppel | python -m strido_verify.strength | Q1 | 19 Prüfungen, 19 ok, 0 warn, 0 fail; Knicken der langen Koppel S = 2,53 (Upstream-Koppel 0,34, ADR-010), Zug/Druck S = 4,34 einschließlich der Biegung aus dem 2-mm-Versatz des Schafts (Secans-Formel; Befund der Durchsicht, der erste Lauf prüfte nur F/A und ergab 10,3), Lochleibung am Auge S = 7,1; kleinster Faktor jetzt die Tibia-Hälften (2,22); keine akzeptierte Abweichung mehr (accepted: {}); Masse 3,07 kg (+24 g für die vier Koppeln), Fußkraft bei der Landung 45,2 N | Querschnitte nur aus Wänden, Werte aus dem PETG-Datenblatt |
| Prüfung rot gesehen beim Entwurf der Koppel | python -m strido_verify.rom, Sweep der Nachbarabstände (Wegwerfskript, 4 Oberschenkel × 43 Unterschenkel-Posen je Bein) | Q1 | eine mittig auf der Bolzenlinie liegende Koppel kam dem Femur bei gestrecktem Knie bis auf 0,25 mm nahe und berührte bei voller Beugung die Unterlegscheibe der kurzen Koppel; der ROM-Sweep verschob die Unterschenkelgrenze von −45° auf −50° (sichtbar als Diff in hardware/joint_limits.yaml). Schaft 2 mm neben der Bolzenlinie mit den Upstream-Augen: jeder Nachbar ≥ 1,0 mm (Femur 1,1, kurze Koppel 1,4), Gelenkgrenzen unverändert | punktweise abgetastete Abstände; der Nachweis sind die Prüfungen unten |
| Vollständige CAD-Verifikation | make verify | Q1 | Durchdringung 0 ungeklärte Überlappungen (4 Posen, 483 Körper); Freigang 0 fail, 4 knapp (unverändert); ROM-Grenzen unverändert (nur die Kollisionsnachweise außerhalb der Grenzen nennen die neue Koppel); Passungen 0 fail (Gleitlagersitze 4,85–4,95 mm in den 5,0-mm-Bohrungen); Verkabelung 174 Prüfungen, 0 fail, 1 warn; Geometrie-Bindungen synchron | nominelle Geometrie |
| Ausrichtung des Druckpakets | make print, make printability (PrusaSlicer 2.9.6) | Q1 | Femur, obere Halterung, Femur-Servoverbinder, Seitenträger und rechte Schulter neu ausgerichtet; Kamerasockel auf seiner Grundfläche; steife lange Koppel flach, ohne Stützen; die Servohalter bleiben aufrecht (Durchsicht: auf der Seite lägen die Vorbohrungen für das Hüfthorn waagrecht, außer Reichweite der Lochkompensation nach ADR-009). 34 Teile und 13 Platten: 0 fail, 4 warn (dünne Stellen in den Upstream-Servohaltern); Druckpaket 1002 g, 103 h (vorher 1021 g, 104 h). Anlass war die Durchsicht eines Bauenden: die Platten behielten die Lage der veröffentlichten STLs (obere Halterung 56 mm hoch auf 19 × 6 mm Grundfläche, Femur mit 2 mm² Bettkontakt) | Slicer-Schätzung; noch kein Teil gedruckt |
| Tests für Festigkeit und Übersetzung | pytest tests/verify/test_strength.py, make drift | Q0 | Festigkeitstests 4 bestanden (Ausnahmemechanismus mit einem eingefügten ADR-Eintrag geprüft; das Flächenträgheitsmoment der steifen Koppel aus den Wänden stimmt auf 2 % mit der Formel des Hohlquadrats überein) | — |
2026-10-31 — Deutsche Seite, KI-Assistent, MCP-Server und Agent Skill
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Neu: Übersetzungskataloge vollständig und strukturell intakt | node docs-site/scripts/i18n-catalogues.mjs check (in make drift) | Q0 | 5746 von 5746 deutschen Segmenten; 0 defekt (Code-Spans, Mathematik, Linkziele, HTML-Tags, Fettmarkierungen, Tabellenzellen, Zeilenzahl) | nur Struktur: Wortlaut per Stichprobe und Terminologie-Durchgang geprüft, nicht von einem muttersprachlichen Lektorat |
| Prüfung rot gesehen | dieselbe | Q0 | schlug mit 5431/5433 fehl, solange zwei neue Absätze unübersetzt waren, und während der Übersetzung bei abweichenden Fettmarkierungen; eine vom Übersetzer umgruppierte Zahl (1126 → 1.126) macht das Segment jetzt unübersetzt, statt eine veraltete Zahl zu behalten (der Test schlägt mit der früheren Regel fehl) | — |
| Tests der Übersetzungs-Engine | node --test 'docs-site/scripts/*.test.mjs' (in make test-web) | Q0 | 7 bestanden: jede unübersetzte Seite rendert zurück zu ihrer englischen Quelle, deutsche Überschriften behalten die englischen IDs (Wiederholungen nummeriert wie bei VitePress), Zahlen werden in deutscher Schreibweise übernommen, das Zusammenführen behält/öffnet/verwirft Segmente, Strukturprüfung | synthetische Segmente plus jede veröffentlichte Seite |
| Build der deutschen Seite | make docs-build, gebautes HTML verglichen | Q0 | baut mit der Prüfung toter Links; 60 Seiten × Überschriften-IDs identisch in /docs/** und /de/docs/** (0 Abweichungen); jede deutsche Seite zu 100 % übersetzt | — |
| Deutsche Seite im Browser | verwaltetes Chrome, /de/, /de/docs/shop | Q2 | deutsche Navigation, Startseite, Shop (Plan A € 978,76), Seitenleiste, Sprachumschalter | visuelle Stichprobe |
| Neu: Tests des Assistenzdienstes | cd assistant && npm test (in make test-web) | Q0 | 34 bestanden: Eigentümerbindung, Prüfung von Header-Secret und cxu_-Token (Ablehnungen gecacht), Reihenfolge der SSE-Events, Stopp speichert stopped, Neu-Generieren ohne doppelte Frage, letzte Tool-Runde mit tool_choice: none, Magic Bytes und Grenzen von Anhängen, Kontingent pro Nutzer, Body-Grenzen, MCP initialize/list/call | gefälschter Modell-Transport, Fixture-Wissensbasis |
| Assistent gegen das echte Modell | make assistant + make docs, verwaltetes Chrome | Q2 | Keyring claude-sonnet-5: „Schlaufe des vorderen Knies“ beantwortet mit 32 mm = 1,2 × 25,6 mm, mit KaTeX und vier Quellenlinks; angeheftete Seitenleiste bleibt über Seitenwechsel erhalten; ein eingefügtes 2400 × 1600-Bild von Schritt 1 auf /de/docs/assembly/ auf Deutsch erkannt, mit Link zu Schritt 1; Stopp und dann Wiederholen speicherte eine Frage und eine Antwort; Unterhaltungen über die API aufgelistet, umbenannt, gelöscht | lokale Entwicklungsidentität; Zustand der Keyring-Zugangsdaten auf dem Stack nicht geprüft |
| MCP mit einem echten Client | @modelcontextprotocol/sdk Streamable-HTTP-Client gegen /mcp | Q2 | Werkzeuge search_docs, read_page, list_pages, search_parts; deutsche Suche nach „loop key arming“ liefert den Glossareintrag mit seinem /de/-Link; read_page liefert den Abschnitt der Verkabelungsliste | lokal, ohne App-Token (Entwicklungsidentität) |
| Produktions-Images und Identität | docker compose -f docker-compose.docs.yml -f docker-compose.cortex.yml (beide Targets) | Q2 | schreibgeschützte Container starten; Assistent ohne Header-Secret 401, mit ihm liefert er /me (ohne Keyring deaktiviert) und schreibt in sein Volume; ein gefälschtes cxu_-Token 401; Doku 200 auf /de/docs/ai | Cortex-Gateway-Route, Keyring und App-Key erst nach dem Deploy geprüft |
| 0.3.1 deployt (zwei Dienste, eigene Gateway-Route) | cortex deploy (Job mvwtwfpf-530e539a), cortex apps show strido, curl | Q2 | gesund auf c80f807 („SSO route HTTP 302, upstream HTTP 200; 2 live containers“); /api/health offen (61 en / 61 de Seiten, Modell konfiguriert); /, /de/, /llms.txt, /api/assistant/me, /mcp leiten ohne Sitzung zum SSO-Login um; ein gefälschter cxu_-Bearer erreicht den Assistenten und bekommt 401 aus der Token-Prüfung von Cortex | angemeldete Browser-Seiten nicht erneut geprüft (die Sitzung des Relay-Tabs war abgelaufen) |
| MCP auf der deployten Seite mit einem echten App-Token | Token erzeugt mit cortex api post /api/v1/apps/strido/tokens (1 Tag), SDK-Client, danach widerrufen | Q2 | tools/list 4 Werkzeuge; deutsches search_docs „Hauptsicherung Bemessung“ antwortet aus dem deutschen Glossar; search_parts „servo“ liefert die Stücklistenzeile; /api/agent/llms.txt 200, Skill-ZIP 615 655 Bytes; das Token bekommt 403 auf /api/assistant/*. cortex apps connect strido antwortet 404: Control erfasst .cortex/package.json nur für von Cortex erstellte Apps (TODO) | ein Token, ein Client |
2026-10-31 — Kabelbaum im CAD verlegt und geprüft
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Neu: Verkabelungsprüfung | python -m strido_verify.wiring (in make verify) | Q1 | 37 Kabel in 71 Abschnitten, 174 Prüfungen: 0 fail, 1 warn (W23, das eigene Kabel des LiDAR: Länge nicht veröffentlicht). Reichweite (zugeschnittene Abzweige mit Reserve und Crimp gezählt): am knappsten die vorderen Knie-Servokabel (243/241 von 250 mm nutzbar aus 260 mm), W19 STEMMA QT (125 von 140 mm). Vorrat: 18 AWG reicht nur, wenn die Stückliste auf 2 m pro Farbe erhöht wird. Hüftschlaufen: vorne 30/32 mm gegenüber 28,9/30,7 mm benötigt (1,2 × Kabelbinder-zu-Kabelbinder 24,1/25,6 mm), hinten 22 mm gegenüber 19,4 mm. Abstand in 13 Posen: kein Leiter durch ein Teil; nächstes bewegtes Teil ≥ 1 mm | Nenngeometrie; Biegeradien und Schlaufenform nicht modelliert; Kabelausgänge und gelieferte Kabellängen teils angenommen (TODO) |
| Prüfung während der Konstruktion rot gesehen | dasselbe | Q1 | erste Läufe schlugen fehl: W00/W15/W17/W19/W20 und drei vordere Servokabel zu kurz, Vorrat an 18 AWG und STEMMA QT zu knapp, die vordere Bus-Brücke 0,3 mm im FL-Unterschenkelservo an der inneren Hüftgrenze, der gesteckte Stecker der Akkuleitung im vorderen UBEC, ein Leiter außerhalb seiner verlegten Hülle gezeichnet (die Prüfung kontrolliert jetzt jeden gezeichneten Leiter). Nach der Reichweitenkorrektur aus dem Review schlugen die vorderen Knie-Servokabel (258/259 mm) und W22 (196 mm) fehl: Kreuzung der Knieleitungen zum Bushalter verlegt und der vordere Öffnungs-Kabelbinder auf den natürlichen Kabelweg, W22 jetzt aus zugeschnittenem 22-AWG-Draht. Jeweils in den Daten oder im CAD behoben, nicht durch eine lockerere Grenze | — |
| Review-Befunde behoben | Reviewer-Subagent auf die Änderung, dann make verify | Q1 | Reichweite ignorierte die Reserve der Abzweige und zählte das PCA-Ende als Stecker (beides behoben; Regressionstest schlägt mit der alten Regel fehl); Kabelbinder-Sockel waren nicht im Hindernisraster (jetzt Katalogteile); W10/W11 waren als Paare auf einen INA260 mit zwei Anschlüssen gezeichnet (jetzt Einzeldrähte + W24 Masse); W01 ohne Umwicklung, obwohl ungesichert (Spiralschlauch pro Kabel); W04-Hauptstrang fehlte in der Liste der Hauptsicherung; Montageanleitung verlegte den Kabelbaum, bevor die Verkabelung der Rückwand existierte, und steckte den Pi vor einer Versorgungsprüfung an (Schritt 20 erledigt jetzt beides, in dieser Reihenfolge) | — |
| Unit-Tests der Verkabelungsprüfung | pytest tests/verify/test_wiring.py tests/verify/test_electronics.py | Q0 | 17 bestanden: Reichweitenreserve, ein zugeschnittener Abzweig, der seine Reserve braucht, längster Servokabel-Abzweig, ein doppelt belegter Anschluss und ein Paar, das beide Schienen belegt, eine Schlaufe 1 mm kürzer als nötig, ein 22-AWG-Servoabzweig hinter der 25-A-Sicherung, ein Abzweig, der an seiner eigenen Sicherung gemessen wird | synthetische Zeilen plus die versionierte YAML |
| Vollständige CAD-Verifikation mit den Kabeln und den neu platzierten Leistungsteilen | make verify | Q1 | bestanden: Durchdringung 0 ungeklärte Überlappungen (erster Lauf fand den gedrehten LiDAR-Adapter in einer Schraubensäule des Sockels, behoben), Abstand unverändert (0 fail, 4 knapp), Sensoren: Kabel blockieren keinen LiDAR-Strahl und bleiben außerhalb des Kamerabilds, Verkabelung 173 ok / 1 warn | Kabel von den Teil-zu-Teil-Prüfungen ausgenommen (sie haben ihre eigene); Kabelbinder-Sockel werden geprüft |
| Elektronikprüfung der verlegten Kabel | python -m strido_verify.electronics | Q0 | 81 Prüfungen bestanden (3 ohne Reserve); der alte 18-AWG-Abgriff hinter der 25-A-Sicherung wäre durchgefallen und ist entfernt (eigene 14-AWG-Leitung des Logikhalters) | Strombelastbarkeitstabelle, kein thermisches Modell |
| Veröffentlichte Artefakte | make bom models manual renders viewer catalog | Q1 | Pläne A 978,76 € / B 1.126,97 € / C 1.145,24 € / D 987,73 € (Servoverlängerungen raus, Spiralschlauch, Kabelbinder-Sockel, Crimpkontakte, Lötzinn, 2. STEMMA QT und 2. 18-AWG-Satz rein); CAD-Masse 3,008 → 3,050 kg (Kabel pro Instanz gewogen, Pauschalposten entfernt); Montageanleitung 22 Schritte (Verkabelung Schritte 14–16 und 20), neues Rendering wiring.png, GLB mit dem Kabelbaum | Preise beobachtet am 2026-10-31 |
2026-10-31 — Dokumentationsseite: Shop, Druckpaket, Produktseiten, Lernen-Wiki
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Shop-Preise reproduzieren den Stücklisten-Optimierer | verwaltetes Chrome auf der gebauten Seite: kompletter Roboter im Warenkorb, Pläne A–D | Q2 | Warenkorbsummen 963,67 € / 1.107,16 € / 1.128,66 € / 972,64 € mit 8 / 4 / 9 / 8 Shops, gleich wie make bom; Paketkarte zeigt 963,67 € inkl. Versand (924,14 € Teile + 39,53 €); Reviewer hat dieselben Summen aus shop.json nachgerechnet | Angebote beobachtet am 2026-10-30; nichts bestellt |
| Download des Druckpakets | Druckpaket-Seite, kompletter Roboter, ZIP von der Seite abgefangen | Q2 | strido-print-package-1-robot.zip, 49 Dateien (README, Profil, 34 STLs mit Stückzahl im Namen, 13 Druckplatten), unzip -t fehlerfrei; Teileblatt 67 Stück, 719 g Graphit, 301 g Lime, 104 h 16 min | ZIP im Browser erzeugt, gespeichert (unkomprimiert) |
| Produktinformationen vollständig | make bom, pytest tests/workspace/test_products.py | Q0 | 59 Stücklistenzeilen und 34 Druckteile abgedeckt, jeder Lernen-Link löst auf; der Test zeigt auch, dass ein entferntes Teil und ein toter Wiki-Link gemeldet werden | Formulierungen geprüft, Datenblattwerte teils aus dem Gedächtnis (im Review markiert) |
| Seitenbuild und Links | make docs-build | Q0 | baut; Prüfung toter Links schlägt weiterhin bei einer fehlenden öffentlichen Datei (/viewer/missing.glb) und einem Verzeichnislink (/viewer/) fehl und akzeptiert vorhandene STL/GLB/INI/Log-Dateien | nur interne Links werden geprüft |
| Seitenaudit | verwaltetes Chrome, alle Seiten der Seitenleiste bei 1440×900 und 390×844, hell und dunkel | Q2 | 0 defekte Bilder, 0 fehlerhafte interne Links, 0 Konsolenfehler, kein horizontaler Überlauf auf Smartphones; 35 Befunde (3 defekt, 18 verwirrend) behoben, auf der neu gebauten Seite erneut geprüft | visuelle Prüfung, keine automatisierte Barrierefreiheitssuite |
| Ausweichlösung Schraubensicherung korrigiert | python -m strido_verify.fits | Q1 | 223 Schrauben ok 86 / warn 137 / fail 0, Sitze 32 / fail 0 (unverändert); Maßnahmen für schwache Vorbohrungen und ADR-009 nennen jetzt eine mit Sekundenkleber gehärtete Vorbohrung | nur Textänderung |
| Neu: Festigkeit von Beinen und Gelenken | python -m strido_verify.strength | Q1 | 19 Prüfungen: 18 ok, 1 warn, 0 fail. Knicken der langen Koppel in der Beinebene S = 0,34 in der ungünstigsten Pose mit Knieservo im Blockierzustand (bekannte Schwachstelle, ADR-010, begrenzt durch min_safety 0.3); Biegung Femur S = 3,2, Tibia S = 2,2, Lochleibung am Hüft-Servohorn S = 2,6; Drehmomentgrenzen für Vorbohrungen 0,05–0,35 N·m; Reviewer hat Femur-Biegung, Knicken und ein Vorbohrungs-Drehmoment von Hand nachgerechnet und in der ersten Version vertauschte Koppelachsen gefunden (behoben: Bolzenachse aus den Bohrungen); Querschnittsberechnung per Unit-Test gegen b·h³/12 geprüft (Mutation, die die Lochausrichtung beibehält, schlägt fehl: Fläche 104 statt 56 mm²) | statisch, nur Wandquerschnitte, Blockiermoment des Servos als Auslegungslast (Rücktreiben braucht mehr), angenommene Landung mit 3 × Gewicht, K = 0,7 quer zur Ebene; keine Ermüdung/Kriechen; kein physischer Test |
| Datenblattprüfung von Abweichungen und Produktspezifikationen | Recherche-Agent gegen Herstellerquellen (Hobbywing, Gens ace, Raspberry Pi, Seeed, NXP, ST, TI, Slamtec, SKF, Koyo, Prusament, Bossard) | statisch | UBEC 15 A Spitze bestätigt (20 A war das Flugzeugmodell); LiPo 60C; alle gelisteten Produktspezifikationen ok; Filamentangebote waren PLA (jetzt PETG); Kühler „JST“ unbestätigt (entfernt) | Lagerkennwerte von Markenteilen als Obergrenze für No-Name-Teile verwendet |
| Amazon-Warenkorb mit einem Klick | angemeldetes Chrome, gp/aws/cart/add.html mit einer ASIN (kein Klick auf der Seite) | Q2 | leitet über associates/addtocart auf einen leeren Warenkorb um: Das Formular benötigt ein Associates-Tag; ersetzt durch die geführte Kasse (window.open in einem Tab pro Shop, Checkliste gespeichert) | Amazon-Richtlinien können sich ändern |
| Pläne nach den PETG-Angeboten | make bom | Q0 | A 965,27 € (8 Shops), B 1.107,41 € (4), C 1.130,26 € (9), D 974,24 € (8) | Preise beobachtet am 2026-10-30/31 |
| LaTeX-Rendering des Wikis und des Festigkeitsberichts | make docs-build, gebautes HTML durchsucht, verwaltetes Chrome bei 1440 px und 390 px | Q0/Q2 | 0 MathJax-Fehlerknoten, 0 nicht gerenderte $…$-Paare in den gebauten Seiten (15 einzeilige <details>-Antworten mussten zum Rendern aufgeteilt werden); Theorieseiten mit je 73–121 Gleichungen; kein horizontaler Seitenüberlauf bei 390 px (abgesetzte Gleichungen scrollen innerhalb der Spalte) | visuelle Stichproben auf 4 Seiten, nicht jede Gleichung |
2026-10-31 — Überarbeitung v0.2.0 (Harness, Pakete, neue Prüfungen, Korrekturen)
| Prüfung | Befehl | Stufe | Beobachtetes Ergebnis | Grenze |
|---|---|---|---|---|
| Lint, strikte Typen (Core, NT-X, Workspace), Import-Schichten | make lint typecheck layers | Q0 | ruff sauber; mypy: keine Probleme in 21 Dateien; 3 import-linter-Verträge eingehalten | CAD/Verify/Publish-Pakete werden gelintet, aber nicht strikt typisiert |
| Generierte Quellen synchron | make drift | Q0 | Geometrie-Bindings, Elektronikbericht und NT-X-Assets aktuell; rot gesehen, als geometry.py umformatiert wurde und als sich Grenzen änderten | Text-Assets byteweise verglichen; NT-X-Meshes nur auf Vorhandensein |
| Python-Tests mit Coverage-Schwelle (80 %) | make test | Q0 | 73 bestanden, Coverage 83,7 % | Module, die in NT-X / über stdio laufen, sind von der Coverage ausgenommen und durch die Smoke-Tests abgedeckt |
Elektronik: Firmware-Header vs. hardware/electronics.yaml in beide Richtungen, eindeutige GPIO/I²C, Servokanäle, Lasten ≤ Sicherungen ≤ Strombelastbarkeit der Leitungen | python -m strido_verify.electronics | Q0 | 44/44 Prüfungen bestanden; Tests zeigen, dass ein vertauschter Pin, ein in der YAML fehlender Header-Pin, ein doppelter Kanal, eine Adresskollision, eine unterdimensionierte Leitung und eine UBEC-Überlast alle fehlschlagen | Ströme sind Datenblatt-/[ESTIMATE]-Werte, nicht gemessen |
| Firmware-Kern (Kinematik mit neuen Grenzen, Protokoll, Sicherheit) | make test-firmware | Q0 | 15/15 bestanden | nativer Host-Build, nicht der ESP32 |
| Durchdringung, 479 Körper, 4 Posen | make verify | Q1 | 0 ungeklärte Überlappungen (292 klassifizierte Überlappungen im Stand) | Mesh-Geometrie, Nennmaße |
| Neu: Passungen und Toleranzen jeder Schraube (223) und jedes Lager-/Buchsensitzes (32) | python -m strido_verify.fits | Q1 | 0 fail, 137 mit einer Maßnahme für den Erbauer (enges Loch an einer Mutterverbindung aufbohren, mit Sekundenkleber gehärtete Vorbohrung / Lochkompensation bei schwacher Vorbohrung), 86 ok; 29 der Warnungen sind die akzeptierten Vorbohrungen der Upstream-Servohalterungen (ADR-009: ohne die Akzeptanz fail). Rot gesehen mit 168 → 0 Fehlern beim Korrigieren des Modells und dreier echter Defekte (unten); Einschraubtiefe zählt nur Material, das die Schraube schneidet; ein Lager ohne Sitz schlägt fehl | CAD-Maße mit einem FDM-Schwindungsmodell von 0,15 mm; reale Drucke variieren je nach Drucker |
| Neu: Freigang bewegter Teile, 13 Betriebsposen | python -m strido_verify.clearance | Q1 | 0 fail (< 0,3 mm), 4 knapp (0,73–0,79 mm an der äußeren Hüftgrenze), 80 rotatorische Schnittstellen, 72 Gelenkschnittstellen (nur über echte Gelenke/Koppelbolzen); rot gesehen: beide Vorderfüße kollidierten in hips_in (50 fails) vor der Korrektur der Grenze; die Einschränkung der Ausnahme deckte das Paar RR-Schulter / Rückschale auf (0,73 mm, zuvor ausgenommen, weil es sich in der CAD-Pose berührte) | Nenngeometrie; Servospiel nicht modelliert |
| Bewegungsbereich mit gespiegeltem Partnerbein und 0,3 mm Abstand | python -m strido_verify.rom | Q1 | Hüftgrenzen jetzt FL/RL −17,5…50/45°, FR/RR −50/−45…17,5° (Einwärtsweg von 25–30° reduziert, damit sich die Füße nicht treffen können) | Raster 5°/2,5° |
| Sensor-Sichtfeld | python -m strido_verify.sensor_fov | Q1 | 0 von 720 LiDAR-Strahlen blockiert, Kamera sieht 0 % Roboter, 5 Posen | — |
| Neu: Druckpaket vollständig und druckbar | pytest tests/verify/test_print_kit.py | Q1 | 34 Teiletypen / 67 Stück, jede STL eine geschlossene Mannigfaltigkeit innerhalb 220 × 220 × 250 mm, jedes Stück auf genau einer 3MF-Druckplatte; rot gesehen: Kamerabasis und Neigeplatte fehlten auf den Druckplatten (trimesh verwirft 3MF-Knoten namens camera*) | Slicer-Einstellungen nicht simuliert |
| Stückliste deckt jedes CAD-Teil und Befestigungselement ab | make bom | Q1 | alle Strategien abgedeckt; niedrigste Summe 963,67 € (8 Shops) | Preise beobachtet am 2026-10-30 |
| MuJoCo-Gang | make sim-walk | Q2 | 0,15 m/s für 10 s → 1,104 m, Höhe 0,174 m, Gieren −1,7° | Kurshaltung über den Simulator |
| Gazebo Harmonic Gang ohne GUI, Gait-Node (ROS 2 Jazzy, Docker, arm64) | make sim-gazebo | Q2 | 8 s bei 0,15 m/s → 0,98 m vorwärts, seitlich −0,003 m, Höhe 0,178 m, Rollen/Nicken < 0,01 rad; joint_states, IMU, Scan (min. 0,49 m), Kamera und Odom veröffentlichen alle | nur Simulator; derselbe Container wie das Roboter-Image ohne den Pi-Kamera-Stack |
| Veröffentlichte PPO-Policy mit den neuen Grenzen | make rl-eval | Q2 | Befehl 0,2 m/s → 0,215 m/s Mittel, 2,15 m in 10 s, aufrecht | nur MuJoCo |
| PPO-Pipeline | make rl-smoke | Q2 | 20 k Schritte in 6 s, Policy exportiert und evaluiert (nicht auf Gehen trainiert) | nur Pipeline-Prüfung |
| Neu: Hardware-MCP-Server über stdio | make mcp-smoke | Q2 | 10 Tools gelistet, 9/9 Aufrufe ok | measure_gap durch die CAD-Tests abgedeckt, nicht durch den Smoke-Test |
| Neu: NT-X-Integration in der NT-X-Harness-Umgebung | make ntx-smoke | Q2 | Katalogroboter (12 Gelenke, 3,008 kg) und Skill laden; steht 2 s in NT-X MuJoCo (Basis 0,178 m, Neigung 0,0°); Adapter strido-serial registriert; RobotPort ↔ Fake-MCU auf Protokollebene: die echte Laufzeitausgabe von pd-pose (Verstärkungen + Schwerkraft-Vorsteuerung bis 0,06 N·m) → Positionsziel → Zustand mit zurückgemeldeter Befehlssequenz, IMU-Ausfall löst den Schutzstopp aus und hält ihn, Schutzstopp rastet ein, Schließen gibt das Gerät frei; rot gesehen, als der Modellpfad falsch war | Fake-MCU spricht das echte Protokoll, ist aber nicht die Firmware; Hardware-Sitzungen brauchen außerdem eine Basisschätzung (NT-X-Odometrieprüfung) |
| Neu: CAD-Regressionstests für die behobenen Passungsdefekte | make test-cad | Q1 | 3 bestanden (keine Schraubenpassung schlägt fehl; alle 4 Hüftdrehpunkt-Schrauben greifen in eine Servohalterung inkl. der Varianten _fl/_fr; Schrauben des LiDAR-Sockels greifen in den Sockel); rot gesehen mit der alten Vorbohrtiefe von 6 mm am Sockel (2 fehlgeschlagen: solid/fail) | dasselbe CAD-Maßmodell wie die Passungsprüfung |
| Neu: Dokumentationsseite und 3D-Ansicht | make docs-build, Vorschau in Chrome | Q2 | Seite baut; 3D-Ansicht lädt das GLB, Explosion / Schritt / Schalen / Befestigungselemente / Auswahl funktionieren (ausgewähltes Teil zeigt Name, ID, Anzahl, Schritt); Teilekatalog zeigt 76 Teiletypen; defekt gesehen: jedes einzigartige Mesh wurde zusätzlich am GLB-Ursprung in Millimetern exportiert (ein 100 m großer „Keil“ um den Roboter), bis die Geometrie ohne eigenen Knoten gespeichert wurde | nur Desktop-Chrome; keine Mobil-/Safari-Prüfung |
| Harness-Prüfungen (Drift der Agent-Konfiguration, Env-Doku, Arch-Scan, Secrets, npm audit) | make harness-check | Q0 | bestanden; gitleaks keine Lecks; npm audit 0 Schwachstellen; drei CAD-Definitionsmodule aus v0.1 im nur schrumpfenden Arch-Scan-Register als Baseline erfasst | Semgrep/Trivy übersprungen (aufwendige Sicherheitsprüfung aus) |
| Neu: Druckbarkeit: jedes Teil von einem echten Slicer geslict | make printability (PrusaSlicer 2.9.6, hardware/print/prusaslicer.ini) | Q1 | 34 Teiletypen und 13 Druckplatten: 0 fail. Jedes Teil wie vorgeschrieben geslict (Stützstrukturen/Brim) ohne Fehlermeldung und mit vollständigem G-Code; gestützte Teile zusätzlich ohne Stützstrukturen geslict und zeigen nur Probleme, die Stützstrukturen beheben; jede Druckplatte druckt alle ihre Teile ohne Werkzeugpfadkonflikte. Druckpaket 1021 g PETG (719 g Graphit, 301 g Lime: je eine 1-kg-Spule), 104 h. Wandstärkenscan 0 fail, 5 warn (Upstream-Femur und Servohalterungen: Wände 0,65–0,8 mm, druckbar, aber dünn). Rot gesehen: Elektronikdeck ohne Stützstrukturen (schwebende Brückenanker unter der IMU-Tasche); Tibias/kurze Koppeln/Hüftbolzen in veröffentlichter Ausrichtung (geringe Betthaftung, gefunden, sobald gestützte Teile den zusätzlichen ungestützten Slice erhielten); Druckplatten mit 4 mm Teileabstand (Werkzeugpfadkonflikte); Deck mit aus der Druckliste entfernten Stützstrukturen (Unit-Test des Parsers und ein Prüflauf) | Slicer-Simulation, kein Testdruck; dünne Bereiche kürzer als 5 mm und schmaler als 1 mm zählen als Spitzen |
| Neu: Spannungsdomänen der Elektronik | python -m strido_verify.electronics | Q0 | 16 Versorgungs-/Signalprüfungen bestanden: keine Schiene kann ein zulässiges Maximum überschreiten, jeder Nennpegel liegt im Bereich; 3 bestehen ohne Reserve, weil das Schienenminimum unter die Nennwerte reicht (Servo-PWM und LCD bei 3,3 V, dem niedrigsten Pegel, den sie akzeptieren); rot gesehen: Servoschiene bei der 7,4-V-Einstellung des UBEC und ein 6,3-V-UBEC (Tests) | Nennwerte aus Herstellerseiten/Datenblättern; Schienentoleranzen teils [ESTIMATE]; es gibt keine eigene Leiterplatte, daher gilt kein ERC/DRC/SPICE |
| Neu: Dokumentationsseite auf Cortex | docker compose -f docker-compose.docs.yml up --build docs; cortex deploy --ref b0fe000 (Job mvvsdmmc-108830e0) | Q2 | lokaler Container: /healthz ok, /docs/downloads 200, Baupaket 17,5 MB application/zip (57 Dateien, unzip -t fehlerfrei), PDF 13,9 MB; deployt 0.2.1: cortex apps show strido gesund („SSO route HTTP 302, upstream HTTP 200“); nicht authentifizierte Anfragen an /, /docs/downloads, das ZIP, das PDF und /healthz leiten alle (302) zum Cortex-SSO-Login um; angemeldet (Chrome): Startseite wird gerendert, ZIP/PDF/GLB-Downloads antworten 200 mit dem richtigen Typ | eine Browsersitzung; kein Lasttest |
Gefundene und behobene Defekte (Prüfungen und Review)
| Defekt | Gefunden durch | Behebung |
|---|---|---|
| Vorbohrungen des LiDAR-Sockels 9 mm tief für Schrauben, die 10 mm herausragen: Die Schrauben laufen auf Grund, bevor sie die Schale klemmen | Passungen (solid an der Spitze) | Vorbohrtiefe 11 mm (PEDESTAL_PILOT_DEPTH) |
| Vordere Servohalterungen (dieselbe STL wie hinten) haben keine Hüftdrehpunkt-Vorbohrung auf der Seite, die die Vorderbeine nutzen: 5,5 mm massiver Kunststoff | Passungen (solid) | Strido-Varianten left_servo_mount_fl, right_servo_mount_fr mit einer Ø2,5-mm-Vorbohrung (ADR-004) |
| Servohorn-Schrauben des rechten Femurs 3,7 mm neben den Löchern des gedruckten Femurs (STEP spiegelt die rechten Femurs; eine STL druckt alle vier) | Passungen (solid) | hardware/assembly/corrections.yaml: Scheibenhorn −30°, Femur-Verbinder +22° an FR/RR |
| Mittelschrauben des Oberschenkel-Servohorns am linken Bein zeigten vom Servo weg (Kopf im Verzahnungshohlraum platziert) | Passungen (nothing holds the screw) | Kopfsenkung = längste stirnseitig offene Bohrung in strido_cad.fasteners |
| Beide Vorderfüße (und beide Hinterfüße) konnten sich an den inneren Hüftgrenzen unter dem Körper treffen | Freigang (hips_in) | Bewegungsbereich-Durchlauf mit gespiegeltem Partnerbein und 0,3 mm Abstand (ADR-005) |
| Kamerabasis und Neigeplatte fehlten auf den 3MF-Druckplatten von v0.1.0 | Druckpaket-Test | Knotennamen der Druckplatten mit Präfix part_ |
| Hüft-Scheibenhörner des rechten Beins durch die Femur-Korrektur verschoben (falscher Körper) | Bewegungsbereich (äußere RR-Grenze auf 20° eingebrochen) | Korrekturen gelten pro Starrkörper |
Der serielle NT-X-Port lehnte jeden Befehl des mitgelieferten pd-pose-Skills ab (Schwerkraft-Vorsteuerung ist nie null) und meldete bei IMU-Ausfall einen ebenen, ruhenden Roboter | Review; make ntx-smoke verwendet jetzt die echte Laufzeitausgabe | Vorsteuerung entfernt, kp <= 0 abgelehnt, IMU-Ausfall führt in den sicheren Zustand, veraltete Frames verworfen |
| CAD-Cache lieferte nach einem Revert Meshes einer älteren Quelle aus (Manifest pro Digest, Meshes an festen Pfaden) | make check schlug fehl, nachdem ein absichtlicher Prüfungsbruch zurückgenommen wurde | ein Manifest, nur gültig für den Digest des letzten Builds; rot/grün gesehen durch Brechen und Wiederherstellen von PEDESTAL_PILOT_DEPTH |
| Freigang-Ausnahme deckte jedes in der CAD-Pose berührende Paar ab, nicht nur Gelenke | Review | Ausnahme auf Körper beschränkt, die durch ein Gelenk oder einen Koppelbolzen verbunden sind; deckte ein knappes Paar auf (0,73 mm) |
| Elektronikdeck ohne Stützstrukturen gedruckt: Der Boden der IMU-Tasche ist eine 18-mm-Brücke mit schwebenden Ankern | Druckbarkeit (Slicer) | Deck als supports=True deklariert |
| Tibias (135 mm aufrecht), kurze Koppeln und Hüftlagerbolzen haben in der veröffentlichten Ausrichtung zu wenig Bettkontakt | Druckbarkeit (ungestützter Analyse-Slice) | im Druckpaket flach umorientiert; Tibias 1,5 h statt 2,5 h |
| 3MF-Druckplatten mit 4 mm Abstand gepackt: Benachbarte gestützte Teile erzeugten widersprüchliche Werkzeugpfade | Druckbarkeit (Slicer) | 10 mm Abstand, eng anliegende Stützstrukturen, First-Fit-Packung (13 Druckplatten) |
| Ecken des XT60-Fensters ließen 0,26 mm dünne Stege im Blendendom; im FDM-Druck verrundete Innenecken würden die eckige XT60-Haube klemmen | Dickenscan, Review | Dom auf einen oberen und einen unteren Bogen reduziert; 0,5 mm Dog-Bone-Eckfreistiche in Blende und Klemmring |
| Eine 6,2-mm-Schraubendreherbohrung im 6 mm dicken Bushalter-Trennsteg ließ 0,1 mm dünne Stege | Dickenscan | Zugangsschlitz statt der Bohrung |
| Abnahmefenster des UBEC (6,0 ± 0,1 V) ließ 6,1 V an einem für 6,0 V spezifizierten Servo zu | Spannungsdomänen-Prüfung | 5,8–6,0 V im Leerlauf akzeptieren |
2026-10-30 — v0.1.0
Auszüge der Befehlsausgabe sind pro Zeile verlinkt (docs/verification/logs/); absichtliche Prüfungsbrüche stehen in gates.txt. Befehle beziehen sich auf das Layout von v0.1.0 (tools/…).
| Prüfung | Befehl | Stufe | Ergebnis | Log |
|---|---|---|---|---|
| Befestigungselemente aus den gemessenen Lochstapeln abgeleitet; platzierte Befestigungselemente müssen den Regelsummen entsprechen | make verify (hole_stacks.py, fasteners.py) | statisch | alle Stapel zugeordnet; Platzierungen = Regelanzahlen (Prüfung nachweislich rot durch Auftrennen der geteilten Tibia-Bolzenstapel) | verify.txt |
| Durchdringung von 479 Körpern (gedruckt, gekauft, Befestigungselemente) im Stand 170 mm, Hocke 120 mm, hoch 210 mm und in der CAD-Pose | interference_check.py | statisch | 0 ungeklärte Überlappungen in allen 4 Posen; jede verbleibende Überlappung ist klassifiziert (Gewindeeingriff, Sitzkontakt, Gelenk, Upstream-Passung, Upstream-Befestigungselement auf seiner gemessenen Lochachse) – interference.md | verify.txt |
| LiDAR-Verdeckung (720 Strahlen) und Kamera-Eigensicht, 5 Posen inkl. Trot und voller Hüftabduktion | sensor_fov.py | statisch | 0 Strahlen blockiert; Roboter in 0,0 % des Kamerabilds – sensors.md | verify.txt |
| Bewegungsbereich: Raster Oberschenkel × Unterschenkel (5°) bei null Abduktion, Übertragungswinkel ≥ 25°; Hüftbereich im Stand und in mittlerer Pose | rom_sweep.py | statisch | Grenzen wie in hardware/joint_limits.yaml eingecheckt (kein Diff nach dem Lauf) | verify.txt |
| Generierte Geometrie in Firmware/Python entspricht der YAML | codegen.py --check | statisch | keine Abweichung | verify.txt, test.txt |
| Druckbarkeit: geschlossene Mannigfaltigkeit, passt in 220 × 220 × 250 mm, liegt auf dem Bett | make print | statisch | 32 Teiletypen / 67 Stück bestanden | docs.txt |
| Stückliste liefert jedes gekaufte Teil und Befestigungselement des CAD für die Angebote, die jede Strategie kauft (Packungen aufgerundet, Befestigungselemente + max(2, 10 %) Reserve) | make bom | statisch | alles abgedeckt in allen 4 Strategien; Prüfung nachweislich rot durch Entfernen des M3 × 10-Vorrats | docs.txt |
| Python-Kern: Protokoll (CRC-Vektor gemeinsam mit der Firmware, COBS, Beschädigung, Resynchronisation), IK/FK, Inverse des Kniekoppelgetriebes, Gait-Grenzen inkl. der Kniekurbel-Begrenzung, CLI-Kalibrierung und die Weigerung der CLI, wenn der Controller die Servos entspannt hält (Fake-Controller an einem Pseudoterminal) | pytest | Unit | 27 bestanden; der Kurbelgrenzen-Test schlägt fehl, wenn die Begrenzung entfernt wird | test.txt, gates.txt |
| Firmware-Kern: Kinematik, Protokoll, Watchdog, Not-Aus, entprellte Akku-Abschaltung, kein Ansteuern ohne Power-Monitor (Kalibrierung am Prüfstand erlaubt), NaN-Ablehnung | pio test -e native | Unit | 15/15 bestanden; der NaN-Test schlägt mit der alten Begrenzung fehl | test.txt, gates.txt |
| Firmware-Build für den XIAO ESP32-S3 | pio run -e xiao_esp32s3 | Build | erfolgreich, RAM 8,0 %, Flash 16,0 % | firmware.txt |
mcu_bridge (ROS-2-Jazzy-Container) gegen einen Fake-Controller an einem rohen Pseudoterminal | Wegwerfskript | Integration | STATE → /joint_states (Go2-Namen) und /battery_state (7,7 V, −1,2 A); Befehl → JOINT_COMMAND; NaN-Befehl verworfen; relax → JOINT_COMMAND(relax); Not-Aus → ESTOP; kein Frame verloren | mcu_bridge_fake.txt |
| MuJoCo, Produktions-Gait (Kurshaltung nutzt den Gierwinkel des Simulators) | make sim-walk | Simulation | 0,15 m/s: 1,10 m in 10 s, Höhe 0,174 m, Gieren −1,7°; Drehung 0,6 rad/s: 197,9° in 6 s (−162,1° umgebrochen) | mujoco_walk.txt |
| Gazebo Harmonic Gang ohne GUI, Gait-Node (ROS 2 Jazzy, Docker, arm64) | make sim-gazebo | Simulation | 1,00 m in 8 s bei 0,15 m/s, seitlich 0,12 m, Rollen/Nicken < 0,1 rad, alle Sensor-Topics veröffentlichen | gazebo.txt |
| PPO-Policy, 20 M Schritte (1734 s, CPU), Anstiegsbegrenzung der Firmware modelliert | make rl-train, evaluate.py | Simulation | MuJoCo, 10 s pro Befehl: vx 0,2 → 0,210 m/s (Gieren 2°), 0,15 → 0,152 m/s, 0 → steht, −0,1 → −0,068 m/s, vy 0,1 → 0,023 m/s (schwach), wz 0,5 → 232° in 10 s (−128,4° umgebrochen) | rl_eval.txt |
Dieselbe Policy in Gazebo über policy_node (Sim-to-Sim) | make sim-gazebo POLICY=build/rl/ppo-v1/policy.npz | Simulation | 0,82 m in 8 s bei 0,15 m/s, seitlich 0,10 m, aufrecht | gazebo.txt |
| Abruf der Hersteller-CAD | make vendor-cad | — | 8 von 9 Downloads per SHA-256 verifiziert; die Littelfuse-Datei liegt hinter einem Formular (manueller Download, Hüllkörper als Ersatz) | gates.txt |
Nicht verifiziert
- Nichts wurde gedruckt, montiert, verkabelt oder eingeschaltet. Passungen sind gegen CAD und Datenblätter geprüft, nicht gegen gedruckte Teile (rechnen Sie damit, Loch- und Lagerpassungen an Ihren Drucker anpassen zu müssen).
- Servostrom, Laufzeit und thermisches Verhalten sind Schätzungen (Elektronik). Der Wert des OE-Pull-ups setzt voraus, dass der Pull-down der PCA9685-Platine ≥ 10 kΩ ist (messen Sie OE während des Resets wie beschrieben).
- Datenblatt-Hüllkörper (keine Hersteller-CAD): Servos (Upstream-STEP-Modell), WAGO 221-415, LiPo, UBEC, Taster, LiDAR-USB-Adapter (Größe unbestätigt).
- Upstream-Gelenkbefestigungselemente werden aus Lochstapeln mit ungefährer Kopfseite und Mutterausrichtung platziert; sie sind Teil der statischen Durchdringungsprüfung, aber nicht des Bewegungsbereich-Durchlaufs.
- Das Knie ist in Gazebo/MuJoCo ein Drehgelenk; Nachgiebigkeit und Spiel des Koppelgetriebes werden nicht simuliert. Die gelernte Policy hat keine echte Servodynamik gesehen.
- Der Kamera-Node auf dem Pi 5 benötigt den libcamera-Fork von Raspberry Pi (nicht im Docker-Image);
robot.launch.pywurde nicht auf einem Pi ausgeführt.