Files
osdb-1-claude-opusplan/docs/planning/dependencies.drawio
T
juliaandClaude Sonnet 4.6 1070ba3ac1 docs: add sprint planning — dependency diagram + specs for all 8 stories
Analyzes all Taiga stories, maps hard/soft dependencies, and writes
full specs (Goal, Data Model, Components, Verification, Open Questions)
for every story before any implementation begins.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 11:53:24 +02:00

134 lines
8.3 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" version="21.0.0">
<diagram name="OSDB Story Dependencies" id="osdb-deps">
<mxGraphModel dx="1422" dy="762" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- ===== LAYER LABELS ===== -->
<mxCell id="lbl0" value="Layer 1: Foundation" style="text;html=1;align=left;fontSize=10;fontStyle=2;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="20" y="55" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="lbl1" value="Layer 2: Core Domain" style="text;html=1;align=left;fontSize=10;fontStyle=2;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="20" y="175" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="lbl2" value="Layer 3: Features (parallel)" style="text;html=1;align=left;fontSize=10;fontStyle=2;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="20" y="315" width="190" height="20" as="geometry" />
</mxCell>
<mxCell id="lbl3" value="Layer 4: Enrichment" style="text;html=1;align=left;fontSize=10;fontStyle=2;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="20" y="455" width="160" height="20" as="geometry" />
</mxCell>
<!-- ===== STORY NODES ===== -->
<!-- S01: Bootstrap -->
<mxCell id="s01" value="&lt;b&gt;01 · Bootstrap&lt;/b&gt;&lt;br&gt;Go/Echo + VueJS + PostgreSQL&lt;br&gt;golang-migrate · port 3000/5000" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="430" y="40" width="240" height="60" as="geometry" />
</mxCell>
<!-- S02: Manage Fruits -->
<mxCell id="s02" value="&lt;b&gt;02 · Manage Fruits&lt;/b&gt;&lt;br&gt;CRUD · synonyms · type · images" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="430" y="160" width="240" height="60" as="geometry" />
</mxCell>
<!-- S03: Import Fruit DB -->
<mxCell id="s03" value="&lt;b&gt;03 · Import Fruit DB&lt;/b&gt;&lt;br&gt;SQL script · obstsorten.xml&lt;br&gt;images: einzelfruechte/blueten/baume" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="190" y="300" width="220" height="70" as="geometry" />
</mxCell>
<!-- S04: Publications -->
<mxCell id="s04" value="&lt;b&gt;04 · Fruit Publications&lt;/b&gt;&lt;br&gt;CRUD · PDF · cover image&lt;br&gt;linked fruits · fruit images" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="450" y="300" width="220" height="70" as="geometry" />
</mxCell>
<!-- S06: Search -->
<mxCell id="s06" value="&lt;b&gt;06 · Fruit Search&lt;/b&gt;&lt;br&gt;name + synonyms + type filter&lt;br&gt;combined-type aliases" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="710" y="300" width="200" height="70" as="geometry" />
</mxCell>
<!-- S08: Auth -->
<mxCell id="s08" value="&lt;b&gt;08 · Authorize User&lt;/b&gt;&lt;br&gt;.env user map · bcrypt+salt&lt;br&gt;route protection · hide UI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="940" y="300" width="200" height="70" as="geometry" />
</mxCell>
<!-- S05: Import Publications -->
<mxCell id="s05" value="&lt;b&gt;05 · Import Publications&lt;/b&gt;&lt;br&gt;Python · osws.xml&lt;br&gt;PDFs + images per pub/fruit" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="280" y="450" width="220" height="70" as="geometry" />
</mxCell>
<!-- S07: Improve Overview -->
<mxCell id="s07" value="&lt;b&gt;07 · Improve Overview&lt;/b&gt;&lt;br&gt;fruit cards · auto-crop thumbnail&lt;br&gt;thumbnail_data col · backfill" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="540" y="450" width="220" height="70" as="geometry" />
</mxCell>
<!-- ===== EDGES ===== -->
<!-- 01 → 02 (hard) -->
<mxCell id="e01_02" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s01" target="s02" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 02 → 03 (hard) -->
<mxCell id="e02_03" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s02" target="s03" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 02 → 04 (hard) -->
<mxCell id="e02_04" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s02" target="s04" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 02 → 06 (hard) -->
<mxCell id="e02_06" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s02" target="s06" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 01 → 08 (hard — needs app skeleton) -->
<mxCell id="e01_08" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s01" target="s08" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 03 → 05 (hard — fruits must be imported first) -->
<mxCell id="e03_05" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s03" target="s05" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 04 → 05 (hard — publications table must exist) -->
<mxCell id="e04_05" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s04" target="s05" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 04 → 07 (hard — publication fruit images needed) -->
<mxCell id="e04_07" style="edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" source="s04" target="s07" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- 02 → 07 (dashed — fruit images also used) -->
<mxCell id="e02_07" style="edgeStyle=orthogonalEdgeStyle;rounded=0;dashed=1;endArrow=open;" edge="1" source="s02" target="s07" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- ===== LEGEND ===== -->
<mxCell id="leg_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="940" y="450" width="210" height="90" as="geometry" />
</mxCell>
<mxCell id="leg_title" value="&lt;b&gt;Legend&lt;/b&gt;" style="text;html=1;align=center;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="940" y="455" width="210" height="20" as="geometry" />
</mxCell>
<mxCell id="leg_hard" value="──▶ Hard dependency (must implement first)" style="text;html=1;align=left;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="950" y="478" width="200" height="20" as="geometry" />
</mxCell>
<mxCell id="leg_soft" value="- - ▷ Soft dependency (reuses model)" style="text;html=1;align=left;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="950" y="500" width="200" height="20" as="geometry" />
</mxCell>
<!-- ===== IMPLEMENTATION ORDER ===== -->
<mxCell id="order_box" value="&lt;b&gt;Recommended sequential order:&lt;/b&gt; 01 → 02 → 03 → 04 → 05 → 06 → 07 → 08&lt;br&gt;&lt;i&gt;03 / 04 / 06 can run in parallel after 02 · 08 best done last to protect all features&lt;/i&gt;" style="text;html=1;align=left;fontSize=10;fillColor=#fffacd;strokeColor=#aaa;rounded=1;" vertex="1" parent="1">
<mxGeometry x="190" y="560" width="700" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>