feat(rack): populate rack01 and wire gen_rack into make targets

Add rack placement frontmatter to mf00–mf04, fix pre-existing schema
error in docs/services/coursemanagement.md (missing kind/name fields),
extend Makefile docs-index and docs-check targets to also run gen_rack,
add test target, generate rack01.md and rack01-elevation.svg.

Positions are provisional placeholders to prove the pipeline; correct when mounting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sjat 2026-06-24 13:56:09 +02:00
parent 039b1212b9
commit 15666e0470
9 changed files with 208 additions and 4 deletions

View file

@ -1,4 +1,4 @@
.PHONY: help docs-index docs-build docs-serve docs-check slides
.PHONY: help docs-index docs-build docs-serve docs-check slides test
help:
@echo "Targets:"
@ -7,10 +7,12 @@ help:
@echo " docs-serve Run a live-reload local preview server"
@echo " docs-check Drift-check: regenerate indices, fail if they differ from the committed copies"
@echo " slides Run build-slides.sh (Marp slides)"
@echo " test Run the Python unit tests (pytest)"
docs-index:
python3 scripts/gen_overview.py --category hardware
python3 scripts/gen_overview.py --category services
python3 scripts/gen_rack.py
docs-build:
mkdocs build --strict
@ -21,7 +23,11 @@ docs-serve:
docs-check:
python3 scripts/gen_overview.py --category hardware
python3 scripts/gen_overview.py --category services
git diff --exit-code docs/hardware/index.md docs/services/index.md
python3 scripts/gen_rack.py
git diff --exit-code docs/hardware/index.md docs/services/index.md docs/infrastructure/racks/
slides:
./build-slides.sh
test:
pytest -q

View file

@ -9,6 +9,10 @@ cpu_threads: "?"
ram_gb: "?"
storage: "?"
nic_gbps: "?"
rack: rack01
rack_u: 1
u_height: 1
rack_face: front
---
## Notes

View file

@ -11,6 +11,10 @@ ram_type: DDR4-2666 non-ECC UDIMM
storage_gb: 40
storage_type: nvme
nic_gbps: 1
rack: rack01
rack_u: 2
u_height: 1
rack_face: front
---
## Notes

View file

@ -11,6 +11,10 @@ ram_type: DDR4-2666 non-ECC UDIMM
storage_gb: 40
storage_type: nvme
nic_gbps: 1
rack: rack01
rack_u: 3
u_height: 1
rack_face: front
---
## Notes

View file

@ -10,6 +10,10 @@ ram_gb: 8
storage_gb: 500
storage_type: hdd
nic_gbps: 1
rack: rack01
rack_u: 5
u_height: 2
rack_face: front
---
## Notes

View file

@ -10,6 +10,10 @@ ram_gb: 8
storage_gb: 500
storage_type: hdd
nic_gbps: 1
rack: rack01
rack_u: 5
u_height: 2
rack_face: rear
---
## Notes

View file

