Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions docs/vv_templates/commit_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# V&V Commit Message Template

This is the standard commit message format for landing a completed V&V cycle on a SIMPLNX filter. It is used by the engineer at Phase 13 (status flip DRAFT → READY FOR REVIEW / COMPLETE), and is the commit that opens the PR.

## Format

```
VV: <Filter Human Name> fully V&V'ed

Summary:
- Found and fixed <N> bug(s) (<one-line per bug, or "Confirmed no bugs">);
- documented <M> deviation(s) from DREAM3D 6.5.171 (<D1 …, D2 …>);
- retired <P> tests (<reason: circular oracle / UNIMPLEMENTED stub / etc., or "none">);
- unit tests replaced with <Q> inlined *<Class X (Name) + Class Y (Name)>* test fixtures;
- added 3 V&V source-tree deliverables (report, deviations, provenance);
- <optional: doc/pipeline-name fixes, when applicable>.
```

## Title rules

- Must start with `VV:` (matches existing precedent — e.g., commit `99f3a9865` for `Compute Feature Reference Misorientations`).
- Use the filter's `humanName()` from the `.cpp` (with spaces, not the class name).
- End with `fully V&V'ed`. If the cycle is partial (rare — e.g., second-engineer oracle review still pending), end with `— READY FOR REVIEW` instead.

## Body rules

- One bullet per category, even when the count is zero. **Don't drop bullets** — write "Confirmed no bugs" or "no tests retired" so the reader knows the question was asked.
- Past-tense verbs at the start of each bullet ("Found and fixed", "documented", "retired", "replaced", "added", "fixed").
- Semicolons at the end of each bullet except the last (period on the last).
- Inline the deviation IDs (`D1`, `D2`, …) with a 2-3 word reminder of what each one was. The full text lives in `vv/deviations/<FilterName>.md`; the commit message just needs to be greppable.
- Oracle classes get the parenthetical name (`Class 1 (Analytical)`, `Class 4 (Invariant)`). See `oracle_classes.md` for the canonical class list.
- The "3 V&V source-tree deliverables" line is invariant across all V&V commits (every cycle produces exactly those 3). Don't rewrite it per-filter.

## Worked example

This is what the F#2 (`ComputeFeatureNeighborMisorientations`) V&V cycle's commit looks like:

```
VV: Compute Feature Neighbor Misorientations fully V&V'ed

Summary:
- Found and fixed 1 bug (divisor clobbered inside inner j-loop of algorithm.cpp);
- documented 2 deviations from DREAM3D 6.5.171 (D1 divisor bug, D2 EbsdLib 2.4.1 precision);
- retired 2 tests (circular-oracle exemplar consumer + UNIMPLEMENTED stub);
- unit tests replaced with 4 inlined *Class 1 (Analytical) + Class 4 (Invariant)* test fixtures;
- added 3 V&V source-tree deliverables (report, deviations, provenance);
- fixed pipeline-name typo in user-facing doc.
```

## When a category is zero or N/A

