<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[IECCalc Engineering Notes]]></title><description><![CDATA[IECCalc Engineering Notes]]></description><link>https://ieccalc.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>IECCalc Engineering Notes</title><link>https://ieccalc.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 11:55:45 GMT</lastBuildDate><atom:link href="https://ieccalc.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Six provenance classes, and why your calculation tool needs them]]></title><description><![CDATA[Here is a bug report you will never receive, because nobody can see it:

The cable schedule says 120 mm². It was 95 mm² last quarter. Nothing in the project changed. Nobody knows which input moved.

E]]></description><link>https://ieccalc.hashnode.dev/six-provenance-classes-and-why-your-calculation-tool-needs-them</link><guid isPermaLink="true">https://ieccalc.hashnode.dev/six-provenance-classes-and-why-your-calculation-tool-needs-them</guid><category><![CDATA[software architecture]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[data-modeling]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Evgenii Buchinskii]]></dc:creator><pubDate>Fri, 02 Oct 2026 05:42:55 GMT</pubDate><content:encoded><![CDATA[<p>Here is a bug report you will never receive, because nobody can see it:</p>
<blockquote>
<p>The cable schedule says 120 mm². It was 95 mm² last quarter. Nothing in the project changed. Nobody knows which input moved.</p>
</blockquote>
<p>Engineering calculation software is usually built to answer <em>what is the result</em>. Design review asks a different question: <em>what would have to be wrong for this result to be wrong</em>. A tool that stores only outputs cannot answer it, and no amount of UI polish compensates.</p>
<p>The fix is smaller than it sounds. It is one field on every input.</p>
<h2>The field</h2>
<p>Every decision-relevant input carries a <strong>provenance class</strong> — where the value came from, not what it is. Six classes cover an engineering calculation completely:</p>
<table>
<thead>
<tr>
<th>Class</th>
<th>Where the value came from</th>
<th>What goes wrong without it</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Normative</strong></td>
<td>A clause in a named standard <strong>edition</strong></td>
<td>The edition changes and saved results silently become results under a superseded method</td>
</tr>
<tr>
<td><strong>Manufacturer</strong></td>
<td>A data sheet, catalogue or type-test report</td>
<td>Nobody can tell a measured value from a typical one, or find which revision it came from</td>
</tr>
<tr>
<td><strong>Project</strong></td>
<td>A decision recorded for this project</td>
<td>Site-specific limits look like physics and get copied to the next project</td>
</tr>
<tr>
<td><strong>Assumption</strong></td>
<td>Chosen because the real value was not available</td>
<td>The weakest number in the chain is indistinguishable from the strongest</td>
</tr>
<tr>
<td><strong>User override</strong></td>
<td>A library value a user replaced by hand</td>
<td>A default silently edited once propagates forever and is invisible on review</td>
</tr>
<tr>
<td><strong>Derived</strong></td>
<td>Computed from other inputs</td>
<td>A value that should have moved when its parent changed quietly did not</td>
</tr>
</tbody></table>
<p>That is the whole model. Six strings, one per input. Not an ontology, not a graph database, not a semantic layer — the simplest thing that makes the right question answerable.</p>
<h2>Why "normative" is not enough without the edition</h2>
<p>The class that most often gets implemented wrong is the first one, because teams store the standard <strong>number</strong> and not the <strong>edition</strong>.</p>
<p>IEC 60909-0:2016 was replaced by IEC 60909-0:2026 in July 2026. A short-circuit result saved as "per IEC 60909" is now ambiguous in a way it was not the week before: there is no way to tell, from the saved record, which method produced it. A result saved as "per IEC 60909-0:2016, clause 6.2" is still perfectly reviewable — and, more usefully, a tool can <strong>flag</strong> it when the edition it cites stops being current.</p>
<p>That flag is the single highest-value feature in this whole idea, and it costs a string comparison.</p>
<h2>Why "assumption" earns its place</h2>
<p>Of the six, the one engineers push back on is <code>assumption</code>. The objection is that it looks bad — it marks your own work as uncertain.</p>
<p>That is exactly what it is for. In a thermal cable calculation, soil thermal resistivity is almost never measured; it is assumed. It is also, routinely, the parameter that moves the answer most. A result where the dominant input is class <code>assumption</code> is a different object from one where it is class <code>manufacturer</code>, and a reviewer who cannot see the difference is reviewing the arithmetic rather than the engineering.</p>
<p>Marking it does not weaken the result. It tells the reader where to push.</p>
<h2>What this is not</h2>
<p>It is <strong>not</strong> validation. Traceability tells you where every number came from; validation tells you whether the method is right. A fully traceable wrong equation is still wrong, and a validated black box is still unreviewable. You need both, and they are different work.</p>
<p>It is <strong>not</strong> an audit log. An audit log records <em>who changed what when</em>. Provenance records <em>what kind of thing this value is</em>, which is what a reviewer needs and what survives being exported to a PDF.</p>
<p>It is <strong>not</strong> a reason to build a data model. If adding provenance to your inputs requires a schema migration and a new service, you have over-designed it. It is a column.</p>
<h2>The part that changes the output</h2>
<p>Once inputs carry a class, the calculation report can say something a bare PASS never says:</p>
<blockquote>
<p><strong>Governing criterion:</strong> short-circuit thermal withstand.
<strong>Margin:</strong> 185 mm² installed against 154 mm² required.
<strong>Weakest input:</strong> <code>k = 115</code> — class <em>assumption</em>, no source recorded.</p>
</blockquote>
<p>A reviewer reads three lines and knows where to spend their hour. Compare that with a green tick.</p>
<p>And the reporting rule that follows is the one I would push hardest: <strong>never emit a bare PASS or FAIL</strong>. Always name the criterion that governed and the numerical margin to it. A PASS at 3 % reserve and a PASS at 40 % reserve are the same pixel and completely different engineering situations, and the tool is the only thing in the loop that knows which one it just produced.</p>
<h2>If you implement one thing</h2>
<p>Add the edition to every normative reference you store, and make the tool warn when a cited edition is superseded. Everything else on this list can wait; that one stops saved results from quietly decaying.</p>
<hr />
<p>The full method — the six classes in detail, how dependencies and substitutions are recorded, how the governing constraint and margin are reported, and a worked multi-segment cable route — is in the technical report:</p>
<p>E. Buchinskii, "Clause-Traceable Engineering Calculations: a Method for Design Tools That Show Their Working," IECCalc.com Technical Report IECCalc-TR-2026-001, v1.0, Sep. 2026. doi: <a href="https://doi.org/10.5281/zenodo.23061123">10.5281/zenodo.23061123</a></p>
<p>Verification code: <a href="https://github.com/buchinskiievg/ieccalc-tr-validation">github.com/buchinskiievg/ieccalc-tr-validation</a> (doi:10.5281/zenodo.23080081).</p>
<p><em>Disclosure: I wrote the report and I develop <a href="https://ieccalc.com/">IECCalc.com</a>, the free IEC calculator set where this method is implemented.</em></p>
]]></content:encoded></item></channel></rss>