@ -0,0 +1,160 @@
<svg xmlns="http://www.w3.org/2000/svg" width="584" height="1012" viewBox="0 0 584 1012" font-family="sans-serif" font-size="11">
<rect width="584" height="1012" fill="#ffffff"/>
<text x="12" y="28" font-size="16" font-weight="bold">Rack rack01</text>
<text x="162" y="34" text-anchor="middle" font-weight="bold">front</text>
<rect x="42" y="40" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="60" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="80" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="100" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="120" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="140" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="160" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="180" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="200" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="220" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="240" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="260" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="280" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="300" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="320" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="340" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="360" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="380" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="400" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="420" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="440" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="460" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="480" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="500" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="520" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="540" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="560" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="580" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="600" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="620" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="640" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="660" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="680" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="700" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="720" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="740" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="760" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="780" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="800" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="820" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="840" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="860" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="880" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="900" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="920" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="940" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="960" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="42" y="980" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<text x="452" y="34" text-anchor="middle" font-weight="bold">rear</text>
<rect x="332" y="40" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="60" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="80" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="100" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="120" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="140" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="160" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="180" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="200" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="220" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="240" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="260" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="280" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="300" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="320" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="340" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="360" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="380" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="400" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="420" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="440" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="460" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="480" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="500" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="520" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="540" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="560" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="580" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="600" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="620" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="640" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="660" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="680" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="700" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="720" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="740" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="760" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="780" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="800" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="820" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="840" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="860" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="880" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="900" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="920" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="940" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="960" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<rect x="332" y="980" width="240" height="20" fill="#f5f5f5" stroke="#e0e0e0"/>
<text x="38" y="54" text-anchor="end" fill="#999">1</text>
<text x="38" y="74" text-anchor="end" fill="#999">2</text>
<text x="38" y="94" text-anchor="end" fill="#999">3</text>
<text x="38" y="114" text-anchor="end" fill="#999">4</text>
<text x="38" y="134" text-anchor="end" fill="#999">5</text>
<text x="38" y="154" text-anchor="end" fill="#999">6</text>
<text x="38" y="174" text-anchor="end" fill="#999">7</text>
<text x="38" y="194" text-anchor="end" fill="#999">8</text>
<text x="38" y="214" text-anchor="end" fill="#999">9</text>
<text x="38" y="234" text-anchor="end" fill="#999">10</text>
<text x="38" y="254" text-anchor="end" fill="#999">11</text>
<text x="38" y="274" text-anchor="end" fill="#999">12</text>
<text x="38" y="294" text-anchor="end" fill="#999">13</text>
<text x="38" y="314" text-anchor="end" fill="#999">14</text>
<text x="38" y="334" text-anchor="end" fill="#999">15</text>
<text x="38" y="354" text-anchor="end" fill="#999">16</text>
<text x="38" y="374" text-anchor="end" fill="#999">17</text>
<text x="38" y="394" text-anchor="end" fill="#999">18</text>
<text x="38" y="414" text-anchor="end" fill="#999">19</text>
<text x="38" y="434" text-anchor="end" fill="#999">20</text>
<text x="38" y="454" text-anchor="end" fill="#999">21</text>
<text x="38" y="474" text-anchor="end" fill="#999">22</text>
<text x="38" y="494" text-anchor="end" fill="#999">23</text>
<text x="38" y="514" text-anchor="end" fill="#999">24</text>
<text x="38" y="534" text-anchor="end" fill="#999">25</text>
<text x="38" y="554" text-anchor="end" fill="#999">26</text>
<text x="38" y="574" text-anchor="end" fill="#999">27</text>
<text x="38" y="594" text-anchor="end" fill="#999">28</text>
<text x="38" y="614" text-anchor="end" fill="#999">29</text>
<text x="38" y="634" text-anchor="end" fill="#999">30</text>
<text x="38" y="654" text-anchor="end" fill="#999">31</text>
<text x="38" y="674" text-anchor="end" fill="#999">32</text>
<text x="38" y="694" text-anchor="end" fill="#999">33</text>
<text x="38" y="714" text-anchor="end" fill="#999">34</text>
<text x="38" y="734" text-anchor="end" fill="#999">35</text>
<text x="38" y="754" text-anchor="end" fill="#999">36</text>
<text x="38" y="774" text-anchor="end" fill="#999">37</text>
<text x="38" y="794" text-anchor="end" fill="#999">38</text>
<text x="38" y="814" text-anchor="end" fill="#999">39</text>
<text x="38" y="834" text-anchor="end" fill="#999">40</text>
<text x="38" y="854" text-anchor="end" fill="#999">41</text>
<text x="38" y="874" text-anchor="end" fill="#999">42</text>
<text x="38" y="894" text-anchor="end" fill="#999">43</text>
<text x="38" y="914" text-anchor="end" fill="#999">44</text>
<text x="38" y="934" text-anchor="end" fill="#999">45</text>
<text x="38" y="954" text-anchor="end" fill="#999">46</text>
<text x="38" y="974" text-anchor="end" fill="#999">47</text>
<text x="38" y="994" text-anchor="end" fill="#999">48</text>
<rect x="43" y="41" width="238" height="18" rx="3" fill="#4c78a8" stroke="#333"/>
<text x="162" y="54" text-anchor="middle" fill="#ffffff">mf00 (U1)</text>
<rect x="43" y="61" width="238" height="18" rx="3" fill="#4c78a8" stroke="#333"/>
<text x="162" y="74" text-anchor="middle" fill="#ffffff">mf01 (U2)</text>
<rect x="43" y="81" width="238" height="18" rx="3" fill="#4c78a8" stroke="#333"/>
<text x="162" y="94" text-anchor="middle" fill="#ffffff">mf02 (U3)</text>
<rect x="43" y="121" width="238" height="38" rx="3" fill="#4c78a8" stroke="#333"/>
<text x="162" y="144" text-anchor="middle" fill="#ffffff">mf03 (U5U6)</text>
<rect x="333" y="121" width="238" height="38" rx="3" fill="#4c78a8" stroke="#333"/>
<text x="452" y="144" text-anchor="middle" fill="#ffffff">mf04 (U5U6)</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,17 @@
# Rack rack01
_Auto-generated from `docs/hardware/*.md` (items with `rack: rack01`) — do not edit by hand. Run `make docs-index` after changing a source file._
## Elevation
![Rack rack01 elevation](rack01-elevation.svg)
## Occupancy
| U | Device | Kind | Face | Status |
|---|---|---|---|---|
| U1 | [mf00](../../hardware/mf00.md) | server | front | staging |
| U2 | [mf01](../../hardware/mf01.md) | server | front | staging |
| U3 | [mf02](../../hardware/mf02.md) | server | front | staging |
| U5U6 | [mf03](../../hardware/mf03.md) | server | front | staging |
| U5U6 | [mf04](../../hardware/mf04.md) | server | rear | staging |

View file

@ -1,6 +1,7 @@
---
name: event management
status: proposal
name: coursemanagement
kind: web-app
status: planned
---
# Problem statement