Skip to content

Costs: what a finding costs

A finding's cost is one of four kinds of figure, and the kinds are never added together. A plant manager should be able to check every dollar against their own records, so each figure says what it is and the finding page shows the arithmetic behind it. Give the collection's context model a costs block, and an asset its own rate where it differs:

"costs": { "currency": "USD", "perMinuteDown": 40, "perScrappedPart": 3.5,
           "products": [ { "name": "Cap 38mm", "perScrappedPart": 0.8 } ],
           "runningStates": ["Running"],
           "attribution": [ { "family": "drift", "asset": "ct1", "downtimeReasons": ["cooling water"] } ] },
"assets": [ { "id": "press4", "name": "Press 4", "costPerMinuteDown": 95 } ],
"relations": [ { "from": "ct1", "to": "press4", "type": "feeds" } ]

The editor's collection form holds the costs rates and the asset form holds costPerMinuteDown (section 7.1); attribution is edited in the model's JSON.

The four kinds

  1. Attributed: the stops your own records tie to the problem. When costs.attribution has an entry for the finding's kind (its family: drift, band, setpoint, first-out-alarm, an mes- check, ...; optionally only on one asset or one tag), the finding is charged the downtime whose reason is one of downtimeReasons (compared without case, as the state-periods reason column carries it), on its own machine and every machine its feeds relations reach (a cooling tower feeds the presses it cools), during the finding's active span (the start and end its evidence names, not the whole time it stayed open). Each machine's minutes are priced at its own costPerMinuteDown, else perMinuteDown. It reads "USD 719 attributed", the figure "11 stops, 20.6 min". When such a finding has mapped stops, excess over normal is not added to it (excess scrap on those machines is not counted there); when it has none, it is priced as excess instead and says so. Two attributed findings on one source with overlapping spans each price their own span and each names the other as an overlap.
  2. Above normal (estimated): for any other process finding on a machine: only what is above that machine's own usual rate.
  3. Scrap, per product: (reject rate in the finding's hours − the same product's reject rate in the baseline) × parts made in the finding's hours × the product's price (its products entry, else perScrappedPart; the arithmetic names which). Parts made = good + rejected from the counts shape; a count bucket the window cuts counts in proportion to its overlap. A figure can therefore differ by a part or two from a raw shot count: on Whitfield, A13's window cuts the hourly buckets at 4:24 PM, so it shows 190.6 WD-4510-VB rejected of 1,671.6 made where the shot table counts 191 of 1,670.
  4. Downtime: (unplanned minutes per running hour in the finding's hours − the baseline's) × running hours × the per-minute rate. Running hours are the hours less every period that is not running (planned or not); unplanned minutes are periods whose planned is not true and whose state is not in runningStates.
  5. The baseline is the 28 days before the finding began.
  6. Stops the map ties to a cause are left out of the downtime, in the finding's hours and in the baseline: every stop whose reason a costs.attribution entry names for this machine (an entry with an asset reaches that machine and every machine it feeds; one without reaches all). This is decided by the map alone, and the arithmetic says "N stops with reasons mapped to a cause are left out".
  7. Guards: "not priced" beats an invented number. A product is priced only with at least 200 parts made in the finding's hours and 1,000 in the baseline; downtime only with 8 running hours in the finding's hours, 48 in the baseline and 5 unplanned stops there. The difference must be at least 3 standard errors (scrap: a two-proportion test; stop minutes: a compound-Poisson test using the baseline's stop rate and stop lengths). The label names the reason that binds: a product well above normal but made in too few parts is "Not priced: too few parts"; a smaller difference is "Not priced: could be chance"; a rate at or below normal is "No excess over normal"; too few parts or hours otherwise is "Not priced: too little data". Rates in the arithmetic are shown to the cent so every line multiplies out.
  8. Each finding is priced on its own: its own window against its own baseline, whatever other findings exist, so its figure is the same on the list, a filtered list, its page, the digest and Ask. When another finding that is open, judged a real issue, or resolved from open or a real issue (its resolve note records the status it had before; one resolved from hidden or suppressed is never named), on the same machine or one related by feeds, has an attributed or above-normal figure over an overlapping window, the arithmetic adds "Overlaps with '' (<from> to <to>): these figures are not additive" and the cost JSON lists it in <code>overlaps</code>; it never changes the figure. A dismissed (not an issue), known, suppressed or hidden finding is never named. Findings resolved before this version carry no record of their earlier status, so they are never named as overlaps; their cost figures are unaffected. Two findings that list each other in <code>overlaps</code> are never added, even when they are the same kind.</li> <li>A finding shape attributes is not shape-priced as well; an MES Watch finding keeps its own measured excess (below).</li> <li><strong>Risk if left alone</strong>: a slow trend (Anomaly Watch's <code>trend</code> family) whose evidence forecasts reaching a limit shows how soon: "reaches its high alarm limit (140 degF) in about 2.3 days at this rate", as of the last run, with the level and rate in its arithmetic. It is never dollars and never added to a dollar figure, and says "not priced: no recorded event of this kind to price". A trend with no limit in sight reads "No limit in sight".</li> <li><strong>Not priced</strong>: with why. Alarm Health and Gateway Health <strong>setup</strong> findings read "Not counted: alarm setup" / "system setup" and, where the evidence measures it, show the <strong>operator burden</strong> instead: "about 11 activations a day (74 in 7 days)", or "25 alarms trip at once on each restart". Data-health findings (ticket 181) read "a data problem, not a machine cost". Every other unpriced finding says what is missing: no asset, the asset not in the model, no shapes mapped, a rate to set, a read that failed, or nothing recorded.</li> </ol> <p><strong>MES Watch findings</strong> keep the excess their own check measured since the pattern began, as kind <em>above normal</em>: stop minutes and slow-running minutes at the per-minute rate, rejects and failed checks at the one part price: the product's <code>products</code> entry where the check names a product (waste after planned stops names it when one product ran after the stops), else <code>perScrappedPart</code> (the arithmetic says the check did not split by product) , the same lookup the shape findings use, in the finding and in MES Watch's ranking. A drift has no cost until parts fail.</p> <p><strong>When the window starts and ends.</strong> A finding's hours run from first seen to resolved, else last seen, else now , from when it began where it knows (an Anomaly Watch span start, an Incident's look-back <code>windowMinutes</code>, default 30, before first seen), and to the end of the span it names when that is more than an hour before its last sighting. The arithmetic states the hours compared.</p> <p><strong>Where the figure shows.</strong> The Findings list's <strong>Cost</strong> column shows the figure and its kind ("USD 9,005 above normal", "USD 719 attributed", "reaches its high alarm limit ... in about 2.3 days", "Not priced: could be chance"). A group row (a detector's fires, or several findings grouped) never adds findings that overlap each other: it shows each one's figure on its own line (<code>kind</code> <code>overlapping</code>, no <code>amount</code>). Otherwise it adds like with like only: one kind gives one amount; an attributed and an above-normal member show each kind on its own line ("USD 100 attributed", "USD 300 above normal"; <code>kind</code> <code>mixed</code>, the sums in <code>byKind</code>, no single <code>amount</code>). The list sorts by severity; <code>sort: "cost"</code> ranks attributed, then above normal, each by its own amount, then mixed groups, risks and the rest. The finding page's <strong>Cost</strong> card shows the figure, what it counts and every step. The digest's cost line names the kind. Ask's findings tool carries each finding's <code>cost.kind</code>, <code>label</code>, <code>amount</code>, <code>currency</code>, <code>reason</code>, <code>figure</code>, <code>basis</code>, <code>arithmetic</code> and <code>overlaps</code>, so Ask quotes and explains the page's figure and never adds kinds or overlapping findings; its downtime tool says its totals are gross downtime by reason over the asked window, not a finding's cost.</p> <p><strong>The cost JSON</strong> (on each row of <code>getFindings</code>/<code>getFinding</code>, and as <code>cost</code> in MQTT messages and callbacks, section 9): <code>amount</code> (null unless attributed or above normal), <code>currency</code>, <code>kind</code> (<code>attributed</code>, <code>excess</code>, <code>risk</code>, <code>notPriced</code>, <code>mixed</code>, <code>overlapping</code>), <code>kindText</code>, <code>label</code>, <code>text</code>, <code>basis</code>, <code>reason</code> (and its older name <code>missing</code>), <code>figure</code> (a time to a limit or an operator burden), <code>arithmetic</code> (the steps, plain words), <code>overlaps</code> (the ids of findings it overlaps), <code>downtimeMinutes</code> and <code>scrapParts</code> (above normal or attributed), <code>scrapByProduct</code>, <code>byKind</code>, <code>since</code>, <code>until</code>, <code>measure</code> (MES Watch), <code>partial</code>. MQTT and callbacks carry <code>kind</code>, <code>label</code>, <code>amount</code>, <code>currency</code>, <code>reason</code>, <code>figure</code>, <code>arithmetic</code> and <code>overlaps</code>; a resolved notice carries no cost.</p> <p><strong>Checks on save.</strong> Rates are numbers of zero or more, <code>currency</code> at most 8 characters, product names set and distinct. Each <code>attribution</code> entry needs a <code>family</code> Artekis files (an unknown one is refused with the list), at least one reason (every reason a non-blank string), an <code>asset</code> of the model when set, and a non-blank <code>tag</code> when set. Changing a rate or the map re-prices every finding at once: no cost is stored.</p> <p><strong>Reads are bounded:</strong> one read of each mapped shape per collection per request, from 28 days and 24 hours before the earliest finding being priced (the baseline, plus a day so a period or bucket that began before still counts its overlap) to the latest end, through the shape reader's paging and row cap; one read of the findings' metric evidence; one read of the open, confirmed and resolved findings on their machines and related machines, for the overlap lines. When a list's read hits the row cap (a long list reaches further back than one finding's page), each finding in it is priced again with its own read, exactly as its page prices it, so a figure never depends on the caller. A finding whose own read hits the row cap is marked <code>partial</code>, its baseline starts where the read does, and the arithmetic states that start and the days actually compared.</p> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Artek LLC </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"annotate": null, "base": "../../../..", "features": ["navigation.tabs", "navigation.sections", "navigation.indexes", "navigation.top", "navigation.path", "search.suggest", "search.highlight", "content.code.copy"], "search": "../../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../../../../assets/javascripts/bundle.d7400e89.min.js"></script> </body> </html>