# 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.