revert
This commit is contained in:
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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`.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user