9.4 KiB
Hardware Naming Migration Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Apply the approved hardware naming scheme by renaming the placeholder compute nodes mf00–mf04 to srv01–srv05, recording cluster membership in frontmatter, and syncing the prose references — leaving all generated artifacts and the drift guard green.
Architecture: Pure data + docs migration; no generator logic changes. The compute files are renamed (git mv), their hostname: field updated to match (the repo enforces filename-stem == hostname), cluster: tappaas added to the one known node, then make docs-index regenerates the hardware index and rack artifacts. Because mf00–mf04 are referenced only by themselves (their power:/links: point outward to pdu*/sw*/pp*, with no reverse references), the rename cascades cleanly through regeneration.
Tech Stack: Markdown frontmatter, Python generators (gen_overview.py, gen_rack.py) run via make, MkDocs Material, pytest.
Spec: notes/dev/specs/2026-06-24-hardware-naming-scheme.md.
Global Constraints
- No code changes to
scripts/*.py,tests/*,Makefile, CI,mkdocs.yml, orscripts/overview_config.yml. Thecluster:field is free-form frontmatter the generators ignore by design; it needs no enum or validation in this migration (the spec defers generator/grouping work). - Identifier format per the scheme:
<kind-abbrev><NN>, 2-digit zero-padded, unique within a kind, starting at01. Compute =srv. - A renamed file's
hostname:field MUST equal its new filename stem, orgen_overview.pyfails (filename stem != hostname). - Preserve each file's body and all other frontmatter unchanged — only
hostname:changes (plus the one addedcluster:line). cluster:values are provisional except the one known mapping:srv01(wasmf00, "TaPPaaS node 1") →cluster: tappaas. Do not invent cluster values forsrv02–srv05; leave the field off them until real assignments are given.makerfloss.eu(cloud FQDN) is untouched — it keeps its real hostname and gets nocluster:.- Test-fixture hostnames in
tests/test_gen_rack.py(syntheticmf00/mf01strings) and the historical phase specs/plans undernotes/dev/are out of scope — they are illustrative/historical, not references to the renamed files. - After each task:
make testpasses (49 tests, unaffected — fixtures are synthetic),mkdocs build --strictpasses, andmake docs-checkexits 0.
Name mapping (this migration)
| Old file | New file | hostname: |
cluster: |
|---|---|---|---|
mf00.md |
srv01.md |
srv01 |
tappaas |
mf01.md |
srv02.md |
srv02 |
(omit) |
mf02.md |
srv03.md |
srv03 |
(omit) |
mf03.md |
srv04.md |
srv04 |
(omit) |
mf04.md |
srv05.md |
srv05 |
(omit) |
Task 1: Rename mf00–mf04 → srv01–srv05, add cluster, regenerate
Files:
- Rename:
docs/hardware/mf00.md→srv01.md,mf01.md→srv02.md,mf02.md→srv03.md,mf03.md→srv04.md,mf04.md→srv05.md - Modify (each renamed file):
hostname:line; addcluster: tappaastosrv01.md - Regenerate:
docs/hardware/index.md,docs/infrastructure/racks/rack01.md,docs/infrastructure/racks/rack01-elevation.svg
Interfaces:
-
Consumes:
make docs-index(runsgen_overview.py+gen_rack.py),make test,make docs-check,mkdocs build --strict. -
Step 1: Rename the five files with
git mv(preserves history + body)
cd /home/sjat/Projects/MakerFLOSS
git mv docs/hardware/mf00.md docs/hardware/srv01.md
git mv docs/hardware/mf01.md docs/hardware/srv02.md
git mv docs/hardware/mf02.md docs/hardware/srv03.md
git mv docs/hardware/mf03.md docs/hardware/srv04.md
git mv docs/hardware/mf04.md docs/hardware/srv05.md
- Step 2: Update the
hostname:field in each renamed file
In each file, change the hostname: line (line 2) to match its new stem. Make exactly these five edits:
docs/hardware/srv01.md:hostname: mf00→hostname: srv01docs/hardware/srv02.md:hostname: mf01→hostname: srv02docs/hardware/srv03.md:hostname: mf02→hostname: srv03docs/hardware/srv04.md:hostname: mf03→hostname: srv04docs/hardware/srv05.md:hostname: mf04→hostname: srv05
Do not change any other line in these files.
- Step 3: Add
cluster: tappaastosrv01.mdonly
In docs/hardware/srv01.md, insert a cluster: tappaas line immediately after the status: staging line, so the top of the frontmatter reads:
---
hostname: srv01
kind: server
status: staging
cluster: tappaas
location: The pile
Leave srv02.md–srv05.md without a cluster: field.
- Step 4: Regenerate all indices and rack artifacts
Run: make docs-index
Expected: gen_overview.py rewrites docs/hardware/index.md (now listing srv01–srv05 under Servers, no mf0x); gen_rack.py prints Wrote rack01.md + rack01-elevation.svg (9 item(s)). No gen_overview schema error (each stem now matches its hostname).
- Step 5: Confirm no
mf0xremains anywhere underdocs/
Run: grep -rn -E "mf0[0-4]" docs/ ; echo "exit=$?"
Expected: no matches, exit=1 (grep found nothing).
Run: ls docs/hardware/srv0*.md | wc -l
Expected: 5.
Run: grep -n "cluster: tappaas" docs/hardware/srv01.md
Expected: one match.
- Step 6: Run the full test suite
Run: make test
Expected: PASS (49 tests — the suite uses synthetic fixtures and is unaffected by the rename).
- Step 7: Build the site strictly
Run: mkdocs build --strict (if mkdocs is not on PATH, use python3 -m mkdocs build --strict)
Expected: build succeeds with no warnings-as-errors. The rack page and hardware index now show srv01–srv05.
- Step 8: Confirm the drift guard is satisfied
Run: make docs-check
Expected: exit 0 — committed artifacts match a fresh regeneration.
- Step 9: Commit
git add docs/hardware/ docs/infrastructure/racks/
git commit -m "refactor(hardware): rename mf00-mf04 to srv01-srv05, add cluster field"
Task 2: Sync prose references and record the scheme in CLAUDE.md
Files:
- Modify:
CLAUDE.md(stale hardware hint + new naming-scheme note) - Modify:
README.md(stale hardware hint)
Interfaces:
-
Consumes:
grep,make test,make docs-check(sanity). -
Step 1: Fix the stale hardware hint in
CLAUDE.md
In CLAUDE.md, change the repository-structure comment line:
hardware/ # auto-indexed per-host frontmatter (mf00..mf03, makerfloss.eu)
to:
hardware/ # auto-indexed per-host frontmatter (srv01..srv05, makerfloss.eu)
- Step 2: Add a naming-scheme note to the
CLAUDE.mdworking norms
In CLAUDE.md, immediately after the existing - **Filenames**: … bullet, add this new bullet:
- **Hardware identifiers**: `<kind-abbrev><NN>` — 2-digit, unique per kind (`srv`, `sw`, `pp`, `pdu`, `ups`, `shf`). Grouping (`cluster:`) lives in frontmatter, not the name. Full scheme: `notes/dev/specs/2026-06-24-hardware-naming-scheme.md`.
- Step 3: Fix the stale hardware hint in
README.md
In README.md, change the repository-layout comment line:
hardware/ # auto-indexed per-host frontmatter (mf00..mf03, makerfloss.eu)
to:
hardware/ # auto-indexed per-host frontmatter (srv01..srv05, makerfloss.eu)
- Step 4: Confirm no stale
mf0xhint remains in the two files
Run: grep -n -E "mf0[0-4]" CLAUDE.md README.md ; echo "exit=$?"
Expected: no matches, exit=1.
Run: grep -c "Hardware identifiers" CLAUDE.md
Expected: 1.
- Step 5: Sanity-check tests and drift still pass
Run: make test
Expected: PASS (49 tests).
Run: make docs-check
Expected: exit 0 (CLAUDE.md/README.md are not generated artifacts, so this only confirms nothing regressed).
- Step 6: Commit
git add CLAUDE.md README.md
git commit -m "docs: record hardware naming scheme, refresh stale mf0x hints"
Self-Review
Spec coverage (2026-06-24-hardware-naming-scheme.md):
- Format
<kind-abbrev><NN>,srvfor compute — Task 1 (rename tosrv01–srv05). ✔ - Stable identifier +
cluster:in frontmatter — Task 1 (rename + addcluster: tappaasto the one known node). ✔ srv01=tappaas; others provisional/omitted — Task 1 Step 3 + Global Constraints. ✔makerfloss.euFQDN exception untouched — Global Constraints (not in the rename set). ✔- No generator/grouping/validation work (deferred by spec) — Global Constraints (no
*.py/config changes). ✔ - Scheme discoverable to contributors — Task 2 (CLAUDE.md note + spec pointer). ✔
- Stale prose hints corrected — Task 2 (CLAUDE.md + README.md). ✔
Placeholder scan: No "TBD"/"handle edge cases"/"similar to Task N". Cluster values for srv02–srv05 are intentionally omitted (real-data dependency, explicitly bounded), not a placeholder.
Type consistency: No code interfaces in this migration. The name mapping table (Task 1) and the hostname: edits (Step 2) are internally consistent: mf00→srv01, mf01→srv02, mf02→srv03, mf03→srv04, mf04→srv05, with cluster: tappaas on srv01 only. Verification greps reference the same srv0x names produced by the edits.