283 lines
12 KiB
Markdown
283 lines
12 KiB
Markdown
# Linear Static 3D Euler Beam Harness Phase Construction Plan
|
||
|
||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||
|
||
**Goal:** Create the approved 29-step Harness phase that drives the FESA V0 single-step B33 linear-static solver from upstream contracts through release readiness.
|
||
|
||
**Architecture:** The phase is a sequence of seven document gates, eighteen TDD implementation steps, and four final verification gates. Each `stepN.md` is self-contained, names its role/skill and owned paths, preserves the approved design as the source of truth, and delegates per-step commits and timestamps to `scripts/execute.py`.
|
||
|
||
**Tech Stack:** Markdown and JSON phase descriptors; C++17; MSVC x64 Debug; CMake/CTest; GoogleTest from `C:/git/googletest`; Intel oneMKL/oneTBB; HDF5; Python 3 Harness runner.
|
||
|
||
## Global Constraints
|
||
|
||
- The approved source of truth is `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md`; phase steps must not silently broaden or reinterpret it.
|
||
- The solver scope is one `*STEP, *STATIC` using Abaqus `TYPE=B33`; `TYPE=B31`, multiple steps, instance transforms, nested assemblies, and `*DLOAD` input remain unsupported.
|
||
- Runtime order keeps `Kff` factorization before load-vector assembly and separates factorization from substitution.
|
||
- Production C++ changes use `RED -> GREEN -> VERIFY`; every production file has a related GoogleTest file.
|
||
- Validation uses MSVC x64 Debug and the exact dependency cache variables in the approved design; production CMake must not hardcode the local GoogleTest path.
|
||
- `reference/cantilever beam/` is read-only and must not be renamed, rewritten, regenerated, or repaired by the phase.
|
||
- Beam stress is written and tested, but Abaqus stress reference comparison is explicitly N/A.
|
||
- Harness owns per-step commits and timestamps; a step must update only its phase status and must not invoke `git commit`.
|
||
- Before `python scripts/execute.py linear-static-3d-euler-beam`, use a clean worktree or a separate worktree because the current executor stages with `git add -A`.
|
||
|
||
---
|
||
|
||
### Task 1: Create Phase Indexes
|
||
|
||
**Files:**
|
||
- Create: `phases/index.json`
|
||
- Create: `phases/linear-static-3d-euler-beam/index.json`
|
||
|
||
**Interfaces:**
|
||
- Consumes: approved phase name and 29-step table from the design specification.
|
||
- Produces: top-level pending phase registration and contiguous step numbers `0..28` with kebab-case names.
|
||
|
||
- [ ] **Step 1: Register the phase**
|
||
|
||
```json
|
||
{
|
||
"phases": [
|
||
{ "dir": "linear-static-3d-euler-beam", "status": "pending" }
|
||
]
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 2: Create the task index**
|
||
|
||
Use `project: "FESA Structural Solver"`, `phase: "linear-static-3d-euler-beam"`, and the exact step names from specification section 3. Do not add timestamps; the executor owns them.
|
||
|
||
- [ ] **Step 3: Validate both JSON files**
|
||
|
||
```powershell
|
||
Get-Content -Raw phases/index.json | ConvertFrom-Json | Out-Null
|
||
$phase = Get-Content -Raw phases/linear-static-3d-euler-beam/index.json | ConvertFrom-Json
|
||
if ($phase.steps.Count -ne 29) { throw 'Expected 29 steps' }
|
||
if (($phase.steps.step -join ',') -ne ((0..28) -join ',')) { throw 'Step numbers are not contiguous' }
|
||
```
|
||
|
||
- [ ] **Step 4: Executor commit checkpoint**
|
||
|
||
Do not run `git commit`; `scripts/execute.py` commits phase execution results. The phase-construction changes remain for the user to review and commit.
|
||
|
||
### Task 2: Create Upstream Contract Gate Steps
|
||
|
||
**Files:**
|
||
- Create: `phases/linear-static-3d-euler-beam/step0.md` through `step6.md`
|
||
|
||
**Interfaces:**
|
||
- Consumes: approved design, formulation, root project documents, gate-specific README files, and exact FESA skill contracts.
|
||
- Produces: requirements, research, formulation alignment, numerical review, I/O, reference-model, and implementation-plan documents.
|
||
|
||
- [ ] **Step 1: Define role and skill ownership**
|
||
|
||
```text
|
||
0 requirement-agent / fesa-requirements-baseline
|
||
1 research-agent / fesa-research-evidence + fem-theory-query
|
||
2 formulation-agent / fesa-formulation-spec
|
||
3 numerical-review-agent / fesa-numerical-review
|
||
4 io-definition-agent / fesa-io-contract
|
||
5 reference-model-agent / fesa-reference-models
|
||
6 implementation-planning-agent / fesa-cpp-msvc-tdd
|
||
```
|
||
|
||
- [ ] **Step 2: Make each document gate self-contained**
|
||
|
||
Each step names required input paths, the exact output path, mandatory sections/status, immutable decisions, executable PowerShell checks, status-update rules, and prohibited changes. Step 2 aligns the existing formulation without changing its approved mathematical meaning; Step 5 documents the approved legacy bundle exception without modifying `reference/`.
|
||
|
||
- [ ] **Step 3: Verify gate file structure**
|
||
|
||
```powershell
|
||
0..6 | ForEach-Object {
|
||
$path = "phases/linear-static-3d-euler-beam/step$_.md"
|
||
if (-not (Test-Path $path)) { throw "Missing $path" }
|
||
foreach ($section in @('## 읽어야 할 파일','## 작업','## Acceptance Criteria','## 검증 절차','## 금지사항')) {
|
||
if (-not (Select-String -LiteralPath $path -SimpleMatch $section -Quiet)) {
|
||
throw "$path missing $section"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 4: Executor commit checkpoint**
|
||
|
||
Do not commit manually; the executor will commit each completed gate.
|
||
|
||
### Task 3: Create C++ TDD Implementation Steps
|
||
|
||
**Files:**
|
||
- Create: `phases/linear-static-3d-euler-beam/step7.md` through `step24.md`
|
||
|
||
**Interfaces:**
|
||
- Consumes: approved upstream documents produced by Steps 0–6.
|
||
- Produces: build foundation, core/model/parser/FEM/math/solver/result modules, tests, and `fesa.exe`.
|
||
|
||
- [ ] **Step 1: Lock module order and interfaces**
|
||
|
||
```cpp
|
||
Matrix EulerBeam3D::localStiffness() const;
|
||
Matrix EulerBeam3D::globalStiffness() const;
|
||
Vector EulerBeam3D::localEquivalentLoad(const ConstantLocalLineLoad&) const;
|
||
BeamRecovery EulerBeam3D::recover(const Vector& globalElementDisplacement) const;
|
||
|
||
class LinearSolver {
|
||
public:
|
||
virtual ~LinearSolver() = default;
|
||
virtual Status factorize(const SparseMatrix& matrix) = 0;
|
||
virtual Status solve(const Vector& rhs, Vector& solution) const = 0;
|
||
};
|
||
```
|
||
|
||
The remaining steps define signatures for diagnostics, semantic mapping, active views, DOF numbering, state, deterministic parallel assembly, constraints, load assembly, result recovery, HDF5 writing, and orchestration without exposing MKL/TBB/HDF5 types across adapter boundaries.
|
||
|
||
- [ ] **Step 2: Encode test-first execution in every production step**
|
||
|
||
Each Step 8–24 contains these independently verifiable actions:
|
||
|
||
```text
|
||
1. Add the named GoogleTest cases before production edits.
|
||
2. Build and run the targeted CTest regex; record the expected missing-behavior RED failure.
|
||
3. Add only the production behavior owned by the step.
|
||
4. Rebuild and run the targeted test to GREEN.
|
||
5. Run CTest discovery and the full CTest suite for VERIFY.
|
||
```
|
||
|
||
Step 7 creates the build/test foundation and proves at least one discovered test. Step 24 also provides the end-to-end CLI and test-only B33 reference comparison command used read-only by Step 26.
|
||
|
||
- [ ] **Step 3: Use the approved dependency configure command**
|
||
|
||
```powershell
|
||
cmake -S . -B .harness/build -A x64 `
|
||
-DFESA_GTEST_SOURCE_DIR=C:/git/googletest `
|
||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||
cmake --build .harness/build --config Debug
|
||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||
```
|
||
|
||
- [ ] **Step 4: Verify all implementation step descriptors**
|
||
|
||
```powershell
|
||
7..24 | ForEach-Object {
|
||
$path = "phases/linear-static-3d-euler-beam/step$_.md"
|
||
if (-not (Test-Path $path)) { throw "Missing $path" }
|
||
foreach ($text in @('MSVC x64 Debug','## Acceptance Criteria','## 금지사항')) {
|
||
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
|
||
throw "$path missing $text"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 5: Executor commit checkpoint**
|
||
|
||
Do not commit manually; the executor creates one feature commit and one metadata commit per completed step.
|
||
|
||
### Task 4: Create Final Verification Gate Steps
|
||
|
||
**Files:**
|
||
- Create: `phases/linear-static-3d-euler-beam/step25.md` through `step28.md`
|
||
|
||
**Interfaces:**
|
||
- Consumes: completed solver, generated HDF5 result, approved read-only reference CSVs, and all upstream reports.
|
||
- Produces: build/test, reference-verification, physics-evaluation, and release-readiness reports.
|
||
|
||
- [ ] **Step 1: Define strict gate transitions**
|
||
|
||
```text
|
||
25 pass-for-reference-verification
|
||
-> 26 pass-for-physics-evaluation
|
||
-> 27 pass-for-release-agent
|
||
-> 28 ready-for-release
|
||
```
|
||
|
||
Each later step must block or emit the appropriate `needs-*` status when its required predecessor is not passing. Step 26 applies the exact component-scale mixed tolerance, Step 27 checks physical equilibrium and signs, and Step 28 audits traceability and limitations without publishing anything.
|
||
|
||
- [ ] **Step 2: Enforce read-only boundaries**
|
||
|
||
Steps 26–28 must not edit source, tests, CMake, upstream contracts, reference artifacts, or tolerance policy. Step 26 must state stress comparison is N/A while requiring the stress output schema/test evidence.
|
||
|
||
- [ ] **Step 3: Verify the final gate descriptors**
|
||
|
||
```powershell
|
||
25..28 | ForEach-Object {
|
||
$path = "phases/linear-static-3d-euler-beam/step$_.md"
|
||
if (-not (Test-Path $path)) { throw "Missing $path" }
|
||
foreach ($text in @('## Acceptance Criteria','reference')) {
|
||
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
|
||
throw "$path missing $text"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 4: Executor commit checkpoint**
|
||
|
||
Do not commit manually; Harness owns execution commits and timestamps.
|
||
|
||
### Task 5: Validate the Generated Phase
|
||
|
||
**Files:**
|
||
- Read: `docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md`
|
||
- Read: `phases/index.json`
|
||
- Read: `phases/linear-static-3d-euler-beam/index.json`
|
||
- Read: `phases/linear-static-3d-euler-beam/step0.md` through `step28.md`
|
||
|
||
**Interfaces:**
|
||
- Consumes: all generated planning artifacts.
|
||
- Produces: structural and source-contract verification evidence; no solver execution.
|
||
|
||
- [ ] **Step 1: Parse and cross-check JSON**
|
||
|
||
```powershell
|
||
$top = Get-Content -Raw phases/index.json | ConvertFrom-Json
|
||
$task = Get-Content -Raw phases/linear-static-3d-euler-beam/index.json | ConvertFrom-Json
|
||
if (($top.phases | Where-Object dir -eq 'linear-static-3d-euler-beam').status -ne 'pending') { throw 'Top-level phase registration is invalid' }
|
||
if ($task.project -ne 'FESA Structural Solver') { throw 'Project name mismatch' }
|
||
if ($task.phase -ne 'linear-static-3d-euler-beam') { throw 'Phase name mismatch' }
|
||
if ($task.steps.Count -ne 29) { throw 'Step count mismatch' }
|
||
```
|
||
|
||
- [ ] **Step 2: Check step/file correspondence and required sections**
|
||
|
||
```powershell
|
||
$task.steps | ForEach-Object {
|
||
$path = "phases/linear-static-3d-euler-beam/step$($_.step).md"
|
||
if (-not (Test-Path $path)) { throw "Missing $path" }
|
||
if ($_.status -ne 'pending') { throw "Non-pending step $($_.step)" }
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 3: Scan for placeholders and whitespace errors**
|
||
|
||
```powershell
|
||
$markers = @(('T' + 'BD'), ('T' + 'ODO'), ('FIX' + 'ME'), ('PLACE' + 'HOLDER'),
|
||
('implement' + ' later'), ('Similar' + ' to Task'))
|
||
$unfinished = rg -n ($markers -join '|') `
|
||
docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md `
|
||
phases/linear-static-3d-euler-beam
|
||
if ($LASTEXITCODE -eq 0) { throw "Unfinished marker found:`n$unfinished" }
|
||
git diff --check
|
||
```
|
||
|
||
Expected: no placeholder matches and no whitespace errors. CRLF conversion warnings without whitespace error lines are acceptable.
|
||
|
||
- [ ] **Step 4: Confirm reference artifacts are untouched**
|
||
|
||
```powershell
|
||
git diff --name-only -- reference/
|
||
```
|
||
|
||
Expected: no output.
|
||
|
||
- [ ] **Step 5: Execution handoff**
|
||
|
||
After the phase-construction files and existing documentation edits are reviewed and committed, execute from a clean worktree:
|
||
|
||
```powershell
|
||
python scripts/execute.py linear-static-3d-euler-beam
|
||
```
|
||
|
||
Use `--push` only when remote publication is explicitly desired.
|