| Situation | Bullet phrasing |
|----------------------------------------------------|-----------------------------------------------------------------------|
| Clean Port, no bugs found | `Confirmed no bugs (clean Port);` |
| No deviations from legacy | `Confirmed no deviations from DREAM3D 6.5.171;` |
| Fresh V&V, no prior tests to retire | `No prior tests retired (fresh V&V cycle);` |
| Existing tests kept, only new ones added | `Augmented existing tests with <Q> inlined …;` |
| Doc was already correct | *omit the last bullet entirely (it's the only optional one)* |
| New filter, no legacy equivalent | `documented 0 deviations (no legacy equivalent — new filter);` |

## Why this format

- **Scannable.** A reviewer skimming `git log` should be able to decide whether a V&V commit is worth opening from the title and one bullet pass.
- **Greppable.** `git log --grep='^VV:'` returns every V&V commit. `git log --grep='D2 EbsdLib'` returns every commit that mentions the EbsdLib precision deviation. The deviation IDs are stable across commits (per the `<FilterName>-D<N>` rule in `deviation_template.md`).
- **Constrained.** The five fixed categories (bugs / deviations / retired tests / new fixtures / V&V deliverables) match what every V&V cycle produces under the v2 policy. The engineer fills slots rather than designing prose.
- **Cross-references the source-tree deliverables.** The commit is the "shortest legible record" of the V&V; the long-form analysis lives at `src/Plugins/<Plugin>/vv/{,deviations/,provenance/}<FilterName>.md`. A reader who wants more clicks through.
3 changes: 2 additions & 1 deletion docs/vv_templates/vv_policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ The verified state is pinned by **(commit hash, archive SHA512)**. The commit ca
| [`report_gates.md`](./report_gates.md) | Per-section "Done when:" checklists — reference while filling in the report |
| [`deviation_template.md`](./deviation_template.md) | Empty deviation file — copy into `src/Plugins/<P>/vv/deviations/<FilterName>.md` |
| [`provenance_template.md`](./provenance_template.md) | Empty exemplar-provenance sidecar — copy per exemplar archive |
| [`commit_template.md`](./commit_template.md) | Standard commit message format for landing a completed V&V cycle — use at step 6 of the engineer workflow below |

## Engineer workflow

Expand All @@ -64,7 +65,7 @@ The verified state is pinned by **(commit hash, archive SHA512)**. The commit ca
3. Run `python scripts/vv_init.py <FilterName>` to scaffold the report and deviation files in the plugin tree.
4. Open `report_gates.md` in a second tab.
5. Work each section in any order. A section is "done" when all its gates pass.
6. When all gates green, set `Status: READY FOR REVIEW`, push a `vv/<FilterName>` branch.
6. When all gates green, set `Status: READY FOR REVIEW`, push a `vv/<FilterName>` branch with a commit following [`commit_template.md`](./commit_template.md).
7. After sign-off, set `Status: COMPLETE`. Verified commit hash is filled in at SBIR deliverable assembly.

## Status tracking across filters
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ The user can also calculate the average misorientation between the feature and a

## Example Pipelines

+ (05) SmallIN100 Crystallographic Statistics
+ (04) Small IN100 Crystallographic Statistics

## License & Copyright

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,17 @@ This **Filter** determines the Kernel Average Misorientation (KAM) for each **Ce
1. Calculate the misorientation angle between each **Cell** in a kernel and the central **Cell** of the kernel
2. Average all of the misorientations for the kernel and store at the central **Cell**

The calculation will **not** consider cells that belong to different 'feature Ids', ie.e, different grains.
The calculation will **not** consider cells that belong to different 'feature Ids', i.e., different grains.

*Note:* All **Cells** in the kernel are weighted equally during the averaging, though they are not equidistant from the central **Cell**.

% Auto generated parameter table will be inserted here

## Example Pipelines

+ MassifPipeline
+ (05) SmallIN100 Crystallographic Statistics
+ (04) Small IN100 Crystallographic Statistics
+ EBSD_File_Processing/aptr12_Analysis
+ EBSD_File_Processing/avtr12_Analysis

## License & Copyright

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,18 @@ Result<> ComputeFeatureNeighborMisorientations::operator()()
const NeighborList<int32_t>::VectorType featureNeighborList = inNeighborList.at(static_cast<int32_t>(i));

tempMisorientationLists[i].assign(featureNeighborList.size(), -1.0);
// Initialize the divisor once per outer-loop iteration (per feature). Previously this was
// assigned inside the inner j-loop, which clobbered the per-mismatch decrement below — the
// resulting divisor only reflected the LAST neighbor's match/mismatch state, producing wrong
// per-feature averages whenever neighbors had mixed phases. Fixed 2026-06-02 during V&V cycle.
tempMisoList = featureNeighborList.size();

for(size_t j = 0; j < featureNeighborList.size(); j++)
{
int32_t neighborFeatureId = featureNeighborList[j];
quatIndex = neighborFeatureId * 4;
ebsdlib::QuatD q2(inAvgQuats[quatIndex], inAvgQuats[quatIndex + 1], inAvgQuats[quatIndex + 2], inAvgQuats[quatIndex + 3]);
uint32_t xtalType2 = inXtalStruct[inFeaturePhases[neighborFeatureId]];
tempMisoList = featureNeighborList.size();
if(laueClass1 == xtalType2 && static_cast<int64_t>(laueClass1) < static_cast<int64_t>(orientationOps.size()))
{
ebsdlib::AxisAngleDType axisAngle = orientationOps[laueClass1]->calculateMisorientation(q1, q2);
Expand Down
Loading
Loading