minor fixes

This commit is contained in:
2026-08-27 16:47:09 -06:00
parent 70bb5a4e07
commit fbaf874f8d
+2 -31
View File
@@ -6,9 +6,9 @@
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<meta <meta
name="description" name="description"
content="10-minute presentation deck for the Utah Vehicle Health development prototype." content="Presentation deck for the Utah Vehicle Health development prototype."
/> />
<title>Utah Vehicle Health · 10-minute deck</title> <title>Utah Vehicle Health · Deck</title>
<style> <style>
:root { :root {
color-scheme: light; color-scheme: light;
@@ -505,21 +505,6 @@
z-index: 30; z-index: 30;
} }
.timecode {
position: fixed;
top: 1rem;
right: 1.15rem;
z-index: 25;
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--ink-650);
background: var(--white);
border: 1px solid var(--sand-200);
border-radius: 999px;
padding: 0.28rem 0.7rem;
box-shadow: var(--shadow-sm);
}
.counter { .counter {
position: fixed; position: fixed;
bottom: 0.9rem; bottom: 0.9rem;
@@ -682,7 +667,6 @@
overflow: visible; overflow: visible;
} }
.progress, .progress,
.timecode,
.counter, .counter,
.nav, .nav,
.help-btn, .help-btn,
@@ -713,13 +697,11 @@
</head> </head>
<body> <body>
<div class="progress" id="progress"></div> <div class="progress" id="progress"></div>
<div class="timecode" id="timecode">0:00–0:40</div>
<main class="deck" id="deck"> <main class="deck" id="deck">
<!-- 1. Title & boundary --> <!-- 1. Title & boundary -->
<section <section
class="slide slide--title is-active" class="slide slide--title is-active"
data-time="0:00–0:40"
data-guardrail="true" data-guardrail="true"
data-notes="This is a presentation-ready development prototype built from a private, page-sampled 10,000-vehicle cohort. Every result I show is sample-based, not a population estimate. The project does not rank counties or diagnose vehicles." data-notes="This is a presentation-ready development prototype built from a private, page-sampled 10,000-vehicle cohort. Every result I show is sample-based, not a population estimate. The project does not rank counties or diagnose vehicles."
> >
@@ -751,7 +733,6 @@
<!-- 2. Research question --> <!-- 2. Research question -->
<section <section
class="slide" class="slide"
data-time="0:40–1:25"
data-notes="Attempts separated by no more than 30 days form one episode. This keeps rapid fail/retest sequences from becoming repeated target rows. Non-pass combines fail, reject, and abort; blanks remain unlabeled." data-notes="Attempts separated by no more than 30 days form one episode. This keeps rapid fail/retest sequences from becoming repeated target rows. Non-pass combines fail, reject, and abort; blanks remain unlabeled."
> >
<p class="eyebrow">Research question</p> <p class="eyebrow">Research question</p>
@@ -780,7 +761,6 @@
<!-- 3. Development data --> <!-- 3. Development data -->
<section <section
class="slide" class="slide"
data-time="1:25–2:15"
data-guardrail="true" data-guardrail="true"
data-notes="9,996 private tokens remained after validation, producing 83,552 source events and 69,588 episodes. These are reconciliation counts, not Utah totals. Page sampling over-represents vehicles with more inspection records, and participating feeds do not cover all 29 counties." data-notes="9,996 private tokens remained after validation, producing 83,552 source events and 69,588 episodes. These are reconciliation counts, not Utah totals. Page sampling over-represents vehicles with more inspection records, and participating feeds do not cover all 29 counties."
> >
@@ -816,7 +796,6 @@ build 30-day episodes
<!-- 4. Leakage-safe design --> <!-- 4. Leakage-safe design -->
<section <section
class="slide" class="slide"
data-time="2:15–3:10"
data-notes="Every feature window ends before the target episode. The model uses prior outcomes, history depth, timing, age, previously observed make/model, public county context, and season. It excludes current-test diagnostics, future records, identifiers, stations, technicians, and later attempts. The 2025 gate was opened once after specifications were frozen — a development holdout, not a pristine future test." data-notes="Every feature window ends before the target episode. The model uses prior outcomes, history depth, timing, age, previously observed make/model, public county context, and season. It excludes current-test diagnostics, future records, identifiers, stations, technicians, and later attempts. The 2025 gate was opened once after specifications were frozen — a development holdout, not a pristine future test."
> >
<p class="eyebrow">Leakage-safe design</p> <p class="eyebrow">Leakage-safe design</p>
@@ -859,7 +838,6 @@ build 30-day episodes
<!-- 5. Model comparison --> <!-- 5. Model comparison -->
<section <section
class="slide" class="slide"
data-time="3:10–4:20"
data-guardrail="true" data-guardrail="true"
data-notes="Higher PR-AUC and lower Brier are better. Logistic beat both baselines and the boosted-tree benchmark in this one-time sample comparison. Avoid the word accuracy, which obscures class imbalance and calibration." data-notes="Higher PR-AUC and lower Brier are better. Logistic beat both baselines and the boosted-tree benchmark in this one-time sample comparison. Avoid the word accuracy, which obscures class imbalance and calibration."
> >
@@ -913,7 +891,6 @@ build 30-day episodes
<!-- 6. Model decision --> <!-- 6. Model decision -->
<section <section
class="slide" class="slide"
data-time="4:20–4:50"
data-guardrail="true" data-guardrail="true"
data-notes="The final model is calibrated logistic regression. The boosted tree is a benchmark only. It did not improve the declared sample metrics enough to justify greater complexity, while logistic regression is easier to audit and explain." data-notes="The final model is calibrated logistic regression. The boosted tree is a benchmark only. It did not improve the declared sample metrics enough to justify greater complexity, while logistic regression is easier to audit and explain."
> >
@@ -939,7 +916,6 @@ build 30-day episodes
<!-- Live demo cue --> <!-- Live demo cue -->
<section <section
class="slide slide--demo" class="slide slide--demo"
data-time="4:50–7:35"
data-guardrail="true" data-guardrail="true"
data-notes="Follow the demo script. Keep the development-preview banner in view. Explicitly show calibrated logistic as final, the tree as benchmark-only, and the absence of a vehicle-level prediction service. Walk Overview, Sample cohorts, Model & benchmark, and Data & methods." data-notes="Follow the demo script. Keep the development-preview banner in view. Explicitly show calibrated logistic as final, the tree as benchmark-only, and the absence of a vehicle-level prediction service. Walk Overview, Sample cohorts, Model & benchmark, and Data & methods."
> >
@@ -962,7 +938,6 @@ build 30-day episodes
<!-- 7. Privacy architecture --> <!-- 7. Privacy architecture -->
<section <section
class="slide" class="slide"
data-time="7:35–8:30"
data-notes="The public bundle has no VINs, plates, ZIPs, stations, technician identifiers, private tokens, raw JSON, credentials, operational records, or row-level predictions. The browser has no database connection and fails closed if its aggregate contract does not validate." data-notes="The public bundle has no VINs, plates, ZIPs, stations, technician identifiers, private tokens, raw JSON, credentials, operational records, or row-level predictions. The browser has no database connection and fails closed if its aggregate contract does not validate."
> >
<p class="eyebrow">Privacy architecture</p> <p class="eyebrow">Privacy architecture</p>
@@ -989,7 +964,6 @@ private read-only data
<!-- 8. Limitations --> <!-- 8. Limitations -->
<section <section
class="slide" class="slide"
data-time="8:30–9:20"
data-notes="Name the limitations directly: page-sampled cohort is not population-representative; feeds are partial and change over time; geography and source era are confounded; reject/abort do not necessarily mean mechanical failure; 2025 is a one-time development holdout, not external validation; and sample associations do not support county rankings or causal conclusions." data-notes="Name the limitations directly: page-sampled cohort is not population-representative; feeds are partial and change over time; geography and source era are confounded; reject/abort do not necessarily mean mechanical failure; 2025 is a one-time development holdout, not external validation; and sample associations do not support county rankings or causal conclusions."
> >
<p class="eyebrow">Limitations</p> <p class="eyebrow">Limitations</p>
@@ -1010,7 +984,6 @@ private read-only data
<!-- 9. Close --> <!-- 9. Close -->
<section <section
class="slide slide--close" class="slide slide--close"
data-time="9:20–10:00"
data-notes="The prototype is complete at the development stage: one precise question, a leakage-safe timeline, calibrated logistic regression as the final model, a boosted-tree benchmark, and a privacy-reviewed static dashboard. Its value is the discipline of making only the claims the data and release boundary can support. Invite questions about episode construction, calibration, privacy, or the dashboard — not county winners and losers." data-notes="The prototype is complete at the development stage: one precise question, a leakage-safe timeline, calibrated logistic regression as the final model, a boosted-tree benchmark, and a privacy-reviewed static dashboard. Its value is the discipline of making only the claims the data and release boundary can support. Invite questions about episode construction, calibration, privacy, or the dashboard — not county winners and losers."
> >
<p class="eyebrow">Close</p> <p class="eyebrow">Close</p>
@@ -1074,7 +1047,6 @@ private read-only data
); );
var total = slides.length; var total = slides.length;
var progress = document.getElementById("progress"); var progress = document.getElementById("progress");
var timecode = document.getElementById("timecode");
var counter = document.getElementById("counter"); var counter = document.getElementById("counter");
var prevBtn = document.getElementById("prev"); var prevBtn = document.getElementById("prev");
var nextBtn = document.getElementById("next"); var nextBtn = document.getElementById("next");
@@ -1115,7 +1087,6 @@ private read-only data
}); });
var active = slides[current]; var active = slides[current];
progress.style.width = ((current + 1) / total) * 100 + "%"; progress.style.width = ((current + 1) / total) * 100 + "%";
timecode.textContent = active.getAttribute("data-time") || "";
counter.textContent = current + 1 + " / " + total; counter.textContent = current + 1 + " / " + total;
notesText.textContent = active.getAttribute("data-notes") || "—"; notesText.textContent = active.getAttribute("data-notes") || "—";
prevBtn.disabled = current === 0; prevBtn.disabled = current === 0;