This commit is contained in:
김경종
2026-06-10 10:03:11 +09:00
parent 87529c811a
commit 0912ee6f3b
174 changed files with 414 additions and 8544 deletions
-72
View File
@@ -1,72 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "analysis-model-objects",
"steps": [
{
"step": 0,
"name": "model-object-contract",
"status": "completed",
"summary": "Created analysis model object implementation plan with base-class contracts, exclusions, and TDD traceability."
},
{
"step": 1,
"name": "node-model-class",
"status": "completed",
"summary": "Added Node DOF count contract and tests while keeping Node free of solver state."
},
{
"step": 2,
"name": "element-base-interface",
"status": "completed",
"summary": "Added identity-only Element base interface and model-object CTest target."
},
{
"step": 3,
"name": "mitc4-element-model",
"status": "completed",
"summary": "Added MITC4 element model skeleton with four-node connectivity and 24-DOF count tests."
},
{
"step": 4,
"name": "material-base-interface",
"status": "completed",
"summary": "Added Material base and LinearElasticMaterial model object with ownership tests."
},
{
"step": 5,
"name": "property-section-model",
"status": "completed",
"summary": "Added ShellProperty model object with positive-thickness validation tests."
},
{
"step": 6,
"name": "load-base-interface",
"status": "completed",
"summary": "Added Load base and NodalLoad model object with polymorphic access tests."
},
{
"step": 7,
"name": "boundary-base-interface",
"status": "completed",
"summary": "Added BoundaryCondition base and SinglePointConstraint model object with polymorphic access tests."
},
{
"step": 8,
"name": "domain-polymorphic-ownership",
"status": "completed",
"summary": "Extended Domain with unique_ptr ownership APIs for element, material, load, and boundary model objects while preserving existing definition APIs."
},
{
"step": 9,
"name": "legacy-definition-compatibility",
"status": "completed",
"summary": "Documented compatibility between core definition DTOs and new runtime model object ownership APIs."
},
{
"step": 10,
"name": "validation-report-handoff",
"status": "completed",
"summary": "Recorded build/test evidence, updated project progress, and marked the phase completed."
}
]
}
-54
View File
@@ -1,54 +0,0 @@
# Step 0: model-object-contract
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/PRD.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
## Task
Create `/docs/implementation-plans/analysis-model-objects-implementation-plan.md`.
The document must define the model object layer that will be stored by `Domain`:
- `Node` model object.
- abstract `Element` base and MITC4 model object skeleton.
- abstract `Material` base and linear elastic material model object.
- shell property/section model object.
- abstract `Load` base and nodal load model object.
- abstract `BoundaryCondition` base and single-point constraint model object.
- `Domain` RAII ownership of polymorphic model objects through `std::unique_ptr`.
State explicitly that this phase does not implement MITC4 stiffness, material constitutive matrices, global force assembly, boundary-condition matrix application, equation numbering, solver vectors, HDF5 output, reference comparison, or reference-solver execution.
Document how existing `*Definition` value objects remain compatible as input DTOs until parser/factory work replaces or maps them.
## Tests To Write First
This is a documentation planning step. Do not write C++ production code in this step.
## Acceptance Criteria
Run:
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
```
Update `/phases/analysis-model-objects/index.json` step 0 with `completed`, `error`, or `blocked`.
## Do Not
- Do not change C++ code in this step.
- Do not change MITC4 formulation, I/O contracts, reference artifacts, or tolerance policy.
-53
View File
@@ -1,53 +0,0 @@
# 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`.
-54
View File
@@ -1,54 +0,0 @@
# Step 10: validation-report-handoff
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/build-test-reports/README.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/phases/analysis-model-objects/index.json`
## Task
Run final verification and write handoff evidence.
Allowed files:
- Create `/docs/build-test-reports/analysis-model-objects-build-test.md`
- Modify `/docs/PROGRESS.md`
- Modify `/docs/WORKNOTE.md` only if new traps or failed approaches occurred
- Modify `/phases/analysis-model-objects/index.json`
- Modify `/phases/index.json`
The build/test report must include command log summary, exit codes, configure/build/CTest status, failure classification or `N/A`, and no-change assertions for reference artifacts and tolerance policy.
## Tests To Write First
This is a validation/reporting step. Do not write new C++ production behavior.
## Acceptance Criteria
Run:
```powershell
git status --short --branch
git remote -v
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "domain|model-object"
git diff --check
```
Update:
- `/phases/analysis-model-objects/index.json` step 10 with `completed`, `error`, or `blocked`.
- `/phases/index.json` phase status to `completed` only if all steps are completed.
- `/docs/PROGRESS.md` with validation evidence.
## Do Not
- Do not claim MITC4 numerical implementation, reference comparison success, or release readiness.
- Do not run Abaqus, Nastran, or any reference solver.
-58
View File
@@ -1,58 +0,0 @@
# Step 2: element-base-interface
## 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/ElementDefinition.hpp`
- `/CMakeLists.txt`
## Task
Add the abstract element model interface.
Allowed files:
- Create `/include/fesa/element/Element.hpp`
- Create `/tests/element/element_base_test.cpp`
- Modify `/tests/core/domain_bootstrap_test.cpp` only if the current test executable remains the single test runner
- Modify `/CMakeLists.txt`
Required interface:
- virtual destructor.
- `ElementId id() const noexcept`.
- `ElementType type() const noexcept`.
- `std::size_t nodeCount() const noexcept`.
- `std::span` is not allowed because this project targets C++17.
- Use const reference return for connectivity data.
- no stiffness, residual, stress, state, or equation API in this phase.
## Tests To Write First
Write `/tests/element/element_base_test.cpp` before production changes. Use a small test subclass to prove:
- base pointer dispatch works.
- id/type/connectivity/property id are readable through base API.
- deleting through `std::unique_ptr<Element>` is valid.
Run targeted build and confirm RED because `Element.hpp` is missing.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 2 status.
## Do Not
- Do not implement MITC4 stiffness or numerical element behavior.
-57
View File
@@ -1,57 +0,0 @@
# Step 3: mitc4-element-model
## 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/element/Element.hpp`
- `/include/fesa/core/ElementDefinition.hpp`
## Task
Add a MITC4 element model object skeleton.
Allowed files:
- Create `/include/fesa/element/Mitc4Element.hpp`
- Create `/src/element/Mitc4Element.cpp`
- Create `/tests/element/mitc4_element_model_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- `Mitc4Element` derives from `Element`.
- Stores element id, four node ids, and property id.
- Reports `ElementType::Mitc4`.
- Reports `nodeCount() == 4`.
- Reports `dofCount() == 24`.
- Preserves connectivity order.
## Tests To Write First
Write `/tests/element/mitc4_element_model_test.cpp` before production changes:
- Construct `Mitc4Element`.
- Access it through `const Element&`.
- Verify id, type, node count, DOF count, connectivity, and property id.
Run targeted build and confirm RED because `Mitc4Element.hpp` is missing.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 3 status.
## Do Not
- Do not implement element stiffness, Jacobians, MITC shear interpolation, resultants, stress, or integration-point state.
-55
View File
@@ -1,55 +0,0 @@
# Step 4: material-base-interface
## 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/MaterialDefinition.hpp`
## Task
Add material model base and linear elastic material model object.
Allowed files:
- Create `/include/fesa/material/Material.hpp`
- Create `/include/fesa/material/LinearElasticMaterial.hpp`
- Create `/src/material/LinearElasticMaterial.cpp`
- Create `/tests/material/material_base_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- `Material` has virtual destructor and `MaterialId id() const noexcept`.
- `LinearElasticMaterial` derives from `Material`.
- Stores Young's modulus and Poisson ratio.
- No constitutive matrix or stress update in this phase.
## Tests To Write First
Write `/tests/material/material_base_test.cpp` before production changes:
- Access `LinearElasticMaterial` through `const Material&`.
- Verify id, E, and nu.
- Verify deletion through `std::unique_ptr<Material>`.
Run targeted build and confirm RED.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 4 status.
## Do Not
- Do not implement constitutive matrices, stress updates, or tangent stiffness.
-53
View File
@@ -1,53 +0,0 @@
# Step 5: property-section-model
## 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/PropertyDefinition.hpp`
## Task
Add shell property/section model object.
Allowed files:
- Create `/include/fesa/property/ShellProperty.hpp`
- Create `/src/property/ShellProperty.cpp`
- Create `/tests/property/shell_property_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- Stores property id, material id, and thickness.
- Exposes const accessors.
- Rejects non-positive thickness with `std::invalid_argument`.
- Does not compute shell section stiffness.
## Tests To Write First
Write `/tests/property/shell_property_test.cpp` before production changes:
- Valid property stores id/material/thickness.
- Zero or negative thickness throws.
Run targeted build and confirm RED.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 5 status.
## Do Not
- Do not implement membrane, bending, or shear constitutive stiffness.
-55
View File
@@ -1,55 +0,0 @@
# Step 6: load-base-interface
## 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/LoadDefinition.hpp`
## Task
Add load model base and nodal load object.
Allowed files:
- Create `/include/fesa/load/Load.hpp`
- Create `/include/fesa/load/NodalLoad.hpp`
- Create `/src/load/NodalLoad.cpp`
- Create `/tests/load/load_base_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- `Load` has virtual destructor and a load kind enum.
- `NodalLoad` derives from `Load`.
- Stores node id, DOF, and value.
- No global vector assembly in this phase.
## Tests To Write First
Write `/tests/load/load_base_test.cpp` before production changes:
- Access `NodalLoad` through `const Load&`.
- Verify kind, node id, DOF, value.
- Verify deletion through `std::unique_ptr<Load>`.
Run targeted build and confirm RED.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 6 status.
## Do Not
- Do not assemble forces or apply time/load factors.
-55
View File
@@ -1,55 +0,0 @@
# Step 7: boundary-base-interface
## 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/BoundaryCondition.hpp`
## Task
Add boundary condition model base and single-point constraint object.
Allowed files:
- Create `/include/fesa/boundary/BoundaryCondition.hpp`
- Create `/include/fesa/boundary/SinglePointConstraint.hpp`
- Create `/src/boundary/SinglePointConstraint.cpp`
- Create `/tests/boundary/boundary_base_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- `BoundaryCondition` has virtual destructor and a boundary kind enum.
- `SinglePointConstraint` derives from `BoundaryCondition`.
- Stores node id, DOF, prescribed value.
- No matrix elimination or reaction recovery in this phase.
## Tests To Write First
Write `/tests/boundary/boundary_base_test.cpp` before production changes:
- Access `SinglePointConstraint` through `const BoundaryCondition&`.
- Verify kind, node id, DOF, value.
- Verify deletion through `std::unique_ptr<BoundaryCondition>`.
Run targeted build and confirm RED.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
```
Update step 7 status.
## Do Not
- Do not apply constraints to matrices or compute reactions.
-62
View File
@@ -1,62 +0,0 @@
# Step 8: domain-polymorphic-ownership
## 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/Domain.hpp`
- all model object headers created by previous steps
## Task
Extend `Domain` with RAII ownership APIs for polymorphic model objects while preserving existing definition-storage tests.
Allowed files:
- Modify `/include/fesa/core/Domain.hpp`
- Modify `/src/core/Domain.cpp`
- Create `/tests/core/domain_model_object_test.cpp`
- Modify `/tests/core/domain_bootstrap_test.cpp`
- Modify `/CMakeLists.txt`
Required behavior:
- `Domain::addElementObject(std::unique_ptr<Element>)`
- `Domain::findElementObject(ElementId)` and `Domain::elementObject(ElementId)`
- equivalent add/find/direct APIs for `Material`, `Load`, and model `BoundaryCondition`.
- duplicate ids or duplicate load/boundary keys throw `std::invalid_argument`.
- missing direct lookup throws `std::out_of_range`.
- retrieval returns const base references or const base pointers.
- existing `Definition` APIs remain available.
## Tests To Write First
Write `/tests/core/domain_model_object_test.cpp` before production changes:
- Domain owns `Mitc4Element`, `LinearElasticMaterial`, `NodalLoad`, and `SinglePointConstraint` through `std::unique_ptr`.
- Find/direct lookup through base APIs works.
- Duplicate ids throw for element/material.
- Missing direct lookup throws.
Run targeted build and confirm RED.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
```
Update step 8 status.
## Do Not
- Do not remove existing definition APIs in this step.
- Do not add solver state to Domain.
-49
View File
@@ -1,49 +0,0 @@
# Step 9: legacy-definition-compatibility
## 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/Domain.hpp`
- `/tests/core/domain_storage_test.cpp`
- `/tests/core/domain_model_object_test.cpp`
## Task
Preserve and document compatibility between existing `*Definition` value objects and new model-object base classes.
Allowed files:
- Modify `/docs/implementation-plans/analysis-model-objects-implementation-plan.md`
- Modify tests only if compatibility gaps are found
- Modify production code only for narrow compatibility fixes
Required behavior:
- Existing Domain definition-storage tests still pass.
- New model-object ownership tests still pass.
- The implementation plan clearly states that `*Definition` objects remain parser/factory DTOs until the parser phase decides whether to map or replace them.
## Tests To Write First
If production code must change, write or extend a failing C++ test before the change. If this is documentation-only, do not add production code.
## Acceptance Criteria
Run:
```powershell
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "domain|model-object"
```
Update step 9 status.
## Do Not
- Do not delete existing `*Definition` headers or tests.
- Do not rewrite parser or factory behavior.
@@ -1,42 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "analysis-state-analysis-base",
"steps": [
{
"step": 0,
"name": "analysis-contract-plan",
"status": "completed",
"summary": "Created the analysis state and analysis base implementation plan with scope, contracts, TDD tasks, and exclusions."
},
{
"step": 1,
"name": "analysis-state-core",
"status": "completed",
"summary": "Added AnalysisState with zero-sized and sized vector storage for displacement, forces, residual, and reaction."
},
{
"step": 2,
"name": "analysis-state-guards",
"status": "completed",
"summary": "Added AnalysisState setters, size guards, resize reset, clearForces, and time/increment/iteration counters."
},
{
"step": 3,
"name": "analysis-base-interface",
"status": "completed",
"summary": "Added the Analysis base interface with const Domain input, mutable AnalysisState, name contract, virtual deletion, and run delegation."
},
{
"step": 4,
"name": "cmake-analysis-tests",
"status": "completed",
"summary": "Registered fesa_analysis_tests and confirmed analysis, domain, model-object, and io CTest targets pass together."
},
{
"step": 5,
"name": "validation-report-handoff",
"status": "completed",
"summary": "Recorded build/test evidence, updated project progress, and marked the phase completed."
}
]
}
@@ -1,62 +0,0 @@
# Step 0: analysis-contract-plan
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/PRD.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/analysis-model-objects-implementation-plan.md`
- `/docs/implementation-plans/property-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/ModelTypes.hpp`
- `/include/fesa/core/StepDefinition.hpp`
- `/CMakeLists.txt`
## Task
Create `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`.
The document must define the implementation contract for:
- `fesa::core::AnalysisState` as mutable analysis state storage.
- `fesa::analysis::Analysis` as the base analysis strategy interface.
- A dedicated CTest path for analysis-layer tests.
State explicitly that this phase does not implement:
- `AnalysisModel`
- `DofManager`
- MITC4 stiffness, stress, resultants, or force recovery
- global assembly
- constrained DOF elimination
- MKL/PARDISO solve
- HDF5 result writing beyond existing skeletons
- reference comparison
- Abaqus/Nastran/reference-solver execution
## Tests To Write First
This is a documentation planning step. Do not write C++ production code in this step.
## Acceptance Criteria
Run:
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
```
Update `/phases/analysis-state-analysis-base/index.json` step 0 with `completed`, `error`, or `blocked`.
## Do Not
- Do not change C++ code in this step.
- Do not change requirements, formulations, I/O contracts, reference artifacts, or tolerance policy.
@@ -1,69 +0,0 @@
# Step 1: analysis-state-core
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`
- `/include/fesa/core/ModelTypes.hpp`
- `/include/fesa/core/Domain.hpp`
- `/CMakeLists.txt`
## Task
Add `fesa::core::AnalysisState`.
Candidate files:
- Create `/include/fesa/core/AnalysisState.hpp`
- Create `/src/core/AnalysisState.cpp`
- Create `/tests/core/analysis_state_test.cpp`
- Modify `/CMakeLists.txt`
Required initial contract:
- `AnalysisState()` starts with zero DOFs and empty vectors.
- `explicit AnalysisState(std::size_t dof_count)` allocates zero-filled vectors.
- `dofCount()` returns the current vector size.
- `displacement()`, `externalForce()`, `internalForce()`, `residual()`, and `reaction()` return const vector references.
- All state vectors have the same size as `dofCount()`.
- State is mutable analysis data only. Do not store node ids, element ids, equation ids, sparse data, solver handles, writer handles, or references to `Domain`.
## Tests To Write First
Write tests in `/tests/core/analysis_state_test.cpp` before creating production code:
- default state has zero DOFs and all vectors empty.
- sized state creates zero-filled displacement, external force, internal force, residual, and reaction vectors.
- `dofCount()` matches vector sizes.
Run the targeted test and confirm it fails because `AnalysisState` does not exist:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
```
Then implement the minimum code needed to pass.
## Acceptance Criteria
Run:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
python scripts/validate_workspace.py
```
Update `/phases/analysis-state-analysis-base/index.json` step 1 with `completed`, `error`, or `blocked`.
## Do Not
- Do not implement `AnalysisModel`, `DofManager`, assembly, solver, or result output.
- Do not add mutable solver state to `Domain`, `Node`, `Element`, `Material`, `Property`, `Load`, or `BoundaryCondition`.
@@ -1,65 +0,0 @@
# Step 2: analysis-state-guards
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`
- `/include/fesa/core/AnalysisState.hpp`
- `/src/core/AnalysisState.cpp`
- `/tests/core/analysis_state_test.cpp`
- `/CMakeLists.txt`
## Task
Extend `AnalysisState` with mutation and guard behavior.
Required contract:
- `resize(std::size_t dof_count)` resets every vector to the new size and fills with zero.
- `setDisplacement(std::vector<double>)`, `setExternalForce(std::vector<double>)`, `setInternalForce(std::vector<double>)`, `setResidual(std::vector<double>)`, and `setReaction(std::vector<double>)` replace one vector.
- setter inputs must match `dofCount()`.
- size mismatch throws `std::invalid_argument`.
- a failed setter must not mutate the existing vector.
- `clearForces()` zeros external force, internal force, residual, and reaction while leaving displacement unchanged.
- `currentTime()`, `incrementIndex()`, and `iterationIndex()` accessors exist with setters.
## Tests To Write First
Add tests in `/tests/core/analysis_state_test.cpp` before production changes:
- setters replace vectors when sizes match.
- mismatched setter input throws and preserves old values.
- resize resets all vectors to zero.
- clearForces preserves displacement and zeros force-like vectors.
- time, increment, and iteration counters can be updated.
Run the targeted test and confirm it fails before implementation:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
```
Then implement the minimum code needed to pass.
## Acceptance Criteria
Run:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
python scripts/validate_workspace.py
```
Update `/phases/analysis-state-analysis-base/index.json` step 2 with `completed`, `error`, or `blocked`.
## Do Not
- Do not add dynamics-only velocity or acceleration vectors in this phase.
- Do not add thermal temperature fields in this phase.
- Do not add equation numbering or DOF mapping responsibilities.
@@ -1,69 +0,0 @@
# Step 3: analysis-base-interface
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/AnalysisState.hpp`
- `/CMakeLists.txt`
## Task
Add `fesa::analysis::Analysis` as a minimal base interface for future analysis strategies.
Candidate files:
- Create `/include/fesa/analysis/Analysis.hpp`
- Create `/tests/analysis/analysis_base_test.cpp`
- Modify `/CMakeLists.txt`
Required contract:
- `Analysis` has a virtual destructor.
- `Analysis` exposes `const char* name() const noexcept`.
- `Analysis` exposes `void run(const fesa::core::Domain& domain, fesa::core::AnalysisState& state)`.
- `run` delegates to a protected pure virtual `doRun(const fesa::core::Domain&, fesa::core::AnalysisState&)`.
- `Domain` is passed as const; `AnalysisState` is mutable.
- The base class must not own `Domain`, `AnalysisState`, solver objects, result writers, or reference artifacts.
## Tests To Write First
Write tests in `/tests/analysis/analysis_base_test.cpp` before production changes:
- a derived recording analysis can be used through `Analysis&`.
- `run` forwards the const `Domain` and mutable `AnalysisState` to the derived implementation.
- derived implementation can update `AnalysisState` without mutating `Domain`.
- `Analysis` can be deleted through a base pointer.
Run the targeted test and confirm it fails before implementation:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
```
Then implement the minimum code needed to pass.
## Acceptance Criteria
Run:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R analysis
python scripts/validate_workspace.py
```
Update `/phases/analysis-state-analysis-base/index.json` step 3 with `completed`, `error`, or `blocked`.
## Do Not
- Do not implement `LinearStaticAnalysis`.
- Do not add template-method hook lists for assembly, solve, boundary conditions, or output until `AnalysisModel` and `DofManager` exist.
@@ -1,46 +0,0 @@
# Step 4: cmake-analysis-tests
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`
- `/CMakeLists.txt`
- `/tests/core/analysis_state_test.cpp`
- `/tests/analysis/analysis_base_test.cpp`
## Task
Make the analysis tests part of the normal MSVC CMake/CTest path.
Required contract:
- `fesa_core` includes `src/core/AnalysisState.cpp`.
- `fesa_analysis_tests` builds both analysis-state and analysis-base tests.
- CTest registers `analysis.base` or equivalent with labels `analysis;core`.
- Existing `domain`, `model-object`, and `io` tests remain registered and unchanged except for required shared library source additions.
## Tests To Write First
No new behavior tests are required in this step if steps 1 through 3 already wrote them. If CMake registration is missing, the RED condition is that `ctest -R analysis` finds no registered analysis test or build fails because sources are missing.
## Acceptance Criteria
Run:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "analysis|domain|model-object|io"
python scripts/validate_workspace.py
```
Update `/phases/analysis-state-analysis-base/index.json` step 4 with `completed`, `error`, or `blocked`.
## Do Not
- Do not modify unrelated tests.
- Do not change dependency discovery or introduce MKL, TBB, or HDF5 linkage for this phase.
@@ -1,48 +0,0 @@
# Step 5: validation-report-handoff
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/analysis-state-analysis-base-implementation-plan.md`
- `/docs/build-test-reports/README.md`
- `/phases/analysis-state-analysis-base/index.json`
## Task
Run final validation, record evidence, and update handoff files.
Required output:
- Create `/docs/build-test-reports/analysis-state-analysis-base-build-test.md`.
- Update `/docs/PROGRESS.md` with completed work and validation evidence.
- Update `/phases/analysis-state-analysis-base/index.json` step 5.
- Update `/phases/index.json` phase status to `completed` only if validation passes.
## Tests To Write First
No new tests are required in this reporting step.
## Acceptance Criteria
Run:
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "analysis|domain|model-object|io"
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
git diff --check
```
Record command outcomes in `/docs/build-test-reports/analysis-state-analysis-base-build-test.md`.
## Do Not
- Do not claim numerical correctness.
- Do not claim release readiness.
- Do not run Abaqus, Nastran, or any reference solver.
-60
View File
@@ -1,60 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "domain-model-foundation",
"steps": [
{
"step": 0,
"name": "domain-contract",
"status": "completed",
"summary": "Created the Domain model foundation implementation plan with ownership boundaries, TDD tasks, and validation commands."
},
{
"step": 1,
"name": "cmake-test-bootstrap",
"status": "completed",
"summary": "Added root CMake/CTest bootstrap for fesa_domain_tests and fixed validation CMake path resolution on Windows."
},
{
"step": 2,
"name": "core-id-types",
"status": "completed",
"summary": "Added ModelTypes.hpp with 64-bit ids and fixed six-DOF ordering covered by C++ tests."
},
{
"step": 3,
"name": "node-and-domain-storage",
"status": "completed",
"summary": "Implemented Node and Domain node storage with duplicate and missing lookup tests."
},
{
"step": 4,
"name": "element-definition-storage",
"status": "completed",
"summary": "Added MITC4 element definition storage with connectivity preservation and missing-node validation tests."
},
{
"step": 5,
"name": "model-attribute-storage",
"status": "completed",
"summary": "Added material, shell property, node set, and element set storage with duplicate and missing-reference tests."
},
{
"step": 6,
"name": "boundary-load-step-storage",
"status": "completed",
"summary": "Added boundary condition, nodal load, and linear static step storage with missing-reference tests."
},
{
"step": 7,
"name": "domain-invariants",
"status": "completed",
"summary": "Locked down const retrieval and failed-insert count stability with invariant tests."
},
{
"step": 8,
"name": "validation-report-handoff",
"status": "completed",
"summary": "Recorded build/test evidence, updated handoff docs, and marked the phase completed."
}
]
}
-77
View File
@@ -1,77 +0,0 @@
# Step 0: domain-contract
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/PRD.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/README.md`
## Task
Create `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`.
The document must define the first C++ implementation slice for the `Domain` model container. It must explicitly state:
- `Domain` owns parsed model definitions only.
- Included model definitions: nodes, elements, materials, shell properties, node sets, element sets, boundary conditions, nodal loads, and analysis step definitions.
- Excluded state: equation ids, sparse matrix state, displacement vectors, residuals, reactions, current time, iteration counters, and element integration point state.
- `DofManager` owns equation numbering.
- `AnalysisModel` owns step-local execution views.
- `AnalysisState` owns mutable solution and iteration state.
- All ids use signed 64-bit storage.
- Node DOF order is `U1, U2, U3, UR1, UR2, UR3`.
- Units are user-consistent and not enforced by `Domain`.
- No Abaqus, Nastran, reference solver, HDF5 result, MKL, or TBB behavior is implemented in this phase.
Use the implementation-plan README template. Set:
- `feature_id: domain-model-foundation`
- `status: ready-for-implementation`
- `owner_agent: implementation-planning-agent`
- `date: 2026-06-08`
Include a work breakdown and TDD test plan for the following downstream steps:
1. CMake/CTest bootstrap.
2. Core id and DOF types.
3. Node and node storage.
4. Element definition storage.
5. Material, property, and set storage.
6. Boundary condition, nodal load, and step storage.
7. Domain invariant tests.
8. Validation report and handoff.
## Tests To Write First
This is a documentation planning step. Do not write C++ production code in this step.
## Acceptance Criteria
Run:
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
```
The current repository may still take the no-CMake informational path until Step 1 creates CMake files.
Update `/phases/domain-model-foundation/index.json` step 0:
- On success: `"status": "completed"` and a one-line `"summary"`.
- On repeated failure: `"status": "error"` and a concrete `"error_message"`.
- On user decision needed: `"status": "blocked"` and a concrete `"blocked_reason"`.
## Do Not
- Do not create C++ headers, sources, tests, or CMake files in this step.
- Do not change requirements, formulation, I/O contracts, reference artifacts, or tolerance policy.
- Do not run Abaqus, Nastran, or any reference solver.
-70
View File
@@ -1,70 +0,0 @@
# Step 1: cmake-test-bootstrap
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/phases/domain-model-foundation/index.json`
- `/phases/domain-model-foundation/step0.md`
## Task
Create the minimum C++17/MSVC/CMake/CTest project structure needed to run Domain tests.
Allowed files:
- Create `/CMakeLists.txt`
- Create `/include/fesa/core/.gitkeep` only if needed to preserve the directory before headers exist
- Create `/src/core/.gitkeep` only if needed to preserve the directory before sources exist
- Create `/tests/core/domain_bootstrap_test.cpp`
CMake requirements:
- `cmake_minimum_required(VERSION 3.20)`
- Project name: `FESA`
- Language: CXX
- Set C++ standard to 17 and require it.
- Create interface or library target `fesa_core`.
- Add include directory `/include`.
- Enable testing.
- Create test executable `fesa_domain_tests`.
- Register CTest name `domain.bootstrap`.
- Apply CTest labels `domain;core`.
## Tests To Write First
Write `/tests/core/domain_bootstrap_test.cpp` before adding any production C++ code. It should be a minimal self-contained executable with `main()` returning 0 only when the C++ test harness is running.
Example intended behavior:
```cpp
int main() {
return 0;
}
```
This step does not implement Domain behavior yet. The purpose is to prove the MSVC/CTest path exists.
## Acceptance Criteria
Run:
```powershell
cmake -S . -B build/msvc-debug -G "Visual Studio 17 2022" -A x64
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain.bootstrap
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 1 with `completed`, `error`, or `blocked`.
## Do Not
- Do not add Domain, Node, Element, solver, parser, MKL, TBB, or HDF5 implementation in this step.
- Do not add JavaScript, TypeScript, npm, or non-MSVC fallback tooling.
-76
View File
@@ -1,76 +0,0 @@
# Step 2: core-id-types
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/CMakeLists.txt`
- `/tests/core/domain_bootstrap_test.cpp`
## Task
Introduce core id aliases and DOF ordering constants.
Allowed files:
- Create `/include/fesa/core/ModelTypes.hpp`
- Modify `/tests/core/domain_bootstrap_test.cpp` or create `/tests/core/model_types_test.cpp`
- Modify `/CMakeLists.txt` only to register the new test file if a separate test executable is created
Required API:
```cpp
namespace fesa::core {
using Id = std::int64_t;
using NodeId = Id;
using ElementId = Id;
using MaterialId = Id;
using PropertyId = Id;
using StepId = Id;
enum class Dof : std::uint8_t {
U1 = 0,
U2 = 1,
U3 = 2,
UR1 = 3,
UR2 = 4,
UR3 = 5
};
constexpr std::size_t kDofPerNode = 6;
}
```
## Tests To Write First
Write a failing C++ test that includes `fesa/core/ModelTypes.hpp` before creating the header.
The test must verify:
- `sizeof(fesa::core::Id) == 8`
- `kDofPerNode == 6`
- `Dof::U1` through `Dof::UR3` have ordinal values 0 through 5
Run the targeted CTest and verify it fails because the header is missing. Then implement the header.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 2 with `completed`, `error`, or `blocked`.
## Do Not
- Do not add model storage in this step.
- Do not add equation numbering or solver state.
-63
View File
@@ -1,63 +0,0 @@
# Step 3: node-and-domain-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/ModelTypes.hpp`
- `/CMakeLists.txt`
## Task
Implement the first useful `Node` and `Domain` slice.
Allowed files:
- Create `/include/fesa/core/Node.hpp`
- Create `/include/fesa/core/Domain.hpp`
- Create `/src/core/Domain.cpp`
- Create or modify `/tests/core/domain_storage_test.cpp`
- Modify `/CMakeLists.txt` to compile the source and register the test
Required behavior:
- `Node` stores `NodeId` and three coordinates as `double`.
- `Domain::addNode(Node)` inserts a node.
- Duplicate node ids throw `std::invalid_argument`.
- `Domain::findNode(NodeId)` returns a pointer or `nullptr`.
- `Domain::node(NodeId)` returns a const reference or throws `std::out_of_range`.
- `Domain::nodeCount()` returns the stored node count.
- `Domain` must not expose mutable node references.
## Tests To Write First
Write failing tests before creating production headers/sources:
- Add and retrieve one node by id.
- Missing node returns `nullptr` from `findNode`.
- Missing node throws from `node`.
- Duplicate node id throws.
Run the targeted CTest and verify failure due to missing API. Then implement the minimal code.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 3 with `completed`, `error`, or `blocked`.
## Do Not
- Do not add elements, materials, properties, sets, loads, or steps yet.
- Do not store equation ids, displacement vectors, residuals, reactions, or solver state.
-65
View File
@@ -1,65 +0,0 @@
# Step 4: element-definition-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/Node.hpp`
- `/include/fesa/core/ModelTypes.hpp`
- `/tests/core/domain_storage_test.cpp`
## Task
Add element definition storage without implementing element stiffness or MITC4 formulation.
Allowed files:
- Create `/include/fesa/core/ElementDefinition.hpp`
- Modify `/include/fesa/core/Domain.hpp`
- Modify `/src/core/Domain.cpp`
- Modify `/tests/core/domain_storage_test.cpp`
Required behavior:
- `ElementDefinition` stores `ElementId`, type enum/string for `MITC4`, four `NodeId` connectivity entries, and a `PropertyId`.
- `Domain::addElement(ElementDefinition)` inserts an element.
- Duplicate element ids throw `std::invalid_argument`.
- Element connectivity must contain exactly four node ids for the MITC4 definition.
- Adding an element with a missing node id throws `std::invalid_argument`.
- `Domain::findElement(ElementId)` returns pointer or `nullptr`.
- `Domain::element(ElementId)` returns const reference or throws `std::out_of_range`.
- `Domain::elementCount()` returns the stored element count.
## Tests To Write First
Write failing tests before production changes:
- Add an element with four existing nodes and retrieve connectivity in order.
- Duplicate element id throws.
- Element referencing a missing node throws.
- Missing element lookup follows the `findElement` and `element` contracts.
Run targeted CTest and verify RED before implementation.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 4 with `completed`, `error`, or `blocked`.
## Do Not
- Do not implement element stiffness, Jacobians, shape functions, sparse assembly, or solver behavior.
- Do not add parser behavior.
-66
View File
@@ -1,66 +0,0 @@
# Step 5: model-attribute-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/ElementDefinition.hpp`
- `/tests/core/domain_storage_test.cpp`
## Task
Add minimal material, shell property, node set, and element set storage.
Allowed files:
- Create `/include/fesa/core/MaterialDefinition.hpp`
- Create `/include/fesa/core/PropertyDefinition.hpp`
- Modify `/include/fesa/core/Domain.hpp`
- Modify `/src/core/Domain.cpp`
- Modify `/tests/core/domain_storage_test.cpp`
Required behavior:
- `LinearElasticMaterialDefinition` stores material id, Young's modulus, and Poisson's ratio.
- `ShellPropertyDefinition` stores property id, material id, and thickness.
- `Domain` stores node sets and element sets by string name.
- Duplicate material ids, property ids, or set names throw `std::invalid_argument`.
- Adding a shell property with missing material id throws `std::invalid_argument`.
- Node sets can only reference existing nodes.
- Element sets can only reference existing elements.
- All retrieval APIs return const data.
## Tests To Write First
Write failing tests before production changes:
- Add material and shell property, then retrieve them.
- Duplicate material/property id throws.
- Shell property referencing missing material throws.
- Node set stores existing node ids in input order.
- Element set stores existing element ids in input order.
- Sets referencing missing ids throw.
Run targeted CTest and verify RED before implementation.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 5 with `completed`, `error`, or `blocked`.
## Do Not
- Do not implement constitutive matrices, shell section stiffness, units conversion, or parser behavior.
-66
View File
@@ -1,66 +0,0 @@
# Step 6: boundary-load-step-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/ModelTypes.hpp`
- `/tests/core/domain_storage_test.cpp`
## Task
Add boundary condition, nodal load, and analysis step definition storage.
Allowed files:
- Create `/include/fesa/core/BoundaryCondition.hpp`
- Create `/include/fesa/core/LoadDefinition.hpp`
- Create `/include/fesa/core/StepDefinition.hpp`
- Modify `/include/fesa/core/Domain.hpp`
- Modify `/src/core/Domain.cpp`
- Modify `/tests/core/domain_storage_test.cpp`
Required behavior:
- A boundary condition stores node id, constrained `Dof`, and prescribed value.
- A nodal load stores node id, `Dof`, and value.
- A linear static step definition stores step id, name, boundary condition indices or ids, and load indices or ids.
- Adding BC/load for a missing node throws `std::invalid_argument`.
- Duplicate step ids throw `std::invalid_argument`.
- Stored BCs, loads, and steps are returned as const data.
## Tests To Write First
Write failing tests before production changes:
- Add and retrieve a boundary condition on an existing node.
- Add and retrieve a nodal load on an existing node.
- Missing-node BC/load throws.
- Add a linear static step referencing stored BC/load entries.
- Duplicate step id throws.
Run targeted CTest and verify RED before implementation.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 6 with `completed`, `error`, or `blocked`.
## Do Not
- Do not apply boundary conditions to matrices.
- Do not compute reactions.
- Do not add solver state, displacements, equation ids, or sparse matrix behavior.
-61
View File
@@ -1,61 +0,0 @@
# Step 7: domain-invariants
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/ADR.md`
- `/docs/ARCHITECTURE.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/src/core/Domain.cpp`
- `/tests/core/domain_storage_test.cpp`
## Task
Add tests and small API cleanup to lock down `Domain` invariants.
Allowed files:
- Modify `/include/fesa/core/Domain.hpp`
- Modify `/src/core/Domain.cpp`
- Modify `/tests/core/domain_storage_test.cpp`
- Modify `/docs/implementation-plans/domain-model-foundation-implementation-plan.md` only if a test traceability table needs correction
Required invariants:
- `Domain` does not expose mutable references to stored objects.
- `Domain` has no equation id, displacement, residual, reaction, current time, iteration, sparse matrix, MKL, TBB, or HDF5 members.
- Retrieval does not create missing objects implicitly.
- Insert operations preserve input ids and ordering where the API promises ordering.
- Error types remain deterministic: duplicate ids use `std::invalid_argument`; missing required references use `std::invalid_argument`; direct missing lookup uses `std::out_of_range`.
## Tests To Write First
Write failing compile/runtime tests before API cleanup:
- A const `Domain` can retrieve model definitions.
- Missing direct lookup throws without changing counts.
- Failed insert due to missing reference does not change the relevant count.
- Existing node, element, material, property, set, BC, load, and step counts remain stable after failed inserts.
Run targeted CTest and verify RED before implementation.
## Acceptance Criteria
Run:
```powershell
cmake --build build/msvc-debug --config Debug
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
Update `/phases/domain-model-foundation/index.json` step 7 with `completed`, `error`, or `blocked`.
## Do Not
- Do not add new solver features beyond invariant enforcement.
- Do not refactor unrelated files.
-63
View File
@@ -1,63 +0,0 @@
# Step 8: validation-report-handoff
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/build-test-reports/README.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/phases/domain-model-foundation/index.json`
- All Domain files created by previous steps
## Task
Run final verification and write the handoff evidence.
Allowed files:
- Create `/docs/build-test-reports/domain-model-foundation-build-test.md`
- Modify `/docs/PROGRESS.md`
- Modify `/docs/WORKNOTE.md` only if a failed approach, environment issue, or trap was encountered
- Modify `/phases/domain-model-foundation/index.json`
- Modify `/phases/index.json`
The build/test report must include:
- command log summary with exit codes
- command discovery path
- configure/build/CTest status
- failure classification or `N/A`
- failed test inventory or `N/A`
- no-change assertion for reference artifacts and tolerance policies
## Tests To Write First
This is a validation/reporting step. Do not write new C++ production behavior.
## Acceptance Criteria
Run:
```powershell
git status --short --branch
git remote -v
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
git diff --check
```
Update:
- `/phases/domain-model-foundation/index.json` step 8 with `completed`, `error`, or `blocked`.
- `/phases/index.json` phase status to `completed` only if all steps are completed.
- `/docs/PROGRESS.md` with the executed validation evidence.
## Do Not
- Do not claim MITC4 implementation, numerical correctness, reference comparison success, or release readiness.
- Do not run Abaqus, Nastran, or any reference solver.
- Do not edit reference artifacts.
-42
View File
@@ -1,42 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "domain-runtime-storage",
"steps": [
{
"step": 0,
"name": "runtime-storage-contract",
"status": "completed",
"summary": "Created the Domain runtime storage implementation plan and recorded the parser-record-to-factory-to-runtime-Domain contract."
},
{
"step": 1,
"name": "element-material-property-runtime-storage",
"status": "completed",
"summary": "Migrated Domain element, material, and shell property storage to runtime objects and moved ElementType to ModelTypes."
},
{
"step": 2,
"name": "load-boundary-runtime-storage",
"status": "completed",
"summary": "Migrated Domain load and boundary storage to runtime polymorphic objects with node-reference and duplicate-key validation."
},
{
"step": 3,
"name": "step-and-set-runtime-references",
"status": "completed",
"summary": "Updated element set and linear static step validation to reference runtime element, load, and boundary containers."
},
{
"step": 4,
"name": "legacy-definition-extraction",
"status": "completed",
"summary": "Removed core definition DTOs from Domain public API and persistent storage while keeping focused definition tests for parser/factory records."
},
{
"step": 5,
"name": "validation-report-handoff",
"status": "completed",
"summary": "Validated with script self-tests, targeted CTest, workspace validation, and git diff whitespace checks."
}
]
}
-50
View File
@@ -1,50 +0,0 @@
# Step 0: runtime-storage-contract
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/implementation-plans/domain-model-foundation-implementation-plan.md`
- `/docs/implementation-plans/analysis-model-objects-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/src/core/Domain.cpp`
## Task
Create `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`.
The plan must state that `Domain` owns runtime model objects as its canonical storage:
- nodes remain value objects under `fesa::core::Node`;
- elements are stored as `fesa::element::Element` objects;
- materials are stored as `fesa::material::Material` objects;
- shell properties are stored as `fesa::property::ShellProperty` runtime objects;
- loads are stored as `fesa::load::Load` objects;
- boundary conditions are stored as `fesa::boundary::BoundaryCondition` objects;
- steps may remain `LinearStaticStepDefinition` until an analysis-step object is introduced, but step indices must reference runtime load and boundary containers;
- `core::*Definition` classes may remain as parser/factory-local records, but `Domain` must not persist them.
The plan must also list the migration order and identify the C++ tests that will be rewritten or added.
## Tests To Write First
- Documentation-only step. No C++ test is required in this step.
## Acceptance Criteria
```powershell
python -m unittest discover -s scripts -p "test_*.py"
```
## Verification Notes
1. Confirm the plan does not introduce parser implementation work.
2. Confirm the plan does not change MITC4 formulation, reference artifacts, or tolerance policy.
3. Update `phases/domain-runtime-storage/index.json` for this step result.
-64
View File
@@ -1,64 +0,0 @@
# Step 1: element-material-property-runtime-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/ModelTypes.hpp`
- `/include/fesa/core/ElementDefinition.hpp`
- `/include/fesa/element/Element.hpp`
- `/include/fesa/element/Mitc4Element.hpp`
- `/include/fesa/material/Material.hpp`
- `/include/fesa/material/LinearElasticMaterial.hpp`
- `/include/fesa/property/ShellProperty.hpp`
- `/src/core/Domain.cpp`
- `/tests/core/domain_storage_test.cpp`
- `/tests/core/domain_model_object_test.cpp`
## Task
Make runtime element, material, and shell property objects the canonical Domain storage.
Required API shape:
- `void Domain::addElement(std::unique_ptr<fesa::element::Element> element)`
- `const fesa::element::Element* Domain::findElement(ElementId id) const noexcept`
- `const fesa::element::Element& Domain::element(ElementId id) const`
- `std::size_t Domain::elementCount() const noexcept`
- `void Domain::addMaterial(std::unique_ptr<fesa::material::Material> material)`
- `const fesa::material::Material* Domain::findMaterial(MaterialId id) const noexcept`
- `const fesa::material::Material& Domain::material(MaterialId id) const`
- `std::size_t Domain::materialCount() const noexcept`
- `void Domain::addShellProperty(fesa::property::ShellProperty property)`
- `const fesa::property::ShellProperty* Domain::findShellProperty(PropertyId id) const noexcept`
- `const fesa::property::ShellProperty& Domain::shellProperty(PropertyId id) const`
- `std::size_t Domain::shellPropertyCount() const noexcept`
Rules:
- Move `ElementType` to `/include/fesa/core/ModelTypes.hpp` so runtime `Element` no longer includes `/include/fesa/core/ElementDefinition.hpp`.
- `Domain::addShellProperty` must reject duplicate property ids and missing material ids.
- `Domain::addElement` must reject null pointers, duplicate element ids, missing node ids, and missing shell property ids.
- Keep C++17/MSVC compatibility and RAII ownership.
## Tests To Write First
- Rewrite or extend `/tests/core/domain_storage_test.cpp` so element, material, and shell property storage uses runtime objects instead of `ElementDefinition`, `LinearElasticMaterialDefinition`, and `ShellPropertyDefinition`.
- Add or adjust a test that proves `Element` no longer depends on `ElementDefinition` for `ElementType`.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "domain|model-object"
python scripts/validate_workspace.py
```
## Verification Notes
1. Run the targeted CTest before and after implementation to capture RED then GREEN.
2. Do not delete definition classes in this step; only remove them from Domain storage.
3. Update `phases/domain-runtime-storage/index.json` for this step result.
-59
View File
@@ -1,59 +0,0 @@
# Step 2: load-boundary-runtime-storage
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/load/Load.hpp`
- `/include/fesa/load/NodalLoad.hpp`
- `/include/fesa/boundary/BoundaryCondition.hpp`
- `/include/fesa/boundary/SinglePointConstraint.hpp`
- `/src/core/Domain.cpp`
- `/tests/core/domain_storage_test.cpp`
- `/tests/core/domain_model_object_test.cpp`
## Task
Make runtime load and boundary objects the canonical Domain storage.
Required API shape:
- `std::size_t Domain::addLoad(std::unique_ptr<fesa::load::Load> load)`
- `const fesa::load::Load* Domain::findLoad(std::size_t index) const noexcept`
- `const fesa::load::Load& Domain::load(std::size_t index) const`
- `std::size_t Domain::loadCount() const noexcept`
- `std::size_t Domain::addBoundaryCondition(std::unique_ptr<fesa::boundary::BoundaryCondition> boundary)`
- `const fesa::boundary::BoundaryCondition* Domain::findBoundaryCondition(std::size_t index) const noexcept`
- `const fesa::boundary::BoundaryCondition& Domain::boundaryCondition(std::size_t index) const`
- `std::size_t Domain::boundaryConditionCount() const noexcept`
Rules:
- Reject null load and boundary pointers.
- `NodalLoad` must reference an existing node.
- `SinglePointConstraint` must reference an existing node.
- Duplicate `(node, dof)` nodal loads must throw.
- Duplicate `(node, dof)` single-point constraints must throw.
- Runtime load and boundary storage must not use `core::NodalLoadDefinition` or `core::BoundaryCondition`.
## Tests To Write First
- Rewrite or extend `/tests/core/domain_storage_test.cpp` so load and boundary storage uses runtime objects.
- Add missing-node tests for `NodalLoad` and `SinglePointConstraint` runtime insertion.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "domain|model-object"
python scripts/validate_workspace.py
```
## Verification Notes
1. Run targeted CTest before production edits and confirm failure.
2. Keep solver state out of `Domain`.
3. Update `phases/domain-runtime-storage/index.json` for this step result.
-42
View File
@@ -1,42 +0,0 @@
# Step 3: step-and-set-runtime-references
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/include/fesa/core/StepDefinition.hpp`
- `/src/core/Domain.cpp`
- `/tests/core/domain_storage_test.cpp`
## Task
Make Domain set and step validation reference runtime storage.
Rules:
- `Domain::addElementSet` must validate ids against runtime elements stored by `Domain::findElement`.
- `Domain::addStep(LinearStaticStepDefinition)` may remain for now, but its boundary and load indices must validate against runtime boundary and load containers.
- Failed insertions must not mutate Domain counts.
- No equation ids, solver vectors, residuals, reactions, current time, or iteration state may be added to Domain.
## Tests To Write First
- Rewrite `/tests/core/domain_storage_test.cpp` set and step tests so they build elements, loads, and boundary conditions through runtime object APIs.
- Preserve count-stability tests for failed insertions.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R domain
python scripts/validate_workspace.py
```
## Verification Notes
1. Run targeted CTest before production edits and confirm failure.
2. Keep `LinearStaticStepDefinition` as the only remaining step record until a separate step-model phase exists.
3. Update `phases/domain-runtime-storage/index.json` for this step result.
-47
View File
@@ -1,47 +0,0 @@
# Step 4: legacy-definition-extraction
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/src/core/Domain.cpp`
- `/tests/core/domain_storage_test.cpp`
- `/CMakeLists.txt`
## Task
Remove parser-definition DTO persistence from `Domain`.
Rules:
- `Domain` must no longer include or store:
- `fesa/core/BoundaryCondition.hpp`
- `fesa/core/ElementDefinition.hpp`
- `fesa/core/LoadDefinition.hpp`
- `fesa/core/MaterialDefinition.hpp`
- `fesa/core/PropertyDefinition.hpp`
- `Domain` may still include `StepDefinition.hpp` until a runtime step object is designed.
- Definition classes may remain in the repository and their focused tests may remain, but they must not be part of Domain storage or Domain public API.
- Do not implement parser or factory behavior in this step.
## Tests To Write First
- Add or update a compile-time assertion in `/tests/core/domain_storage_test.cpp` or a dedicated domain API test proving Domain retrieval returns runtime types for elements, materials, properties, loads, and boundary conditions.
## Acceptance Criteria
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
git diff --check
```
## Verification Notes
1. Confirm no `Domain` method returns a definition DTO except `LinearStaticStepDefinition`.
2. Confirm `include/fesa/element/Element.hpp` no longer includes `ElementDefinition.hpp`.
3. Update `phases/domain-runtime-storage/index.json` for this step result.
-42
View File
@@ -1,42 +0,0 @@
# Step 5: validation-report-handoff
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/phases/domain-runtime-storage/index.json`
## Task
Record validation evidence and handoff notes after the runtime Domain storage migration.
Required updates:
- Update `/docs/PROGRESS.md` with completed runtime Domain storage work and validation commands.
- Update `/docs/PLAN.md` only if this migration changes sequencing or acceptance criteria.
- Update `/docs/WORKNOTE.md` only if there were failures, repeated mistakes, or environment traps.
- Mark `/phases/domain-runtime-storage/index.json` steps and `/phases/index.json` phase status according to actual results.
## Tests To Write First
- Documentation/reporting step. No new C++ test is required.
## Acceptance Criteria
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
git diff --check
```
## Verification Notes
1. Do not claim numerical solver correctness.
2. Do not mark the phase completed unless all previous steps are complete and validation passed.
3. Keep validation evidence concrete: command, result, and scope.
-24
View File
@@ -1,24 +0,0 @@
{
"phases": [
{
"dir": "domain-model-foundation",
"status": "completed"
},
{
"dir": "analysis-model-objects",
"status": "completed"
},
{
"dir": "domain-runtime-storage",
"status": "completed"
},
{
"dir": "property-model-foundation",
"status": "completed"
},
{
"dir": "analysis-state-analysis-base",
"status": "completed"
}
]
}
@@ -1,36 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "property-model-foundation",
"steps": [
{
"step": 0,
"name": "property-base-contract",
"status": "completed",
"summary": "Created the property model foundation implementation plan with runtime Property ownership rules and HDF5 skeleton limits."
},
{
"step": 1,
"name": "property-base-interface",
"status": "completed",
"summary": "Added PropertyKind and abstract Property base with polymorphic ownership tests."
},
{
"step": 2,
"name": "shell-property-polymorphism",
"status": "completed",
"summary": "Made ShellProperty derive from Property while preserving material id and positive-thickness validation."
},
{
"step": 3,
"name": "domain-property-ownership",
"status": "completed",
"summary": "Migrated Domain property storage to std::unique_ptr<Property> with shell-property compatibility accessors and cross-reference validation."
},
{
"step": 4,
"name": "validation-report-handoff",
"status": "completed",
"summary": "Validated targeted CTest, workspace validation, script self-tests, and whitespace checks; updated project progress."
}
]
}
-54
View File
@@ -1,54 +0,0 @@
# Step 0: property-base-contract
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/implementation-plans/domain-runtime-storage-implementation-plan.md`
- `/include/fesa/property/ShellProperty.hpp`
- `/include/fesa/core/Domain.hpp`
- `/src/core/Domain.cpp`
## Task
Create `/docs/implementation-plans/property-model-foundation-implementation-plan.md`.
The plan must define the runtime property model contract:
- `Property` is the base class for element properties and sections.
- `PropertyKind` identifies concrete property families; phase 1 supports only `Shell`.
- `ShellProperty` derives from `Property`.
- `Domain` owns property objects through RAII.
- `Domain` validates duplicate property ids and missing material ids.
- `Element::propertyId()` remains an id reference; elements do not own property objects.
Keep out of scope:
- shell section stiffness;
- material constitutive matrices;
- shear correction;
- element formulation;
- assembly, solver, HDF5 output, and reference comparison.
## Tests To Write First
- Documentation-only step. No C++ test is required in this step.
## Acceptance Criteria
```powershell
python -m unittest discover -s scripts -p "test_*.py"
```
## Verification Notes
1. Confirm the plan does not change MITC4 formulation or tolerance policy.
2. Confirm the plan keeps solver state out of `Domain`.
3. Update `phases/property-model-foundation/index.json` for this step result.
-52
View File
@@ -1,52 +0,0 @@
# Step 1: property-base-interface
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/property-model-foundation-implementation-plan.md`
- `/include/fesa/core/ModelTypes.hpp`
- `/include/fesa/property/ShellProperty.hpp`
- `/tests/property/shell_property_test.cpp`
- `/CMakeLists.txt`
## Task
Add the runtime property base interface.
Required API:
- File: `/include/fesa/property/Property.hpp`
- Namespace: `fesa::property`
- `enum class PropertyKind { Shell };`
- `class Property`
- virtual destructor;
- `virtual PropertyId id() const noexcept = 0;`
- `virtual PropertyKind kind() const noexcept = 0;`
Rules:
- Use `fesa::core::PropertyId`.
- Do not add section stiffness or material behavior.
- Keep this header independent from HDF5, MKL, TBB, and parser headers.
## Tests To Write First
- Add `/tests/property/property_base_test.cpp`.
- Test that a small derived class can be used through `const Property&`.
- Test virtual deletion through `std::unique_ptr<Property>`.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
python scripts/validate_workspace.py
```
## Verification Notes
1. Run targeted CTest before implementation and confirm the expected compile failure.
2. Keep all code C++17/MSVC-compatible.
3. Update `phases/property-model-foundation/index.json` for this step result.
-49
View File
@@ -1,49 +0,0 @@
# Step 2: shell-property-polymorphism
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/property-model-foundation-implementation-plan.md`
- `/include/fesa/property/Property.hpp`
- `/include/fesa/property/ShellProperty.hpp`
- `/src/property/ShellProperty.cpp`
- `/tests/property/shell_property_test.cpp`
## Task
Make `ShellProperty` derive from `Property`.
Required behavior:
- `ShellProperty::id()` overrides `Property::id()`.
- `ShellProperty::kind()` returns `PropertyKind::Shell`.
- `ShellProperty` keeps `materialId()` and `thickness()` accessors.
- Constructor still rejects `thickness <= 0.0`.
Rules:
- Do not rename `ShellProperty` in this phase.
- Do not add shell section stiffness.
- Do not add material lookup inside `ShellProperty`; Domain validates cross references.
## Tests To Write First
- Extend `/tests/property/shell_property_test.cpp`.
- Test `const Property& base = shell_property` exposes id and kind.
- Preserve positive-thickness validation tests.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R model-object
python scripts/validate_workspace.py
```
## Verification Notes
1. Run targeted CTest before production edits and confirm failure.
2. Keep `ShellProperty` free of solver state.
3. Update `phases/property-model-foundation/index.json` for this step result.
-60
View File
@@ -1,60 +0,0 @@
# Step 3: domain-property-ownership
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/property-model-foundation-implementation-plan.md`
- `/include/fesa/core/Domain.hpp`
- `/src/core/Domain.cpp`
- `/include/fesa/property/Property.hpp`
- `/include/fesa/property/ShellProperty.hpp`
- `/tests/core/domain_storage_test.cpp`
- `/tests/core/domain_model_object_test.cpp`
## Task
Make `Domain` own runtime property objects through the `Property` base class.
Required API shape:
- `void Domain::addProperty(std::unique_ptr<fesa::property::Property> property);`
- `const fesa::property::Property* Domain::findProperty(PropertyId id) const noexcept;`
- `const fesa::property::Property& Domain::property(PropertyId id) const;`
- `std::size_t Domain::propertyCount() const noexcept;`
Compatibility helpers may remain if useful:
- `addShellProperty(std::unique_ptr<fesa::property::ShellProperty>)`
- `findShellProperty(PropertyId)`
- `shellProperty(PropertyId)`
- `shellPropertyCount()`
Rules:
- Property storage must be `std::unique_ptr<Property>`.
- Reject null property pointers.
- Reject duplicate property ids.
- For `ShellProperty`, reject missing material id.
- `Domain::addElement` must validate `Element::propertyId()` using runtime property storage.
## Tests To Write First
- Rewrite relevant property assertions in `/tests/core/domain_storage_test.cpp` to use runtime property ownership.
- Add a test that `const Domain::property(id)` returns `const Property&`.
- Preserve direct `ShellProperty` lookup for now if compatibility helpers remain.
## Acceptance Criteria
```powershell
ctest --test-dir build/msvc-debug --output-on-failure -C Debug -R "domain|model-object"
python scripts/validate_workspace.py
```
## Verification Notes
1. Run targeted CTest before production edits and confirm failure.
2. Do not add solver vectors, equation ids, or integration-point state to `Domain`.
3. Update `phases/property-model-foundation/index.json` for this step result.
-42
View File
@@ -1,42 +0,0 @@
# Step 4: validation-report-handoff
## Read First
Read these files before editing:
- `/AGENTS.md`
- `/docs/PLAN.md`
- `/docs/PROGRESS.md`
- `/docs/WORKNOTE.md`
- `/docs/AGENT_RULES.md`
- `/docs/implementation-plans/property-model-foundation-implementation-plan.md`
- `/phases/property-model-foundation/index.json`
## Task
Record validation evidence and handoff notes after the property model foundation implementation.
Required updates:
- Update `/docs/PROGRESS.md` with completed property base and Domain property ownership work.
- Update `/docs/PLAN.md` only if sequencing or acceptance criteria changed.
- Update `/docs/WORKNOTE.md` only if there were failures, repeated mistakes, or environment traps.
- Mark `/phases/property-model-foundation/index.json` steps and `/phases/index.json` according to actual results.
## Tests To Write First
- Documentation/reporting step. No new C++ test is required.
## Acceptance Criteria
```powershell
python -m unittest discover -s scripts -p "test_*.py"
python scripts/validate_workspace.py
git diff --check
```
## Verification Notes
1. Do not claim MITC4 formulation correctness.
2. Do not claim HDF5 result output is implemented.
3. Keep validation evidence concrete: command, result, and scope.