# Step 1: node-model-class ## Read First Read these files before editing: - `/AGENTS.md` - `/docs/AGENT_RULES.md` - `/docs/ARCHITECTURE.md` - `/docs/implementation-plans/analysis-model-objects-implementation-plan.md` - `/include/fesa/core/Node.hpp` - `/tests/core/node_test.cpp` ## Task Refine the existing `Node` model class contract without adding solver state. Allowed files: - Modify `/include/fesa/core/Node.hpp` - Modify `/src/core/Domain.cpp` only if constructor/accessor definitions move or change - Modify `/tests/core/node_test.cpp` Required behavior: - `Node` exposes `id()`, `coordinates()`, `x()`, `y()`, `z()`. - `Node` exposes `static constexpr std::size_t dofCount()` or equivalent compile-time DOF count of 6. - `Node` does not store equation ids, displacements, residuals, reactions, or constraints. ## Tests To Write First Extend `/tests/core/node_test.cpp` before production changes: - Verify `Node::dofCount() == 6`. - Verify coordinate order is preserved. - Verify the returned coordinate data is const from a const `Node`. Run the targeted build and confirm RED before implementation. ## Acceptance Criteria Run: ```powershell python scripts/validate_workspace.py ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain ``` Update `/phases/analysis-model-objects/index.json` step 1 with status and summary. ## Do Not - Do not add equation ids or solver state to `Node`.