The daily read: what is bleeding, what is verified, what to say first.
Today's opportunities8 in the queue · numbers are engine evidence ranks, so a missing number means the checker consolidated or held that rank · click one to dive in
1Checker verifiedPlating - Burn
10G CARBON STEEL 120" X 30"
$127,166
recent half, scrap-weighted
Climbing +87% vs the prior half92% true scrap$2,729 per event
clear: no exact part match and no initiative match on Plating - Nickel Out
Over-claim audit
clean: maker numbers align with engine; canned first step may misfit Nickel Out but that is engine playbook, not maker invention
Confidence
The trend is strong over 6 weeks, indicating a significant issue.
Cited numbers
$39,244 recent-weightedtrend +55%$2,671/event
4
TUNGSTEN SPROCKET DEBUR
Held for review
Why it ranks here
$75,195 lost in the recent half of the window, scrap-weighted
Flat (+11%) vs the prior half: steady cost, not a fire
66% true scrap: $118,584 of $180,188 raw loss is unrecoverable
$2,611 per failure across 69 events
$235.54 lost per unit run, across 765 processed units
Present 6 of 6 weeks · no one-week spike
Raw dollars rank it #6, evidence ranks it #4: totals alone would miss it
The maker's take
Rack Mark defects are present.
First move
Pull True Cam tank parameters for the line and check rack contact / agitation on the top part numbers.
Why the checker held this
Trend is only +10.5%, effectively flat per rubric, so this is steady-state loss not a clearly worsening project yet.
Real vs noise
concern: 6 weeks present and not a spike, but trend +10.5% is too close to flat to confirm
Known work
clear: no exact part match and no initiative match on Plating - Rack Mark
Over-claim audit
clean: maker did not overstate worsening, only said defects are present
Confidence
The data shows consistent performance over 6 weeks.
Cited numbers
$75,195 recent-weighted$2,611/event
5
5" PIPE-CRV STACK 439 SST NiCR · POL
Held for review
Why it ranks here
$79,127 lost in the recent half of the window, scrap-weighted
Healing -24% vs the prior half
62% true scrap: $147,407 of $236,341 raw loss is unrecoverable
$2,717 per failure across 87 events
$265.25 lost per unit run, across 891 processed units
Present 6 of 6 weeks · no one-week spike
Raw dollars rank it #1, evidence ranks it #5: totals alone would overweight it
The maker's take
Rack Mark defects are healing.
First move
Pull True Cam tank parameters for the line and check rack contact / agitation on the top part numbers.
Why the checker held this
Healing trend -23.8%; not a worsening opportunity for Chris's queue.
Real vs noise
concern: 6 weeks present and not a spike, but trend -23.8% is healing, not worsening
Known work
clear: no exact part match and no initiative match on Plating - Rack Mark
Over-claim audit
clean: maker correctly framed it as healing and said no action is needed
Confidence
The negative trend indicates improvement, so no action is needed.
Cited numbers
$79,127 recent-weightedtrend -24%$2,717/event
7
MEDALLION, BREAKOUT
Held for review
Why it ranks here
$67,899 lost in the recent half of the window, scrap-weighted
Healing -22% vs the prior half
73% true scrap: $135,288 of $185,182 raw loss is unrecoverable
$2,608 per failure across 71 events
$239.87 lost per unit run, across 772 processed units
Present 6 of 6 weeks · no one-week spike
Raw dollars rank it #5, evidence ranks it #7: totals alone would overweight it
The maker's take
Dings/Gouges/Dents defects are healing.
First move
Pull incoming inspection and supplier scorecard for the part; this may be an upstream defect.
Why the checker held this
Healing trend -22.3%; not a still-worsening problem to assign now.
Real vs noise
concern: 6 weeks present and not a spike, but trend -22.3% is healing
Known work
clear: no exact part match and no initiative match on Material - Dings/Gouges/Dents
Over-claim audit
clean: maker correctly described healing and did not invent a supplier or cause
Confidence
The negative trend indicates improvement, so no action is needed.
Cited numbers
$67,899 recent-weightedtrend -22%$2,608/event
8
SCREW,FLANGE,HEX HEAD
Held for review
Why it ranks here
$69,258 lost in the recent half of the window, scrap-weighted
Healing -18% vs the prior half
87% true scrap: $144,809 of $167,165 raw loss is unrecoverable
$2,458 per failure across 68 events
$219.09 lost per unit run, across 763 processed units
Present 6 of 6 weeks · no one-week spike
The maker's take
Out of Round defects are healing.
First move
Run a cycle-time and fixture check on the polishing cell; confirm operator ramp on that line.
Why the checker held this
Healing trend -18.0%; not a worsening opportunity despite the cost level.
Real vs noise
concern: 6 weeks present and not a spike, but trend -18.0% is healing
Known work
clear: no exact part match and no initiative match on Polishing - Out of Round
Over-claim audit
clean: maker correctly framed it as healing and did not overreach
Confidence
The negative trend indicates improvement, so no action is needed.
Cited numbers
$69,258 recent-weightedtrend -18%$2,458/event
The window at a glanceJun 1 to Jul 8, 2026 · numbers from the kpis table, computed in SQL
Does the tool hold up?every human verdict is stored; this is the tool grading itself against your judgment
50%
1 approved · 1 sent back
What is comingthe reject ledger crossed with the customer release schedule
$6,782,674
A projection, not a measured fact: the release schedule behind it is
synthetic mock data until IT connects the real feed. Basis: each part's loss per released unit
over the window behind us, times the units released for the next 92 days, rework
discounted the same way on both sides. On a per-day footing that is
$73,725/day projected vs $55,773/day measured over the
38-day window behind us, across all 16 parts.
Top single part: 6X108,MIT,ST(OD) CHR POL$680,302
7X60,MIT,ST(OD) CHR POLhidden: only #13 by dollars, but #3 by what is coming
2.5xits released volume vs what it has been running
Why this matters
Fixing a part before its volume lands is worth more than fixing it after. This is the window.
Python computes every number · AI maker explains · an independent AI checker verifies · a deterministic cross-check audits the checker. AI never does the math.
1
10G CARBON STEEL 120" X 30"
Plating - Burn
$127,166
Plating - Burn defects are climbing sharply.
First move
Pull True Cam tank parameters for the line and check rack contact / agitation on the top part numbers.
Why it matters
This part has a recent-weighted cost impact of $127,166, with a trend climbing +87%. Most of the defects are true scrap, costing $2,729 per event.
Why this confidence
The data shows a strong trend over 6 weeks with significant cost impact.
Cited numbers
$127,166 recent-weightedtrend +87%$2,729/event
Independent checker
6 weeks present, not a spike, trend +86.9%, and mostly true scrap with $188,888 scrap cost; no known-project match.
clear: no exact part match and no initiative match on Plating - Nickel Out
Over-claim audit
clean: maker numbers align with engine; canned first step may misfit Nickel Out but that is engine playbook, not maker invention
What the checker removed today, and why
TUNGSTEN SPROCKET DEBUR
Trend is only +10.5%, effectively flat per rubric, so this is steady-state loss not a clearly worsening project yet.
re-review
5" PIPE-CRV STACK 439 SST NiCR · POL
Healing trend -23.8%; not a worsening opportunity for Chris's queue.
re-review
MEDALLION, BREAKOUT
Healing trend -22.3%; not a still-worsening problem to assign now.
re-review
SCREW,FLANGE,HEX HEAD
Healing trend -18.0%; not a worsening opportunity despite the cost level.
re-review
Drafted corrective actions. A worker agent drafts the first
move for the top confirmed opportunities, an independent reviewer plus a deterministic
number check gate each draft, and nothing is auto-approved. You make the final call.
2 waiting on your call1 held for fix
#1
10G CARBON STEEL 120" X 30"
Plating - Burn
Ready for your review
Likely root cause
Check for improper tank parameters or agitation issues causing burn defects.
First move
Pull True Cam tank parameters for the line and check rack contact / agitation on the top part numbers.
Data to pull to confirm
Tank parameters for the plating line
Agitation settings
Rack contact points
Plating line engineer$127,166 recent-weighted
Independent reviewer
Root cause fits Plating - Burn, first step is concrete for a plating engineer, and cited figures match engine values after rounding ($127,166 recent-weighted, +86.88%, $2,729/event).
Root cause
pass
First step
pass
Numbers
pass
Gate: reviewer approved and every number matched the engine
Why? (one tap, optional)
Send back = "already looked at that, not one." The next run skips it and drafts the next best.
#3
6X108,MIT,ST(OD) CHR POL
Misc - Lost Parts
Held: needs a fix
Likely root cause
Investigate shifts and weeks to identify changes leading to lost parts.
First move
Break the part's rejects down by shift and week to isolate what changed.
Data to pull to confirm
Reject data by shift
Reject data by week
Production changes during the period
Production supervisor$86,397 recent-weighted
Independent reviewer
Lost Parts root cause is too vague and the first step is analysis-only; replace with a specific containment action tied to part handling/custody while keeping engine-matched numbers ($86,397, +45.13%, $2,538/event).
Root cause
Concern: 'identify changes' does not state a plausible handling/custody root cause for Misc - Lost Parts.
First step
Concern: 'Break the part's rejects down by shift and week' is diagnostic analysis, not a concrete containment move Chris can assign today.
Numbers
pass
Gate: reviewer: Lost Parts root cause is too vague and the first step is analysis-only; replace with a specific containment action tied to part handling/custody while keeping engine-matched numbers ($86,397, +45.13%, $2,538/event).
Why? (one tap, optional)
Send back = "already looked at that, not one." The next run skips it and drafts the next best.
#6
5" PIPE-CRV STACK 439 SST NiCR · PLT
Plating - Nickel Out
Ready for your review
Likely root cause
Assess tank parameters and agitation to address nickel out defects.
First move
Pull True Cam tank parameters for the line and check rack contact / agitation on the top part numbers.
Data to pull to confirm
Tank parameters for the plating line
Agitation settings
Rack contact points
Plating line engineer$39,244 recent-weighted
Independent reviewer
Root cause fits Plating - Nickel Out, first step is concrete for plating, and cited figures match engine values after rounding ($39,244 recent-weighted, +54.82%, $2,671/event).
Root cause
pass
First step
pass
Numbers
pass
Gate: reviewer approved and every number matched the engine
Why? (one tap, optional)
Send back = "already looked at that, not one." The next run skips it and drafts the next best.
Your decisions so farevery verdict is stored with a timestamp · a sent-back part stays out of future drafting, so this ledger is its paper trail
Sent backTUNGSTEN SPROCKET DEBURrun #3 · 2026-07-30 02:38Z
Pareto: where the coded loss lives
No single villain: the top two families carry only 11% and it takes 8 families to reach half the coded dollars. A spread this even points at process discipline, not one bad machine. Red line = cumulative share.
Week by week: scrap vs rework
Worst week is Jun 14 at $570K. True scrap is 76% of every week's loss.
True scrap (gone)Rework (recoverable)
Top parts by recent pull
The four queue parts pull $376K of the recent window. Green tag = survived the checker.
The exact tabledbo.reject_lines · production rejects only (inventory adjustments held out) · newest first
What is not in this table: 273 inventory-adjustment rows
worth $661,941 were held out of every number on this portal. They post to the same
ledger but carry a reason code instead of a defect code, because they are stock corrections rather than production
defects. Scoring them would rank inventory write-offs as quality problems.
Costs post negative in the export; the metrics above and the SQL both use absolute values.
Click any column header to sort. The excluded / ignore-exception rows (currently 0) never enter any calculation.
KPI registrycomputed inside Azure SQL by the scheduled job · these are the numbers the portal shows
Each number: its stored value, the plain-English formula, and the exact SQL that produced it.
Anyone can rerun the SQL and get the same answer. Nothing here comes from the AI; the maker and checker only ever
receive these computed values.
Total reject cost, rolling window$2,477,803
Sum of the absolute value of reject_cost across scored rows in the rolling analysis window (last 8 weeks back from the newest row; production rejects only, inventory adjustments and incomplete rows held out). Costs post negative in the ledger, so we take absolute values.
Show the SQL
SELECT ISNULL(SUM(ABS(reject_cost)), 0) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output'))
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
True scrap cost (unrecoverable)$1,880,412
Sum of absolute reject_cost where item_type = 'Non-Rework'. Scrap means the part is gone.
Show the SQL
SELECT ISNULL(SUM(ABS(reject_cost)), 0) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output')) AND LOWER(LTRIM(RTRIM(item_type))) = 'non-rework'
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Rework cost (recoverable)$597,390
Sum of absolute reject_cost where item_type is anything other than 'Non-Rework'.
Show the SQL
SELECT ISNULL(SUM(ABS(reject_cost)), 0) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output')) AND LOWER(LTRIM(RTRIM(item_type))) <> 'non-rework'
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Scrap share of all loss75.9%
True scrap cost divided by total reject cost, times 100. Computed in one SQL statement.
Show the SQL
SELECT 100.0 * SUM(CASE WHEN LOWER(LTRIM(RTRIM(item_type))) = 'non-rework' THEN ABS(reject_cost) ELSE 0 END) / NULLIF(SUM(ABS(reject_cost)), 0) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output'))
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Reject events, rolling window981
Count of active rows that have both a posting date and a cost, the same rows the engine analyzes.
Show the SQL
SELECT COUNT(*) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output'))
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Average cost per reject event$2,526
Total reject cost divided by total events, in one SQL statement.
Show the SQL
SELECT SUM(ABS(reject_cost)) / NULLIF(COUNT(*), 0) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output'))
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Worst week2026-06-14$570,019
Group scored production rows by the export's week_of column, sum absolute reject_cost, take the biggest. Detail carries which week it was.
Show the SQL
SELECT TOP 1 SUM(ABS(reject_cost)) AS value, CONVERT(varchar(10), week_of, 23) AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output')) GROUP BY week_of ORDER BY SUM(ABS(reject_cost)) DESC
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Group coded rows (not uncoded) by defect_description, sum absolute reject_cost, take the biggest. Detail carries the family name.
Show the SQL
SELECT TOP 1 SUM(ABS(reject_cost)) AS value, defect_description AS detail FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output' AND posting_date > DATEADD(week, -8, (SELECT MAX(posting_date) FROM dbo.reject_lines WHERE excluded = 0 AND posting_date IS NOT NULL AND reject_cost IS NOT NULL AND LOWER(LTRIM(RTRIM(entry_type))) = 'prod. output')) AND NOT (defect_code IS NULL OR LOWER(LTRIM(RTRIM(ISNULL(defect_description, '')))) IN ('', 'no code selected')) GROUP BY defect_description ORDER BY SUM(ABS(reject_cost)) DESC
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Active ledger rows1,254
Count of rows where the ignore-exception flag is off (excluded = 0).
Show the SQL
SELECT COUNT(*) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 0
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Rows excluded by the ignore-exception flag0
Count of rows a human flagged out of the math (excluded = 1), IT's centralized-adjustment pattern.
Show the SQL
SELECT COUNT(*) AS value, NULL AS detail FROM dbo.reject_lines WHERE excluded = 1
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Tool picks approved first time1 approved / 1 sent back50.0%
Of every drafted action a human has ruled on, the share that was APPROVED as-is (versus SENT_BACK). The evals number: it measures whether the tool's picks hold up once a person judges them. NULL until the first human decision lands.
Show the SQL
SELECT 100.0 * SUM(CASE WHEN status = 'APPROVED' THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN status IN ('APPROVED', 'SENT_BACK') THEN 1 ELSE 0 END), 0) AS value, CONCAT(SUM(CASE WHEN status = 'APPROVED' THEN 1 ELSE 0 END), ' approved / ', SUM(CASE WHEN status = 'SENT_BACK' THEN 1 ELSE 0 END), ' sent back') AS detail FROM dbo.opportunity_queue
computed 2026-07-30 04:00Z by run_pipeline.py · stored in dbo.kpis
Rank the board by
and you chase what already hurt. Rank it by
(recent pull × direction of travel × cost intensity ×
, with a
)
and the list reorders itself. Click any row to see exactly why it ranks where it does.
By raw dollars · the gut list
By evidence · what is worsening
By what is coming · top 8 of 16
Three readings of the same plant. Dollars look backward at totals, evidence looks at
direction of travel, and the third column multiplies how sick each part is per unit by the volume your
customers have already released. A part that is quiet in the first two and loud in the third is the one
worth catching early.
Other ways to cut the same datathe identical four-move score, grouped by something other than the part
A part-by-part ranking cannot see a problem that belongs to a place, a customer, or a
person. Same math, different grouping.
Location · 6 distinct · where it is happening
PORTCITY+22%$172,559
AIRPARK-8%$171,290
NCP-4%$147,567
ELITEFIN-16%$144,643
LDC-56%$162,431
INVENTORY-61%$84,539
Customer · 15 distinct · whose parts are failing
PETE01+99%$135,313
CUMM10+54%$88,106
LIMN10-14%$65,060
DAIM10+5%$73,091
HDPA10-23%$80,163
TAB10-24%$61,519
Responsibility · 18 distinct · who owns the defect
23+54%$85,402
310+14%$75,414
55-3%$69,508
345+32%$71,589
49+35%$57,494
SHIPRCV+8%$53,517
Defect family · 37 distinct · what is going wrong
Misc - Lost Parts+127%$50,085
Plating - Burn+70%$56,724
Plating - Rack Mark+52%$75,075
Assembly - Handling Damage+127%$46,711
Assembly - Fitment+117%$37,555
Plating - Contamination+41%$44,443
Hover a row to trace where it moves. The emerald line is 6X108,MIT,ST(OD) CHR POL jumping #7 → #3; the rose row is 5" PIPE-CRV STACK 439 SST NiCR · POL healing on its own and dropping off the chase list.
How the data flows
the tool never reaches into the ERP
Navision exportthe reject board, as-is
→
Push flowPower Automate or similar, IT-owned
→
Azure SQLreject_lines · known_projects · runs
→
Python engineall math, tested
→
Maker + checker AIexplain, then verify
→
Portal + APIthis page · /api/queue
Built to the pattern IT described
alignment conversation, July 14
Data is pushed, never pulled
"It has to be a push from the current ERP now, and in the future place, whenever the change happens. Whether it is Power Automate or something that integrates some flows to push some data."
Built: reject_lines is a landing table with the exact reject-board export columns. The tool holds no connection into Navision, and an ERP change later does not touch it: the push flow just points at the same table.
One centralized place, with an ignore-exception box
"Push the raw data into one centralized place, and they make their adjustments in the same centralized place. If they make some exceptions, maybe they check a box, like ignore exception, and then you can work off of that."
Built: every row carries an excluded flag plus a note, right next to the raw data. The engine computes only on rows where excluded = 0. The adjustment pattern IT described is the schema.
The parallel pilot, human vs tool
"Somebody works on it how they would do it manually, the normal process, and then you do the same thing with the tool and compare results, whether the tool is the same or better."
Built: the Gut vs evidence view is that comparison for ranking, and every daily output is stored in the runs table, so tool-vs-manual can be scored over weeks, not argued over anecdotes.
Tenant migration stays small
"We have an Azure tenant that we use minimally right now. It is a matter of just maybe setting you up by giving you some permissions there. The costs that you have shown were very minimal."
Built: everything lives in one resource group. Migration = recreate the three tables in the tenant, point the push flow at them, and swap config to Entra identities. No hardcoded keys anywhere, and the database pauses itself when idle.
Tenant target, four layers
what lifts where
1 · DataAzure SQL as the single source of truth. This page's numbers come from it right now.BUILT · LIVE
2 · OrchestrationPlain Python engine + maker/checker agents, fully tested. Containerizes into Foundry Agent Service (bring your own code); auth swaps to Microsoft Entra managed identity with zero logic changes.READY TO LIFT
3 · Distribution/api/queue serves the verified queue as clean JSON. Register it as a Copilot Studio action and the queue and approvals land inside Microsoft Teams.ENDPOINT LIVE
4 · GovernanceMock data only until inside the tenant. There, DLP, access control, and data boundaries are inherited from the enterprise environment.TENANT PHASE
What we ask IT for
four things, all small
Permissions in the Lincoln Azure tenant (the setup already discussed).
A target resource group to receive the same three-table setup.
A push flow (Power Automate) from the reject-board export into reject_lines. The columns already match one for one.
Entra identities for the app and database, replacing the prototype's config keys.
Connected data
What this portal is reading right now. Every number on every view comes from here.
Database
Azure SQL · opexradar on sql-opexradar-wus2 (serverless, auto-pause)
reject_lines
1,254 active rows · 0 excluded by the ignore-exception flag
known_projects
3 tracker entries the checker cross-references
runs
7 saved runs · every output kept for the pilot comparison
kpis
14 numbers computed IN SQL by the KPI job · refreshed daily at 05:30 UTC by the Azure timer and on every pipeline run
Feed
mock reject-board export · the live version is an IT-owned push from Navision
Window
Jun 1 to Jul 8, 2026
Engine
m0_engine.py · all math in Python · 77 offline tests + an engine self-test + 2 live parity suites