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>
134 lines
8.3 KiB
XML
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="<b>01 · Bootstrap</b><br>Go/Echo + VueJS + PostgreSQL<br>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="<b>02 · Manage Fruits</b><br>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="<b>03 · Import Fruit DB</b><br>SQL script · obstsorten.xml<br>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="<b>04 · Fruit Publications</b><br>CRUD · PDF · cover image<br>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="<b>06 · Fruit Search</b><br>name + synonyms + type filter<br>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="<b>08 · Authorize User</b><br>.env user map · bcrypt+salt<br>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="<b>05 · Import Publications</b><br>Python · osws.xml<br>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="<b>07 · Improve Overview</b><br>fruit cards · auto-crop thumbnail<br>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="<b>Legend</b>" 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="<b>Recommended sequential order:</b> 01 → 02 → 03 → 04 → 05 → 06 → 07 → 08<br><i>03 / 04 / 06 can run in parallel after 02 · 08 best done last to protect all features</i>" 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> |