<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#0A2238">
<script>
/* Theme bootstrap — runs before paint to avoid flash. Default is "dark"
(set on the <html> tag literal). User preference in localStorage wins
if they've ever toggled. Auto = follow OS. */
(function() {
try {
var saved = localStorage.getItem('skyrun-theme');
if (saved === 'light' || saved === 'dark' || saved === 'auto') {
document.documentElement.setAttribute('data-theme', saved);
}
} catch (e) { / localStorage may be unavailable in private mode / }
})();
</script>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="SkyRun">
<link rel="manifest" href="manifest.webmanifest">
<title>SkyRun BD — May 9</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700;900&display=swap" rel="stylesheet">
<style>
/* ============================================================
SkyRun Brand Tokens — Phase 1 (sourced from SkyRun_Brand_Guide_FINAL_2023.pdf)
Palette: SkyRun Blue #006BA6 / Dark Blue #00487A / Yellow #FFC20E /
Green #4A9A43 / Black #2E3B42 / Light Grey #E7E7E4
Three theme modes: auto (default, follows OS) / light / dark.
Old variable names (--navy, --navy-dim, --navy-light, etc.) preserved
and remapped to SkyRun palette so existing CSS works unchanged.
============================================================ */
/ SkyRun-named tokens — same values across themes (brand identity) /
:root {
--sr-blue: #006BA6;
--sr-dark-blue: #00487A;
--sr-yellow: #FFC20E;
--sr-green: #4A9A43;
--sr-black: #2E3B42;
--sr-light-grey: #E7E7E4;
}
/ LIGHT mode (default + explicit) /
:root, [data-theme="light"] {
--navy: #00487A; / SkyRun Dark Blue (header background) /
--navy-dim: #006BA6; / SkyRun Blue (links, primary accents) /
--navy-light: #E0EEF5; / SkyRun Blue @ ~10% (subtle backgrounds) /
--text: #2E3B42; / SkyRun Black /
--text-dim: #5A6770;
--bg: #FAFBFC; / near-white /
--card-bg: #FFFFFF;
--border: #D8DEE3;
--green: #4A9A43; / SkyRun Green /
--yellow: #B8881A; / darker yellow for legible text on light /
--red: #C0392B;
--accent: #FFC20E; / SkyRun Yellow — primary brand accent /
--accent-text: #2E3B42; / black on yellow (brand-approved combo) /
--header-grad-start: #00487A;
--header-grad-end: #006BA6;
--shadow-card: 0 1px 2px rgba(46,59,66,0.04), 0 1px 3px rgba(46,59,66,0.06);
}
/* DARK mode (explicit) — KeyData-inspired depth, SkyRun Dark Blue family.
Page bg is darkened SkyRun Dark Blue; cards step up to true SkyRun Dark Blue.
Borders barely visible — depth comes from surface contrast, not lines. */
[data-theme="dark"] {
--navy: #006BA6; / SkyRun Blue lifted to primary accent /
--navy-dim: #3399D9; / SkyRun Blue brightened for inline links /
--navy-light: #143D5A; / mid-blue surface highlight /
--text: #F1F4F6; / near-white for high-contrast big numbers /
--text-dim: #8FA3B2;
--bg: #0A2238; / SkyRun Dark Blue darkened — page background /
--card-bg: #10334F; / SkyRun Dark Blue, normal — card surface /
--card-bg-elev: #15405F; / one step higher for hover/active /
--border: #1B4974; / near-invisible blue-tinted border /
--green: #22A66B; / solid status green /
--green-soft: #1A7F52;
--yellow: #FFC20E; / SkyRun Yellow stays vibrant /
--red: #E55B4A; / solid status red /
--red-soft: #B83A2A;
--accent: #FFC20E; / SkyRun Yellow /
--accent-text: #2E3B42;
--header-grad-start: #0A2238;
--header-grad-end: #103352;
--shadow-card: 0 1px 2px rgba(0,0,0,0.35), 0 2px 8px rgba(0,0,0,0.25);
}
/ AUTO mode — follows OS preference, mirrors dark tokens /
@media (prefers-color-scheme: dark) {
[data-theme="auto"] {
--navy: #006BA6;
--navy-dim: #3399D9;
--navy-light: #143D5A;
--text: #F1F4F6;
--text-dim: #8FA3B2;
--bg: #0A2238;
--card-bg: #10334F;
--card-bg-elev: #15405F;
--border: #1B4974;
--green: #22A66B;
--green-soft: #1A7F52;
--yellow: #FFC20E;
--red: #E55B4A;
--red-soft: #B83A2A;
--accent: #FFC20E;
--accent-text: #2E3B42;
--header-grad-start: #0A2238;
--header-grad-end: #103352;
--shadow-card: 0 1px 2px rgba(0,0,0,0.35), 0 2px 8px rgba(0,0,0,0.25);
}
}
/ Smooth transition between themes /
html { transition: background-color 200ms ease, color 200ms ease; }
body, header, details, .card, .chip { transition: background-color 200ms ease, border-color 200ms ease, color 200ms ease; }
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); }
body {
/ SkyRun brand typography: Avenir on Apple devices, Nunito Sans (geometric, Avenir-cousin) elsewhere /
font: 16px/1.5 'Avenir Next', 'Avenir', 'Nunito Sans', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
padding: env(safe-area-inset-top) env(safe-area-inset-right) 80px env(safe-area-inset-left);
min-height: 100vh;
-webkit-font-smoothing: antialiased;
letter-spacing: -0.005em;
}
header {
background: linear-gradient(135deg, var(--header-grad-start) 0%, var(--header-grad-end) 100%);
color: white;
padding: 18px 20px 18px;
position: sticky;
top: 0;
z-index: 10;
padding-top: calc(18px + env(safe-area-inset-top));
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
/ SkyRun signature: yellow + blue swoop, lifted from the Brand Guide /
header::before {
content: "";
position: absolute;
left: -10%; right: -10%; bottom: -36px; height: 56px;
background:
radial-gradient(ellipse 120% 50% at 50% 0%, rgba(255,194,14,0.18) 0%, transparent 60%),
radial-gradient(ellipse 80% 45% at 70% 0%, rgba(74,154,67,0.10) 0%, transparent 60%);
pointer-events: none;
}
header::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: 0; height: 3px;
background: linear-gradient(90deg, var(--sr-yellow) 0%, var(--sr-yellow) 35%, var(--sr-blue) 35%, var(--sr-blue) 100%);
}
header .header-row {
display: flex;
align-items: center;
gap: 12px;
position: relative;
z-index: 1;
}
header .logo {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
width: 44px; height: 44px;
background: white;
border-radius: 10px;
padding: 4px 6px;
box-shadow: 0 1px 3px rgba(0,0,0,0.15);
}
header .logo img { width: 100%; height: auto; display: block; }
header .title-block { flex: 1; min-width: 0; }
header h1 {
margin: 0;
font-size: 22px;
font-weight: 900;
letter-spacing: -0.02em;
line-height: 1.1;
}
header .meta {
margin-top: 3px;
font-size: 12px;
opacity: 0.85;
font-weight: 600;
letter-spacing: 0.02em;
}
header .theme-toggle {
flex-shrink: 0;
display: inline-flex;
align-items: center;
gap: 0;
background: rgba(255,255,255,0.14);
border: 1px solid rgba(255,255,255,0.18);
border-radius: 999px;
padding: 2px;
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
header .theme-toggle button {
appearance: none;
background: transparent;
border: 0;
color: rgba(255,255,255,0.75);
width: 28px; height: 28px;
border-radius: 999px;
cursor: pointer;
font-size: 14px;
line-height: 1;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background 150ms ease, color 150ms ease;
-webkit-tap-highlight-color: transparent;
}
header .theme-toggle button:hover { color: white; }
header .theme-toggle button[aria-pressed="true"] {
background: white;
color: var(--sr-dark-blue);
}
header .quick-stats {
display: flex;
gap: 8px;
margin-top: 12px;
font-size: 12px;
flex-wrap: wrap;
position: relative;
z-index: 1;
}
header .stat {
background: rgba(255,255,255,0.14);
border: 1px solid rgba(255,255,255,0.10);
padding: 4px 11px;
border-radius: 20px;
font-weight: 600;
letter-spacing: 0.01em;
}
/* ============================================================
KPI tile grid (KeyData-inspired). Lives in main content as the
top row. Each tile: tiny uppercase label / huge value / status pill.
Click jumps to the related section.
============================================================ */
.kpi-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(155px, 1fr));
gap: 12px;
margin: 0 0 14px;
}
.kpi-tile {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 14px;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 6px;
text-decoration: none;
color: inherit;
position: relative;
min-height: 100px;
box-shadow: var(--shadow-card);
transition: background 150ms ease, transform 100ms ease, border-color 150ms ease;
-webkit-tap-highlight-color: transparent;
}
.kpi-tile:hover, .kpi-tile:focus-visible {
background: var(--card-bg-elev, var(--card-bg));
transform: translateY(-1px);
border-color: var(--navy-dim);
outline: none;
}
.kpi-tile-label {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.09em;
text-transform: uppercase;
color: var(--text-dim);
line-height: 1.2;
}
.kpi-tile-value {
font-size: 28px;
font-weight: 900;
letter-spacing: -0.02em;
color: var(--text);
line-height: 1.05;
margin-top: 2px;
display: flex;
align-items: baseline;
gap: 7px;
flex-wrap: wrap;
}
.kpi-tile-value-sub {
font-size: 12px;
font-weight: 700;
color: var(--text-dim);
letter-spacing: 0.01em;
text-transform: uppercase;
}
.kpi-tile-pill {
display: inline-block;
align-self: flex-start;
padding: 3px 10px;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.03em;
margin-top: auto;
text-transform: uppercase;
}
.kpi-tile-pill-green { background: var(--green); color: white; }
.kpi-tile-pill-red { background: var(--red); color: white; }
.kpi-tile-pill-yellow{ background: var(--yellow);color: var(--accent-text); }
.kpi-tile-pill-info { background: var(--navy); color: white; }
.kpi-tile-pill-ghost { background: transparent; color: var(--text-dim); border: 1px solid var(--border); }
.kpi-tile-cta {
position: absolute;
right: 14px;
top: 14px;
font-size: 14px;
color: var(--text-dim);
opacity: 0.55;
transition: transform 150ms ease, opacity 150ms ease;
line-height: 1;
}
.kpi-tile:hover .kpi-tile-cta { transform: translateX(2px); opacity: 1; }
@media (max-width: 480px) {
.kpi-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
.kpi-tile { min-height: 86px; padding: 12px 14px; }
.kpi-tile-value { font-size: 22px; }
}
main { padding: 12px 16px 40px; }
section.panel { margin-bottom: 14px; }
/* ============================================================
SECTION MODULE CARDS — Phase 2B premium-grade revamp.
Goal: not "basic browser collapsible" but "SaaS platform module".
Visual ingredients:
· larger, weighted header bar with proper height + padding
· emoji icon scaled up; chevron inside a circular hit-target
· meta as right-aligned chip with proper tabular numerals
· subtle gradient at top of card surface for SaaS depth
· SkyRun-Yellow left rail when open (focus signal)
· Bigger card radius (16px), elevated shadow
· Body has divider, generous padding, internal hierarchy
============================================================ */
details {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 16px;
overflow: hidden;
margin-bottom: 14px;
box-shadow: var(--shadow-card);
transition: border-color 200ms ease, box-shadow 200ms ease, transform 150ms ease;
position: relative;
}
details::before {
/ subtle top-of-card highlight gradient for SaaS depth /
content: "";
position: absolute;
left: 0; right: 0; top: 0; height: 1px;
background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.06) 50%, transparent 100%);
pointer-events: none;
}
details:hover:not([open]) {
border-color: var(--navy-dim);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0,0,0,0.10), 0 8px 18px rgba(0,107,166,0.08);
}
details[open] {
border-color: var(--navy-dim);
box-shadow: 0 1px 2px rgba(0,0,0,0.10), 0 6px 18px rgba(0,107,166,0.10);
}
details > summary {
list-style: none;
cursor: pointer;
padding: 20px 22px;
font-size: 17px;
font-weight: 800;
color: var(--text);
letter-spacing: -0.015em;
display: flex;
align-items: center;
justify-content: flex-start;
gap: 12px;
user-select: none;
-webkit-user-select: none;
-webkit-tap-highlight-color: rgba(0,107,166,0.08);
position: relative;
min-height: 64px;
}
/* Scale up the leading emoji a touch — first-character size cue.
Native CSS can't selectively style the first emoji without DOM hooks,
so we lean on summary > emoji being followed by a space + text. */
details > summary {
/ font-feature: tabular numerals so the meta lines up cleanly /
font-variant-numeric: tabular-nums;
}
details > summary::-webkit-details-marker { display: none; }
/ Chevron rendered inside a circular hit-target on the right. /
details > summary::after {
content: "›";
color: var(--text-dim);
transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms ease, background 150ms ease;
font-size: 22px;
font-weight: 800;
line-height: 1;
width: 28px;
height: 28px;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
margin-left: 6px;
flex-shrink: 0;
}
details:hover:not([open]) > summary::after {
background: rgba(0,107,166,0.10);
color: var(--navy-dim);
}
details[open] > summary::after {
transform: rotate(90deg);
color: var(--accent-text);
background: var(--accent);
}
/ Brand-yellow left rail — only when open. Strong focus signal. /
details[open] > summary::before {
content: "";
position: absolute;
left: 0; top: 12px; bottom: 12px;
width: 3px;
background: var(--accent);
border-radius: 0 3px 3px 0;
}
/ Body — clear separation from header, generous padding, proper hierarchy. /
details > .body {
padding: 4px 22px 22px;
border-top: 1px solid var(--border);
padding-top: 18px;
background:
linear-gradient(180deg, rgba(0,0,0,0.06) 0%, transparent 14px),
var(--card-bg);
animation: detailsBodyIn 240ms cubic-bezier(0.2, 0, 0.2, 1);
}
@keyframes detailsBodyIn {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
/ Meta on the right side — proper chip-style affordance, not just dim text. /
details .summary-meta {
font-size: 12px;
font-weight: 700;
color: var(--text-dim);
margin-left: auto;
letter-spacing: 0.02em;
text-align: right;
padding: 5px 10px;
background: rgba(255,255,255,0.04);
border: 1px solid var(--border);
border-radius: 999px;
white-space: nowrap;
max-width: 60%;
overflow: hidden;
text-overflow: ellipsis;
}
[data-theme="light"] details .summary-meta { background: rgba(0,0,0,0.03); }
@media (prefers-color-scheme: light) {
[data-theme="auto"] details .summary-meta { background: rgba(0,0,0,0.03); }
}
/ Body internal hierarchy upgrade — make h3/h4 inside details feel platform-grade. /
details > .body h3 {
font-size: 14px;
font-weight: 800;
color: var(--text);
letter-spacing: 0.04em;
text-transform: uppercase;
margin: 22px 0 10px;
padding-bottom: 8px;
border-bottom: 1px solid var(--border);
}
details > .body h3:first-child { margin-top: 4px; }
details > .body p:first-of-type { margin-top: 0; }
/ Content styles /
h1, h2, h3, h4 { color: var(--text); letter-spacing: -0.01em; margin-top: 1.4em; margin-bottom: 0.4em; }
h1 { font-size: 22px; }
h2 { font-size: 19px; border-bottom: 1px solid var(--border); padding-bottom: 6px; }
h3 { font-size: 16px; color: var(--navy); }
p { margin: 0.6em 0; }
ul, ol { margin: 0.4em 0; padding-left: 22px; }
li { margin: 0.3em 0; }
a { color: var(--navy); text-decoration: none; }
a:hover { text-decoration: underline; }
code {
font: 13px/1.4 'SF Mono', Menlo, Monaco, Consolas, monospace;
background: var(--navy-light);
color: var(--text);
padding: 1px 6px;
border-radius: 4px;
}
pre {
background: var(--navy-light);
padding: 12px;
border-radius: 8px;
overflow-x: auto;
font-size: 12px;
}
pre code { background: none; padding: 0; }
blockquote {
border-left: 3px solid var(--navy);
padding: 4px 14px;
margin: 10px 0;
color: var(--text-dim);
background: var(--navy-light);
border-radius: 0 6px 6px 0;
}
hr { border: none; border-top: 1px solid var(--border); margin: 24px 0; }
strong { color: var(--text); font-weight: 700; }
.table-wrap { overflow-x: auto; margin: 1em 0; }
table {
border-collapse: collapse;
width: 100%;
font-size: 13px;
}
th { background: var(--navy); color: white; padding: 8px; text-align: left; font-weight: 600; }
td { padding: 8px; border-bottom: 1px solid var(--border); }
tr:nth-child(even) td { background: var(--navy-light); }
/ Cards (deals, tasks) /
.card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
}
.card h3 { margin: 0 0 8px; color: var(--text); font-size: 17px; }
.card dl { margin: 10px 0 0; font-size: 14px; }
.card dt { font-weight: 600; color: var(--text-dim); margin-top: 8px; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; }
.card dd { margin: 3px 0 0; color: var(--text); }
.card code { display: inline-block; margin: 4px 0; font-size: 11px; }
.chip {
display: inline-block;
padding: 3px 10px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
margin-right: 6px;
background: var(--navy-light);
color: var(--navy);
}
.chip.stage { background: var(--navy); color: white; }
.chip.commit { background: #d8eecc; color: var(--green); }
.chip.schedule { background: var(--navy-light); color: var(--navy); }
.chip.badge-red { background: #fde7ea; color: var(--red); }
.chip.badge-yellow { background: #fef3e0; color: var(--yellow); }
.chip.badge-info { background: var(--navy-light); color: var(--navy); }
.chip.age { background: transparent; color: var(--text-dim); font-weight: 500; }
/ Approvals /
.approval-channel { margin-bottom: 22px; }
.approval-channel h3 {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 0 10px;
font-size: 15px;
color: var(--text);
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
}
.approval-count {
background: var(--navy);
color: white;
font-size: 12px;
padding: 2px 9px;
border-radius: 12px;
font-weight: 700;
}
.approval-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 10px;
padding: 14px;
margin-bottom: 10px;
}
.approval-head { display: flex; gap: 6px; align-items: center; margin-bottom: 6px; }
.approval-card h4 { margin: 0 0 6px; font-size: 15px; color: var(--navy); }
.approval-context { margin: 0 0 10px; font-size: 13px; color: var(--text-dim); line-height: 1.45; }
.approval-link {
display: inline-block;
padding: 8px 14px;
background: var(--navy);
color: white !important;
text-decoration: none !important;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
}
.approval-link:active { opacity: 0.85; }
.approval-actions { display: flex; gap: 8px; align-items: center; }
.approval-dismiss {
background: transparent;
color: var(--text-dim);
border: 1px solid var(--border);
border-radius: 8px;
padding: 7px 14px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
font-family: inherit;
-webkit-tap-highlight-color: rgba(0,0,0,0.05);
}
.approval-dismiss:active { opacity: 0.7; }
.approval-dismiss.dismissing { opacity: 0.5; pointer-events: none; }
.approval-card.dismissed { display: none; }
.approval-thumbs {
background: transparent;
border: 1px solid var(--border);
border-radius: 8px;
padding: 6px 12px;
font-size: 16px;
cursor: pointer;
font-family: inherit;
line-height: 1;
-webkit-tap-highlight-color: rgba(0,0,0,0.05);
}
.approval-thumbs:active { opacity: 0.6; }
.approval-thumbs.submitted { background: var(--navy-light); border-color: var(--navy); }
/ Freshness badges + sync banner /
.fresh-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 10px;
font-size: 11px;
font-weight: 600;
margin-left: 8px;
vertical-align: middle;
white-space: nowrap;
}
.fresh-badge.fresh { background: rgba(47,158,68,0.12); color: #2f9e44; border: 1px solid rgba(47,158,68,0.3); }
.fresh-badge.aging { background: rgba(245,159,0,0.12); color: #f08c00; border: 1px solid rgba(245,159,0,0.3); }
.fresh-badge.stale { background: rgba(224,49,49,0.12); color: #e03131; border: 1px solid rgba(224,49,49,0.3); }
.sync-banner {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 10px;
padding: 10px 14px;
margin: 0 0 16px 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
font-size: 13px;
}
.sync-banner .sync-label { color: var(--text-dim); }
.sync-banner .sync-refresh {
background: var(--navy); color: white; border: none; border-radius: 8px;
padding: 6px 12px; font-size: 12px; font-weight: 600; cursor: pointer; font-family: inherit;
-webkit-tap-highlight-color: rgba(0,0,0,0.05);
}
.sync-banner .sync-refresh:active { opacity: 0.8; }
.sync-banner .sync-refresh.refreshing { opacity: 0.5; pointer-events: none; }
/ Quick-capture floating button + panel /
.capture-fab {
position: fixed;
bottom: 24px;
right: 24px;
width: 56px;
height: 56px;
border-radius: 28px;
background: var(--navy);
color: white;
font-size: 28px;
border: none;
box-shadow: 0 4px 12px rgba(0,0,0,0.25);
cursor: pointer;
z-index: 1000;
-webkit-tap-highlight-color: transparent;
}
.capture-fab:active { opacity: 0.85; }
.capture-fab.recording { background: #e03131; animation: pulse 1.5s infinite; }
@keyframes pulse { 0% { box-shadow: 0 4px 12px rgba(224,49,49,0.4); } 50% { box-shadow: 0 4px 20px rgba(224,49,49,0.8); } 100% { box-shadow: 0 4px 12px rgba(224,49,49,0.4); } }
.capture-panel {
position: fixed;
bottom: 92px;
right: 24px;
width: 320px;
max-width: calc(100vw - 48px);
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 14px;
box-shadow: 0 8px 24px rgba(0,0,0,0.25);
z-index: 1000;
display: none;
}
.capture-panel.open { display: block; }
.capture-panel textarea {
width: 100%;
min-height: 80px;
border: 1px solid var(--border);
border-radius: 8px;
padding: 10px;
font-family: inherit;
font-size: 14px;
background: var(--bg);
color: var(--text);
resize: vertical;
}
.capture-panel .capture-actions { display: flex; gap: 8px; margin-top: 10px; justify-content: space-between; align-items: center; }
.capture-panel .capture-status { font-size: 12px; color: var(--text-dim); }
.capture-panel button.capture-send {
background: var(--navy); color: white; border: none; border-radius: 8px;
padding: 8px 16px; font-size: 14px; font-weight: 600; cursor: pointer; font-family: inherit;
}
.capture-panel button.capture-send:disabled { opacity: 0.4; }
.capture-panel button.capture-mic {
background: transparent; border: 1px solid var(--border); border-radius: 8px;
padding: 6px 10px; font-size: 16px; cursor: pointer; font-family: inherit;
}
.capture-panel button.capture-mic.recording { background: #ffe3e3; border-color: #e03131; }
/ Graph insights /
.graph-person {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 10px 14px;
margin-bottom: 8px;
}
.graph-person-role { color: var(--text-dim); font-size: 12px; margin-top: 3px; }
.graph-person-chips { margin-top: 6px; }
.graph-person-chips .chip { margin-right: 4px; margin-top: 3px; }
/ System Health /
.health-overall { margin: 0 0 14px; font-size: 15px; }
.health-grid { display: grid; gap: 8px; }
.health-row {
display: grid;
grid-template-columns: auto 1fr auto;
grid-template-areas: "emoji task when" "emoji detail detail";
gap: 4px 10px;
padding: 10px 12px;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
font-size: 13px;
align-items: center;
}
.health-row.red { border-left: 3px solid var(--red); }
.health-row.yellow { border-left: 3px solid var(--yellow); }
.health-row.green { border-left: 3px solid var(--green); }
.health-emoji { grid-area: emoji; font-size: 18px; }
.health-row code { grid-area: task; font-size: 12px; }
.health-when { grid-area: when; color: var(--text-dim); font-size: 11px; font-variant-numeric: tabular-nums; }
.health-detail { grid-area: detail; color: var(--text-dim); font-size: 12px; line-height: 1.4; }
.empty { color: var(--text-dim); font-style: italic; padding: 20px 0; }
/ Meetings /
.meetings { list-style: none; padding: 0; }
.meetings li { padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 14px; }
.meetings .date {
display: inline-block;
font-size: 12px;
color: var(--text-dim);
width: 90px;
font-variant-numeric: tabular-nums;
}
/ Memory tab /
.mem-cat { margin-top: 24px; color: var(--navy); border-bottom: 1px solid var(--border); padding-bottom: 6px; }
.memory-list { list-style: none; padding: 0; }
.memory-list li { margin: 10px 0; }
.memory-list a { display: block; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px; }
.memory-list strong { display: block; margin-bottom: 4px; color: var(--navy); }
.memory-list .desc { display: block; color: var(--text-dim); font-size: 13px; line-height: 1.4; }
/ Reports /
.reports { list-style: none; padding: 0; }
.reports li { margin: 8px 0; }
.reports a { display: block; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px; }
/ Responsive /
@media (min-width: 700px) {
body { max-width: 900px; margin: 0 auto; }
}
</style>
</head>
<body>
<header>
<div class="header-row">
<div class="logo" aria-hidden="true">
<img src="skyrun_logo.png" alt="SkyRun">
</div>
<div class="title-block">
<h1>SkyRun BD</h1>
<div class="meta">Joseph Bowens · Director of BD · Saturday, May 9</div>
</div>
<span id="sr-freshness-pill" class="sr-freshness-pill" data-as-of="" title="Brief data as-of">data —</span>
<div class="theme-toggle" role="group" aria-label="Theme">
<button type="button" data-theme-set="auto" aria-label="Auto theme" title="Auto (follow device)">◐</button>
<button type="button" data-theme-set="light" aria-label="Light theme" title="Light">☀</button>
<button type="button" data-theme-set="dark" aria-label="Dark theme" title="Dark">☾</button>
</div>
</div>
</header>
<script>
/ Theme toggle: reflects current state, updates on click, persists. /
(function() {
var root = document.documentElement;
var buttons = document.querySelectorAll('.theme-toggle button[data-theme-set]');
function syncPressed() {
var current = root.getAttribute('data-theme') || 'auto';
buttons.forEach(function(btn) {
btn.setAttribute('aria-pressed', btn.getAttribute('data-theme-set') === current ? 'true' : 'false');
});
}
buttons.forEach(function(btn) {
btn.addEventListener('click', function() {
var mode = btn.getAttribute('data-theme-set');
root.setAttribute('data-theme', mode);
try { localStorage.setItem('skyrun-theme', mode); } catch (e) {}
syncPressed();
});
});
syncPressed();
})();
</script>
<main>
<div class="kpi-grid" aria-label="At-a-glance metrics">
<a class="kpi-tile" href="#health">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">System</div>
<div class="kpi-tile-value">🔴<span class="kpi-tile-value-sub">RED</span></div>
<span class="kpi-tile-pill kpi-tile-pill-red">red</span>
</a>
<a class="kpi-tile" href="#approvals">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">Pending</div>
<div class="kpi-tile-value">87<span class="kpi-tile-value-sub">items</span></div>
<span class="kpi-tile-pill kpi-tile-pill-yellow">6 channels</span>
</a>
<a class="kpi-tile" href="#brief">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">Last Brief</div>
<div class="kpi-tile-value">11:10PM<span class="kpi-tile-value-sub">May 7</span></div>
<span class="kpi-tile-pill kpi-tile-pill-ghost">42h old</span>
</a>
<a class="kpi-tile" href="#deals">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">Active Deals</div>
<div class="kpi-tile-value">8<span class="kpi-tile-value-sub">in pipeline</span></div>
<span class="kpi-tile-pill kpi-tile-pill-info">open</span>
</a>
<a class="kpi-tile" href="#tasks">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">Tasks</div>
<div class="kpi-tile-value">7<span class="kpi-tile-value-sub">scheduled</span></div>
<span class="kpi-tile-pill kpi-tile-pill-green">running</span>
</a>
<a class="kpi-tile" href="#deals">
<span class="kpi-tile-cta">›</span>
<div class="kpi-tile-label">Pipeline EV</div>
<div class="kpi-tile-value">—<span class="kpi-tile-value-sub">30-day</span></div>
<span class="kpi-tile-pill kpi-tile-pill-ghost">no forecast</span>
</a>
</div>
<div class="sync-banner" id="syncBanner">
<span class="sync-label">
🔄 Last synced 11:14 AM · brief <span class="fresh-badge stale" title="36.1h ago">🔴 36.1h ago</span> · graph <span class="fresh-badge aging" title="36.1h ago">🟡 36.1h ago</span> · approvals <span class="fresh-badge aging" title="2.7h ago">🟡 2.7h ago</span> · health <span class="fresh-badge fresh" title="0m ago">🟢 0m ago</span>
</span>
<button class="sync-refresh" id="syncRefresh" onclick="location.reload()" title="Force reload — picks up latest deploy">↻ Reload</button>
</div>
<details id="approvals" open>
<summary>✅ Approvals<span class="summary-meta">— 87 pending across 6 channels<span class="fresh-badge aging" title="2.7h ago">🟡 2.7h ago</span></span></summary>
<div class="body">
<div class="approval-channel">
<h3>✉️ Direct drafts<span class="approval-count">23</span></h3>
<article class="approval-card" data-id="direct-drafts-2026-05-04-kennedy-income-estimate" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Needs-review: Robert Kennedy — fresh website income-estimate inquiry (905 Cranmer Ave Fraser, 2BR/2.5BA + hot tub)</h4>
<p class="approval-context">Inbound SkyRun.app form submission — Robert Kennedy (713-816-6328, robertkennedy@ymail.com), 905 Cranmer Ave Fraser CO 80442, Condo 2BR/2.5BA, Building Hot Tub: Yes, Sleeps Above Avg: Yes. System auto-estimate: $22,600/yr ($21,470-$23,730 range). NOT in SoT (fresh lead). DNC: clean. Form went to Joseph + Rachel + Bryan — coordinate on who replies. Joseph's standard play: brief warm reply + propose discovery call + hint at higher SkyRun comp range vs the conservative auto-estimate. Not auto-draft</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#inbox/19df4fa970976349" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-04-kennedy-income-estimate" data-channel="direct_drafts">Dismiss</button>
<button class="approval-thumbs up" data-id="direct-drafts-2026-05-04-kennedy-income-estimate" data-rating="up" title="Good draft — Joseph would say this">👍</button>
<button class="approval-thumbs down" data-id="direct-drafts-2026-05-04-kennedy-income-estimate" data-rating="down" title="Off — wrong tone, wrong content, or shouldn't have drafted">👎</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-07-hadank-checkpoint-reply" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Needs-review: Andy Hadank — Re: Snowblaze B-32 walkthrough (May 7 checkpoint reply)</h4>
<p class="approval-context">Andy replied 6:18 PM MDT (00:18Z 5/8) to Joseph's 5/6 update. Visible content: 'Very thorough and greatly appreciated. I exchanged messages with Brian already and will be back in touch with him early next week. I'll reach out to Jeremy (thank you for the additional referral)…' (snippet truncated at ~200 char limit — full body likely has more, possibly questions or commitments not visible). Active deal, high stakes — flagging for direct review rather than auto-drafting on partial body. Suggested </p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#inbox/19dd09dfee7f38b0" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-07-hadank-checkpoint-reply" data-channel="direct_drafts">Dismiss</button>
<button class="approval-thumbs up" data-id="direct-drafts-2026-05-07-hadank-checkpoint-reply" data-rating="up" title="Good draft — Joseph would say this">👍</button>
<button class="approval-thumbs down" data-id="direct-drafts-2026-05-07-hadank-checkpoint-reply" data-rating="down" title="Off — wrong tone, wrong content, or shouldn't have drafted">👎</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-pankratz-beaver-brook" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Needs-review: Mike Pankratz — Income estimate request via SkyRun.app form</h4>
<p class="approval-context">New inbound prospect via SkyRun website estimator form (no-reply@skyrun.com auto-form, CC'd to Joseph + Rachel + Bryan). Mike Pankratz (mjpankratz@gmail.com / 703-635-9509) requested an income estimate for 39 Beaver Brook Trl, Fraser CO 80442 — 3BR/2.5BA single family with hot tub, king bed, covered parking, top-floor cathedral ceilings, sleeps more-than-average. SkyRun's form auto-estimate: $51,072–$56,448. DNC-clean, not in master inventory (new lead). Reply isn't possible to no-reply sender; </p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#inbox/19e0947c84083872" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-pankratz-beaver-brook" data-channel="direct_drafts">Dismiss</button>
<button class="approval-thumbs up" data-id="direct-drafts-2026-05-08-pankratz-beaver-brook" data-rating="up" title="Good draft — Joseph would say this">👍</button>
<button class="approval-thumbs down" data-id="direct-drafts-2026-05-08-pankratz-beaver-brook" data-rating="down" title="Off — wrong tone, wrong content, or shouldn't have drafted">👎</button>
</div>
</article>
<article class="approval-card" data-id="draft-backfilled-48e99065" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Next postcard round — 75 recipients ready</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/r-5199708678271306521" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="draft-backfilled-48e99065" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="pending-memory-20260429-skyrun-website-url" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Memory: SkyRun Grand County website is skyrun.com/grand-county (not winterpark.skyrun.com)</h4>
<p class="approval-context">Per Jasmine 4/29: the canonical SkyRun Grand County URL is skyrun.com/grand-county. Joseph's email signature still references the old winterpark.skyrun.com — needs updating in Gmail signature settings AND in any skill/memory references that emit signature blocks.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="pending-memory-20260429-skyrun-website-url" data-channel="direct_drafts">Dismiss</button>
<button class="approval-thumbs up" data-id="pending-memory-20260429-skyrun-website-url" data-rating="up" title="Good draft — Joseph would say this">👍</button>
<button class="approval-thumbs down" data-id="pending-memory-20260429-skyrun-website-url" data-rating="down" title="Off — wrong tone, wrong content, or shouldn't have drafted">👎</button>
</div>
</article>
<article class="approval-card" data-id="qb-redraft-devine-may4-confirm-2026-04-29T21:03:31Z" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to Ryan Devine: Mon May 4 2:30pm MT confirm + Meet link</h4>
<p class="approval-context">CORRECTED 21:11Z. Original QB redraft (21:03Z) said 2:30pm MT — wrong. Actual anchor per Apr 29 14:48Z Ryan reply '4pm your time' + Joseph 14:49Z confirm + Kim 15:05Z RSVP. Kim is already on the 4pm thread. Companion calendar action: create Google Meet event for Mon May 4 4:00pm MT, invite rdevine@vizance.com + kdevinehomes@gmail.com.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="qb-redraft-devine-may4-confirm-2026-04-29T21:03:31Z" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="draft-backfilled-6ecc6488" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Approve alt-email rotation for R037540</h4>
<p class="approval-context">Hard bounce on joe_a_richardson@hotmail.com; joseph@insurance-concepts.com; jrichardson@geico.com. Alt available: joe_a_richardson@hotmail.com (source=HS, captured=legacy, confidence=low). Approve to swap, or dismiss to remove from campaign.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="draft-backfilled-6ecc6488" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcard-handoff-2026-05-04" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Next postcard round — 150 recipients ready</h4>
<p class="approval-context">150 recipients · SWITCH-only · WP 95 / Fraser 27 / Granby 11 / Tabernash 9 / Grand Lake 8 · score 65-135 (median 85) · 60d cooldown · DNC-clean</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/r9179873533517216756" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="postcard-handoff-2026-05-04" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postmortem-deal-schulze_555_columbine-2026-05-04" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Postmortem — Schulze / 555 Columbine — LOST</h4>
<p class="approval-context">Operator-vetoed close 2026-05-02 (stalled 10d post-discovery; advisory drafts unactioned). HOT-tier inbound paid-search lead went silent — what should have de-rated this?</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postmortem-deal-schulze_555_columbine-2026-05-04" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postmortem-deal-surganty_basecamp_402-2026-05-04" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Postmortem — Surganty / Basecamp #402 — LOST</h4>
<p class="approval-context">Operator-vetoed close 2026-05-02 after 3.5-month silence post 'wants numbers' inbound. 18d in stale_check_needed; close target 5/1 passed. Lessons for stale-decay scoring?</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postmortem-deal-surganty_basecamp_402-2026-05-04" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcard-handoff-2026-05-05" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Postcard handoff — 150 recipients ready (Round 4 / mixed SWITCH+HOT)</h4>
<p class="approval-context">Postcard-ledger weekly run produced 150 fresh-eligible recipients (85 SWITCH + 65 HOT). 60-day cooldown excluded the 150 leads from the May 4 batch. File ready in Postcard Rounds folder; attach manually before sending.</p>
<div class="approval-actions">
<a class="approval-link" href="file:///Users/josephbowens/Desktop/SkyRun/Postcard Rounds/Next_Postcard_Round_2026-05-05.xlsx" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="postcard-handoff-2026-05-05" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="sdw-2026-05-06-hadank-may7-checkin" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Snowblaze B-32 — May 7 check-in</h4>
<p class="approval-context">Andy,
Tomorrow's the May 7 check-in we set. Quick state of play before I send anything formal:
- Mgmt agreement template — I'll get this to you this week so you can read it over before any sign date.
- Grand Lake / Granby contractor names — still pulling together; will follow up separately once I've got a clean list.
- Brian Wilhan (970-783-7459) you should already have from the 4/27 note.
Anything new on contractor quotes or HOA on the loft? If you want to push our checkpoint a few days whil</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="sdw-2026-05-06-hadank-may7-checkin" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="sdw-2026-05-06-chris-hart-checkin" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>308 Balsam — quick update</h4>
<p class="approval-context">Chris,
Good talking last week — wanted to check in. I'm working with Rachel on the benchmarking I mentioned, comparing 308 Balsam against a couple of recent Granby comps. Should have something to share with you in the next several days.
Anything change on your end since we talked? Feel free to send any questions while I get the numbers buttoned up.
Best,
Joseph
Joseph Bowens
Director | Business Development
SkyRun Vacation Rentals — Grand County
Mobile: 970-817-8700 | Joseph.Bowens@SkyRun.com</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="sdw-2026-05-06-chris-hart-checkin" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="sdw-2026-05-06-pole-creek-vendor-decision-followup" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Quick check on the next step</h4>
<p class="approval-context">Kina + Danny,
Hope the projection landed cleanly on Tuesday. No rush either way — your week, your call.
If anything in the numbers raised more questions than it answered, send them over and I'll walk through them with you. And if you and Danny have already landed on something different, totally fair — just let us know either way.
Memorial Day's about three weeks out. If listing-live is still the target and we're not the fit, I'd rather know now so we can release the hold on launch prep than k</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="sdw-2026-05-06-pole-creek-vendor-decision-followup" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="draft-commitment-fd13e628ac45-20260506T143717Z" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Tom Cummings — best way to reach him?</h4>
<p class="approval-context">Hey Andy,
Coming back to the Tom Cummings intro — I told you I'd get in touch with him last week and the week got away from me on a few prospect cycles. Want to make good on that this week.
Do you have his email or cell, or a preferred way for me to reach out? Happy to send a short note introducing myself and the SkyRun setup, no pressure either way on his side.
Thanks again for keeping me in mind.
Joseph</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="draft-commitment-fd13e628ac45-20260506T143717Z" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="draft-commitment-d4779885a0eb-20260506T143717Z" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>wholesale leads — quick handoff ask</h4>
<p class="approval-context">Hey Rachel,
Wanted to put this in writing in case it didn't fully come up in the sync yesterday. As I keep ramping the BD lane, I'd like to take wholesale leads off your plate and run them through my pipeline end-to-end — discovery, projection, close, handoff to ops. Mike and I have been working on tightening the wholesale playbook in our 1:1s and I'd rather you not be the catch-net for those anymore.
If that works for you, easiest version is: anything that comes in on the wholesale side gets </p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="draft-commitment-d4779885a0eb-20260506T143717Z" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-06-pyle-230-buckhorn-saturday-queue" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to Trevor Pyle: Re: 230 Buckhorn — projection + 15-min agreement walkthrough (QUEUED for Sat 5/9 send)</h4>
<p class="approval-context">Hi Trevor, Joseph here — Director of BD with Rachel at SkyRun. She asked me to pick up where she left off on 230 Buckhorn. I know your week is packed (Rachel mentioned weekends work better), so no pressure on timing — just wanted to be your single point of contact going forward and see what's still open on the owner agreement + homeowner guide she sent over. Two things I can do right now to make this easier: 1. Send you a stabilized revenue projection... 2. Walk you through the agreement on a 15</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19dfe060b5bea9b6" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-06-pyle-230-buckhorn-saturday-queue" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-pyle-230-buckhorn-rewrite" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to Trevor Pyle: Re: 230 Buckhorn (hand-curated rewrite, edited 5/8)</h4>
<p class="approval-context">Re: 230 Buckhorn — hand-curated rewrite of the 5/6 queued draft. Edited 2026-05-08 14:51Z. Replaces the older draft 19dfe060b5bea9b6 (which carried the QUEUED FOR SAT 5/9 marker). Recipient: Trevor Pyle (warm lead per project_warm_leads_trevor_elle.md). Same thread (19dd602744690c65) — Rachel→Trevor 4/28 + Joseph follow-up sequence.</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19e0812709a0d178" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-pyle-230-buckhorn-rewrite" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postmortem-deal-tim_beegle_hi_country-2026-05-08" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Postmortem — Tim Beegle / Hi Country Haus #23-1 — LOST</h4>
<p class="approval-context"># Postmortem — Tim Beegle / 357 Hi Country Haus #23-1 — LOST
Deal: Tim Beegle / 357 Hi Country Drive #23-1 (Hi Country Haus, Winter Park)
Closed: 2026-04-27 (Rachel-vetoed)
Annual value: N/A (never priced — vetoed before discovery)
Lead source: Other Referral (Brooke Chillemi forward)
Commission class: Other Referral / $700
Time-to-close: Hours (inbound 4/27 → veto 4/27 21:38Z)
Touches: 0 outbound (drafted but discarded)
---
Pre-filled context (review + edit)
-</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postmortem-deal-tim_beegle_hi_country-2026-05-08" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-hadank-checkpoint-may-7-reply" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to hadank@gmail.com: Re: Snowblaze B-32 — items from our walkthrough</h4>
<p class="approval-context">Andy, Quick check-in as we'd planned. Hope your contractor calls have been coming together. Where things stand on my end: 1. Management agreement — attached. Take a read; agreement signs once you...</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19e090a4f37d7f8a" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-hadank-checkpoint-may-7-reply" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-rachel-wholesale-leads-handoff" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to rachel@skyrun.com: Wholesale leads — handoff approach</h4>
<p class="approval-context">Rachel, Couple days late on this — wanted to put something in writing on how we handle the wholesale-leads pipeline going forward so I'm not the bottleneck. My read: anything that comes in via Glenda, Daniela, or the reamaze inbound...</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19e090a5ada91c47" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-rachel-wholesale-leads-handoff" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-kina-pole-creek-may-11-hold" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to kinacan2020@gmail.com: Re: Following up after Wednesday (HOLD UNTIL 5/11)</h4>
<p class="approval-context">[HOLD UNTIL MON 2026-05-11 — DO NOT SEND BEFORE THEN PER POLE-CREEK STATUS RECOMMENDATION; IF KINA REPLIES BEFORE THEN, DISCARD] Kina, Hope you and Danny had a chance to read through the...</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19e090a65a71cda4" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-kina-pole-creek-may-11-hold" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="direct-drafts-2026-05-08-pyle-230-buckhorn-v3" data-channel="direct_drafts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Draft to tnp.trev1@gmail.com: Re: 230 Buckhorn (v3 — newest)</h4>
<p class="approval-context">Trevor, Joseph here — Rachel asked me to pick up the 230 Buckhorn thread. She mentioned weekends work better for you, so don't worry about a quick turnaround. Two pieces from her earlier sends are...</p>
<div class="approval-actions">
<a class="approval-link" href="https://mail.google.com/mail/u/0/#drafts/19e090a6f6381d94" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="direct-drafts-2026-05-08-pyle-230-buckhorn-v3" data-channel="direct_drafts">Dismiss</button>
</div>
</article>
</div>
<div class="approval-channel">
<h3>📧 SmartLead<span class="approval-count">4</span></h3>
<article class="approval-card" data-id="action-bridge-2026-05-07T23-32-50-097Z_fcsh0c" data-channel="smartlead">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="action-bridge-2026-05-07T23-32-50-097Z_fcsh0c" data-channel="smartlead">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="action-bridge-2026-05-07T23-44-57-294Z_7udpro" data-channel="smartlead">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="action-bridge-2026-05-07T23-44-57-294Z_7udpro" data-channel="smartlead">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="action-bridge-2026-05-07T23-44-54-400Z_zylrqx" data-channel="smartlead">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="action-bridge-2026-05-07T23-44-54-400Z_zylrqx" data-channel="smartlead">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="action-bridge-2026-05-08T03-14-55-576Z_lbnfqs" data-channel="smartlead">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="action-bridge-2026-05-08T03-14-55-576Z_lbnfqs" data-channel="smartlead">Dismiss</button>
</div>
</article>
</div>
<div class="approval-channel">
<h3>📬 Postcards<span class="approval-count">5</span></h3>
<article class="approval-card" data-id="postcards-auto-1ea2943c14fb" data-channel="postcards">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postcards-auto-1ea2943c14fb" data-channel="postcards">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcards-batch-2026-04-28-scout" data-channel="postcards">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>New scout discoveries ready: 30 new postcard targets (4 HOT, 9 WARM, 17 NURTURE)</h4>
<p class="approval-context">Scout run 2026-04-28 1620 added 30 new postcard targets from EagleWeb saleSearch (last 30 days of warranty deeds >= $200K). New R-numbers: R310549 (HOT, Devils Thumb $8M), R305616 (HOT, Granby Ranch 5BR), R027170 (HOT, Trail Creek Trust), R304373 (HOT, Granby Ranch 4BR), plus 9 WARM and 17 NURTURE. Total Postcard Targets tab now 839 rows (was 809). Postcard-ledger Monday run will fold these into the next Jasmine batch automatically.</p>
<div class="approval-actions">
<a class="approval-link" href="file:///Users/josephbowens/Desktop/SkyRun/Prospecting%20%26%20Leads/STR%20Engine%20Archive/Grand_County_STR_Engine_v3.5_filtered.xlsx" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="postcards-batch-2026-04-28-scout" data-channel="postcards">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcards-batch-2026-05-04-scout" data-channel="postcards">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>New scout discovery: 1 HOT postcard target (R313386 / 20 Wheeler Rd / Sojourn at Idlewild)</h4>
<p class="approval-context">Scout run 2026-05-04 added R313386 KOVALY CHRISTOPHER J + CAPUANO MEGAN J — fresh-purchase 04/21/2026 $1.219M townhome in Sojourn at Idlewild, Pennsylvania OOS owner. HOT score 75. Deferred from 4/30 report and pushed standalone per 4/30 deferral note. Total Postcard Targets tab now 840 rows (was 839). Postcard-ledger Monday run will fold this into the next Jasmine batch automatically.</p>
<div class="approval-actions">
<a class="approval-link" href="file:///Users/josephbowens/Desktop/SkyRun/Prospecting%20%26%20Leads/STR%20Engine%20Archive/Grand_County_STR_Engine_v3.5_filtered.xlsx" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="postcards-batch-2026-05-04-scout" data-channel="postcards">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcards-auto-108e63bfefba" data-channel="postcards">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postcards-auto-108e63bfefba" data-channel="postcards">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="postcards-auto-5f5bb5645534" data-channel="postcards">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="postcards-auto-5f5bb5645534" data-channel="postcards">Dismiss</button>
</div>
</article>
</div>
<div class="approval-channel">
<h3>🔄 SmartLead actions<span class="approval-count">20</span></h3>
<article class="approval-card" data-id="smartlead_actions-auto-1c7418d10619" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-1c7418d10619" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-c8fd31d6de4f" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-c8fd31d6de4f" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-3a79033f42e6" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-3a79033f42e6" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-a6edc42f4b34" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-a6edc42f4b34" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-568682fbb5ac" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-568682fbb5ac" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-a9fc721d262c" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-a9fc721d262c" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-e415833cec89" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-e415833cec89" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-1e223c312116" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-1e223c312116" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-049b6c936c3e" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-049b6c936c3e" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-bf22c3dfcdf3" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-bf22c3dfcdf3" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-d015b47cda01" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-d015b47cda01" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-a0b1f61f3cf3" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-a0b1f61f3cf3" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-e2b725c36768" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-e2b725c36768" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-97fe5da4e14e" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-97fe5da4e14e" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-e9aa6282b896" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-e9aa6282b896" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-3e69302d63ab" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-3e69302d63ab" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-da7ff7f31039" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-da7ff7f31039" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-d51b2579e629" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-d51b2579e629" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-b755a564d15d" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-b755a564d15d" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="smartlead_actions-auto-eeee4256cd7f" data-channel="smartlead_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="smartlead_actions-auto-eeee4256cd7f" data-channel="smartlead_actions">Dismiss</button>
</div>
</article>
</div>
<div class="approval-channel">
<h3>✅ Meeting actions<span class="approval-count">25</span></h3>
<article class="approval-card" data-id="devine-calendar-invite-2026-05-04" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Send Google Meet calendar invite — Ryan & Kim Devine — Mon May 4 4pm MT</h4>
<p class="approval-context">Ryan + Kim Devine confirmed Monday May 4 at 4pm MT for the Granby Ranch projections call (3 properties). Joseph committed in thread 19dd5458c0991649: 'That works. I'll get it on our calendars.' Action: send Meet invite to RDevine@vizance.com + kdevinehomes@gmail.com.</p>
<div class="approval-actions">
<a class="approval-link" href="https://calendar.google.com/calendar/u/0/r/eventedit" target="_blank" rel="noopener">Open →</a>
<button class="approval-dismiss" data-id="devine-calendar-invite-2026-05-04" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>(no title)</h4>
<p class="approval-context"></p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="meeting_actions-auto-93a8b6e3387f" data-channel="meeting_actions">Dismiss</button>
</div>
</article>
</div>
<div class="approval-channel">
<h3>📁 Drive sorts<span class="approval-count">10</span></h3>
<article class="approval-card" data-id="drive-sort-1777908474-dryrun-setup" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Move dry_run_setup.sh → SkyRun/_inbox/ (uncertain)</h4>
<p class="approval-context">Found on ~/Desktop top-level. Filename matches the 5/2 Adam dry-run install proof project — likely SkyRun infra setup script, but uncertain scope (could be one-off scratch).</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-1777908474-dryrun-setup" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-1777908474-ambient-venture" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Review Ambient_Venture_Plan.pdf — SkyRun or personal? (uncertain)</h4>
<p class="approval-context">Found on ~/Desktop top-level. 'Ambient' may refer to the Cowork/productization workstream (referenced in disaster recovery / incident runbook memory), but could also be a personal venture doc. No filename match for SkyRun, GC towns, or known prospects/owners. Flagging for review — no destination proposed.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-1777908474-ambient-venture" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-20260508-204600-run-skyrun-patches" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-yellow">YELLOW</span>
</div>
<h4>Move RUN_SKYRUN_PATCHES.command → SkyRun/_inbox/</h4>
<p class="approval-context">Found at ~/Desktop/RUN_SKYRUN_PATCHES.command. Signals: filename contains 'SKYRUN' (strong SkyRun signal); .command file = shell script Joseph likely dropped as a one-off patch runner. Unclassifiable into existing subfolders (not invoice/agreement/transcript/property-deliverable/research) — proposing _inbox for manual sort.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-20260508-204600-run-skyrun-patches" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-2026-04-24T14:59:20Z-arc-invoice-006-duplicate" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Delete duplicate Arc_Invoice_2026_006_SkyRun.pdf from Downloads</h4>
<p class="approval-context">Found ~/Downloads/Arc_Invoice_2026_006_SkyRun.pdf (84,648 bytes, Apr 24 08:35). Identical copy already exists at SkyRun/Invoices/Arc_Invoice_2026_006_SkyRun.pdf (Apr 23 12:26). Downloads copy is a duplicate — safe to delete. No move needed; canonical version is already in place.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-2026-04-24T14:59:20Z-arc-invoice-006-duplicate" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-1777392428-lot113-evergreen-leavebehind" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move SkyRun_Lot113Evergreen_LeaveBehind.pdf → SkyRun/Property Deliverables/Lot_113_Evergreen/</h4>
<p class="approval-context">Found in ~/Downloads/. Signals: filename starts with 'SkyRun', references 'Lot113Evergreen' (property), 'LeaveBehind' is a known SkyRun deliverable type. Proposed destination creates new property folder.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-1777392428-lot113-evergreen-leavebehind" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-20260429-1205-gc-hotwarm-tier-report" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move GC_— HOT+WARM Tier Sequence Report.csv → SkyRun/Prospecting & Leads/</h4>
<p class="approval-context">Found in ~/Downloads/. Signals: 'GC' (Grand County abbreviation) + 'HOT+WARM Tier Sequence' (SmartLead campaign 3184605). SmartLead export CSV. Proposed destination: Prospecting & Leads/.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-20260429-1205-gc-hotwarm-tier-report" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-20260429T2007Z-branding-zip" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move Branding-20260429T194500Z-3-002.zip → SkyRun/Brand & Marketing/</h4>
<p class="approval-context">Found in /Users/josephbowens/Desktop/. Signals: filename starts with 'Branding' (Brand & Marketing keyword), 229MB Drive export bundle. Proposed destination: /Users/josephbowens/Desktop/SkyRun/Brand & Marketing/.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-20260429T2007Z-branding-zip" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-20260430-160800-103reserveway-pdf" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move SkyRun_103ReserveWay_LeaveBehind.pdf → SkyRun/Property Deliverables/103 Reserve Way/</h4>
<p class="approval-context">Found in ~/Downloads/. Signals: filename contains 'SkyRun' + '103ReserveWay' (matches active deal: Weber / 103 Reserve Way; LeaveBehind PDF was sent to Stephen Weber on 4/30 9:36 MDT per memory). Proposed destination: /Users/josephbowens/Desktop/SkyRun/Property Deliverables/103 Reserve Way/.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-20260430-160800-103reserveway-pdf" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-1777908474-whitney-leavebehind" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move SkyRun_109DeerTrackCt_LeaveBehind.pdf → Property Deliverables/Whitney_109_Deer_Track_Ct/</h4>
<p class="approval-context">Found in ~/Downloads. Strong SkyRun signals: filename starts with 'SkyRun', references 109 Deer Track Ct (Whitney Yeddis active referral, R-property in Grand County). Destination folder already exists.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-1777908474-whitney-leavebehind" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
<article class="approval-card" data-id="drive-sort-1778176008-pole-creek-leavebehind" data-channel="drive_sorts">
<div class="approval-head">
<span class="chip badge-info">INFO</span>
</div>
<h4>Move SkyRun_492MountainPeakRd_LeaveBehind.pdf → Property Deliverables/Kina_Danny_Pole_Creek_Meadows/</h4>
<p class="approval-context">Found in ~/Downloads (mtime 2026-05-06). Strong SkyRun signals: filename starts with SkyRun, references 492 Mountain Peak Rd (Kina + Danny Pole Creek Meadows active deal, R203880, Tabernash). Destination subfolder already exists.</p>
<div class="approval-actions">
<button class="approval-dismiss" data-id="drive-sort-1778176008-pole-creek-leavebehind" data-channel="drive_sorts">Dismiss</button>
</div>
</article>
</div>
</div>
</details>
<details id="brief" open>
<summary>📋 Morning Brief<span class="summary-meta">— May 7, 11:10 PM<span class="fresh-badge stale" title="36.1h ago">🔴 36.1h ago</span></span></summary>
<div class="body">
<h1>Good morning, Joseph — Fri 2026-05-08</h1>
<h2>📅 Meetings in the next 24h</h2>
<p>_No external meetings._ The 10:30 MDT "Joseph / Adam — Sales Catch Up" is on the calendar but Adam declined ("out of office"). Treat as cancelled unless he reschedules.</p>
<h2>Today's 3 priorities</h2>
<ol>
<li><strong>🔴 Hadank trash audit — verify the 5/6 management-agreement send actually landed.</strong> Three outbound emails on 5/6 (21:02 / 21:05 / 21:38 UTC, subject "Re: Snowblaze B-32 — items from our walkthrough") are sitting in Trash. Sent folder shows zero outbound to <code>hadank@gmail.com</code> after 5/5. If the agreement didn't reach Andy, you need to resend today — checkpoint was ~May 7 and the deal has gone silent since 4/28. Open the trashed thread, confirm what happened, then either restore-from-trash or resend cleanly.</li>
<li><strong>🔴 Devine reschedule — push for new times.</strong> Ryan declined the May 11 2pm MT slot at 15:18Z yesterday; you replied 16:08Z asking for new windows. If silent >48h, draft a soft nudge with 2-3 specific options (week of May 11/18, around your Adam touchpoint). Don't let this slip past the 5/8-9 decision window without a refresh touch.</li>
<li><strong>Stale-queue cleanup</strong> — <code>pending_smartlead_actions.jsonl</code> has 16 items pending >7d (R302155 + R306624 stuck since 4/28 per flag #69). Drain in PWA or dismiss explicitly. <code>pending_hs_updates.jsonl</code> carries 29 stale Weber/Chris Hart entries — same pattern.</li>
</ol>
<h2>Inbox signals from yesterday</h2>
<ul>
<li><strong>Signed contracts:</strong> 0</li>
<li><strong>Prospect replies needing response:</strong> 1 — Ryan Devine (<code>RDevine@vizance.com</code>) declined the May 11 meeting. Already replied 16:08Z asking for new windows; awaiting his counter-offer.</li>
<li><strong>Realtor correspondence:</strong> 0</li>
<li><strong>Internal team:</strong> 0 inbound; your 5/6 outbound to Jasmine + Rachel re: postcard round (150 recipients) ended up trashed by 5/7 — likely intentional cleanup after they confirmed receipt, but worth noting alongside the Hadank trash anomaly.</li>
<li><strong>Delivery issues:</strong> 0</li>
<li><strong>Industry / vendor:</strong> 1 — VRMA newsletter (INFO)</li>
</ul>
<h2>Overnight movement</h2>
<ul>
<li>Memory: <code>project_active_deal_devine.md</code> updated with 5/7 decline + reschedule status</li>
<li>Graph: +2 communication relationships (Devine in/out), +1 deal stage_history note, recency stats refreshed for 43 people</li>
<li>PWA stale-drain: 1 closed-lost reference archived from <code>pending_drafts.jsonl</code></li>
<li>BV (12:09Z): 19 attempts → 0 OK / 19 no_match (View-button wedge persists)</li>
<li>DQ (13:03Z): GREEN — SoT 866, HS 865/866 matched, SL 209/209 ok</li>
</ul>
<h2>Active deals</h2>
<ul>
<li><strong>Hadank / Snowblaze B-32</strong> — <code>qualifiedtobuy</code> (Discovery col); last verified Sent touch 4/28 (may-closer); 🔴 5/6 trash audit needs verification before claiming agreement was delivered</li>
<li><strong>Devine / Granby Ranch (3 props)</strong> — <code>discovery_complete_2nd_meeting_reschedule_pending</code>; 🔴 reschedule pending; Ryan's gut → P1 (866 Black Feather)</li>
<li><strong>Weber / 103 Reserve Way</strong> — projection sent 4/30; Steven traveling, follow-up week of 5/12</li>
<li><strong>Whitney Yeddis / 109 Deer Track Ct</strong> — projection sent 5/1; awaiting buyer reply</li>
<li><strong>Chris Hart / 308 Balsam</strong> — discovery_complete 4/27; benchmarking owed; no movement today</li>
<li><strong>Kina+Danny / Pole Creek Meadows</strong> — discovery 4/29; Memorial Day listing-live target; no movement today</li>
</ul>
<h2>💰 Pipeline forecast</h2>
<div class="table-wrap"><table>
<thead><tr>
<th>Window</th>
<th>Expected commission</th>
<th>Δ vs last week</th>
</tr></thead><tbody>
<tr>
<td>Next 30 days</td>
<td>$29,697</td>
<td>$0</td>
</tr>
<tr>
<td>Next 90 days</td>
<td>$59,394</td>
<td>$0</td>
</tr>
<tr>
<td>Full pipeline (all open)</td>
<td>$98,990</td>
<td>$0</td>
</tr>
</tbody></table></div>
<p>Tier breakdown: HOT 144 @ 20% ($28.8K) · WARM 197 @ 10% ($19.7K) · NURTURE 202 @ 5% ($10.1K) · LOW 62 @ 2% ($1.2K) · SWITCH 261 @ 15% ($39.2K)</p>
<p>Flat — no SoT movement (last scout 5/4; next 5/11). Real movement requires a closed deal to recompute close-rate seeds.</p>
<h2>📈 Revenue pulse (yesterday)</h2>
<ul>
<li><strong>Track:</strong> 4/74 units occupied (5.4%) · 1 check-in / 1 check-out (per <code>extract-track-metrics</code> 23:30Z)</li>
<li><strong>KeyData 7d trend:</strong> Portfolio ADR $218 vs market ADR $250; market avg/door $4,197 (per <code>extract-keydata-metrics</code> 23:06Z)</li>
<li><strong>Your portfolio vs comps:</strong> ~$32 below market ADR per night</li>
</ul>
<h2>🫀 Systems status — YELLOW</h2>
<ul>
<li>🟡 BV — wedge unresolved (19 attempts, 0 OK today)</li>
<li>🟡 transcript-scan — skipped (no new transcripts) but warnings logged</li>
<li>🟡 sl-to-hs-email-sync — 176 missing engagements detected; HS Settings UI fix still pending operator action</li>
<li>🟢 DQ, gmail-deep-scan, system-hygiene, qb-quarterback all green</li>
</ul>
<h2>Open loops worth noting</h2>
<ul>
<li>Mgmt agreement template send to Andy (committed 4/27 "this week" — 12 days open; 5/6 trashed sends suggest a recent attempt that may have failed)</li>
<li>Grand Lake / Granby contractor names to Andy ("in next day or two" 4/27 — 12 days open)</li>
<li>Tom Cummings outreach (committed 4/27 — open; research first per memory)</li>
<li>Chris Hart benchmarking (Rachel-coached 19th Hole + Indian Trail comp set)</li>
</ul>
<h2>🩸 R-23: 46 memory claims flagged for source verification</h2>
<p>Linter caught 46 high-risk un-cited claims this run (top: <code>project_skill_maintenance_flags.md</code> 11 · <code>project_rachel_in_flight_work.md</code> 4 · <code>project_vp_marketing_active.md</code> 4). Review queue at <code>~/Library/Application Support/SkyRun/health/memory_claim_review_queue.json</code>. Under the YELLOW threshold of 50 — heartbeat stays <code>ok</code> — but the trend warrants a sweep when you have a quiet hour.</p>
<h2>Flags</h2>
<ul>
<li>🔴 Hadank 5/6 trash → mgmt agreement delivery uncertain</li>
<li>🔴 Devine reschedule pending</li>
<li>🟡 BV wedge persists</li>
<li>🟡 SL→HS engagement logging gap (176 missing)</li>
</ul>
<p>— consolidated at 23:01 MDT, informed by 4 gmail-scans today</p>
</div>
</details>
<details id="deals" open>
<summary>🔥 Active Deals<span class="summary-meta">— 8 open</span></summary>
<div class="body">
<h3>Active deals</h3>
<article class="card">
<h3>Hadank / Snowblaze B-32 switch</h3>
<div class="chip stage">discovery_complete_post_walkthrough</div>
<div class="chip commit">35% verbal</div>
<dl>
<dt>Lead ID</dt><dd>R194580</dd>
<dt>Last touch</dt><dd>2026-04-30</dd>
<dt>Next action</dt><dd>Walkthrough done 4/23, post-walkthrough emails sent. Joseph still owes mgmt agreement template + GL/Granby contractor names. Checkpoint May 7. NO CONTRACT SENT — verified live HS 2026-05-02 02:50Z. The 2026-04-30 contract-sent notification was a false-positive from deal_sync.py mapping bug (now fixed) that propagated into KG until the 5/1 evening watchdog detected the drift.</dd>
</dl>
</article>
<article class="card">
<h3>Weber / 103 Reserve Way</h3>
<div class="chip stage">projection_sent_awaiting_reply</div>
<dl>
<dt>Last touch</dt><dd>2026-04-28</dd>
<dt>Next action</dt><dd>Joseph emails Track + KeyData rental projection (TODAY)</dd>
</dl>
</article>
<article class="card">
<h3>deal:devine_granby_ranch</h3>
<div class="chip stage">discovery_complete_followup_may11_2pm_mt</div>
<dl>
<dt>Last touch</dt><dd>2026-05-05</dd>
<dt>Next action</dt><dd>Await Ryan response on 30% clarification. If silent ≥48h, send gentle nudge. Begin May 11 prep — hybrid responsibilities one-pager + P1 reconciliation owed by 5/8.</dd>
</dl>
</article>
<article class="card">
<h3>deal:chris_hart_308_balsam</h3>
<div class="chip stage">discovery_complete</div>
<dl>
<dt>Last touch</dt><dd>2026-04-27</dd>
<dt>Next action</dt><dd>Joseph: complete Chris Hart benchmarking comp (19th Hole + Indian Trail data from Rachel) and send written info per BD-meeting commitment.</dd>
</dl>
</article>
<article class="card">
<h3>Trevor Pyle / 230 Buckhorn (warm re-engaged)</h3>
<div class="chip stage">warm_re_engagement_documents_previously_sent</div>
<dl>
<dt>Last touch</dt><dd>2026-04-28</dd>
<dt>Next action</dt><dd>Wait for Trevor reply (5 biz days = ~5/5). If silent, Joseph polite check-in. If reply → Joseph property-specific intel jump-in. Rachel norm: 'better on weekends'.</dd>
</dl>
</article>
<article class="card">
<h3>Elle Koagedal / Tabernash House (warm re-engaged switch)</h3>
<div class="chip stage">warm_re_engagement_switch_prospect</div>
<dl>
<dt>Last touch</dt><dd>2026-04-28</dd>
<dt>Next action</dt><dd>Wait for Elle reply (5 biz days = ~5/5). If silent, Joseph polite check-in. If reply → Joseph property-specific intel jump-in.</dd>
</dl>
</article>
<article class="card">
<h3>Kina + Danny / Pole Creek Meadows (492 Mountain Peak Rd)</h3>
<div class="chip stage">discovery_complete_active_vendor_decision_pending</div>
<div class="chip commit">50% verbal</div>
<dl>
<dt>Last touch</dt><dd>2026-04-29</dd>
</dl>
</article>
<article class="card">
<h3>deal:whitney_yeddis_109_deer_track</h3>
<div class="chip stage">projection_sent_awaiting_reply</div>
<dl>
<dt>Last touch</dt><dd>2026-05-05</dd>
</dl>
</article>
<h3>Recent meetings</h3>
<ul class="meetings">
<li><span class="date">2026-05-05</span> Devine / Granby Ranch — Ryan net-revenue question (inbound)</li>
<li><span class="date">2026-05-04</span> grand-county-property-scout 5/4 weekly fire — pushed R313386 standalone</li>
<li><span class="date">2026-05-04</span> Devine / Granby Ranch — projections call (1st meeting)</li>
<li><span class="date">2026-05-01</span> Joseph/Mike weekly 1:1 coaching call</li>
<li><span class="date">2026-04-30</span> Kina + Danny — Pole Creek Meadows value-based post-discovery followup (SENT)</li>
<li><span class="date">2026-04-29</span> Pole Creek Meadows / Kina + Danny intro call (RESCHEDULED from 4/28 2pm)</li>
<li><span class="date">2026-04-28</span> BD weekly — Joseph + Rachel (Tue 11:30 standing)</li>
<li><span class="date">2026-04-28</span> Weber 103 Reserve Way — projection rebuild (Rachel pushback → Lakota anchor → customer send)</li>
<li><span class="date">2026-04-27</span> Steven Weber walkthrough — 103 Reserve Way</li>
<li><span class="date">2026-04-27</span> meeting:chris-hart-discovery-2026-04-27</li>
</ul>
<h3>Graph summary</h3>
<div class="card">
<dl>
<dt>People</dt><dd>43</dd>
<dt>Properties</dt><dd>11</dd>
<dt>Systems</dt><dd>17</dd>
<dt>Campaigns</dt><dd>3</dd>
<dt>Relationships</dt><dd>180</dd>
<dt>Last consolidated</dt><dd>2026-05-08T05:07:16.217970+00:00</dd>
<dt>Scope</dt><dd>Grand County, CO only. Vermont on hold pending possible sale of that book of business.</dd>
</dl>
</div>
</div>
</details>
<details id="relationships">
<summary>🕸 Relationships<span class="summary-meta">— 43 people in graph<span class="fresh-badge aging" title="36.1h ago">🟡 36.1h ago</span></span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">Who's hot, who's dormant, who to re-engage. Refreshed nightly by consolidation Section I.</p>
<h3>🔗 Most connected people</h3>
<div class="graph-person">
<strong>Joseph Bowens</strong>
<div class="graph-person-role">Director of Business Development</div>
<div class="graph-person-chips"><span class="chip age">105 connections</span> <span class="chip age">last seen 2026-05-07</span></div>
</div>
<div class="graph-person">
<strong>Rachel Scott</strong>
<div class="graph-person-role">GM / Owner</div>
<div class="graph-person-chips"><span class="chip age">42 connections</span> <span class="chip age">last seen 2026-05-04</span></div>
</div>
<div class="graph-person">
<strong>Andy Hadank</strong>
<div class="graph-person-role">Property owner / Prospect</div>
<div class="graph-person-chips"><span class="chip age">13 connections</span> <span class="chip age">last seen 2026-04-28</span></div>
</div>
<div class="graph-person">
<strong>Ryan Devine</strong>
<div class="graph-person-role">Prospect — Granby Ranch (multi-property)</div>
<div class="graph-person-chips"><span class="chip age">13 connections</span> <span class="chip age">last seen 2026-05-07</span></div>
</div>
<div class="graph-person">
<strong>Adam Fleckles</strong>
<div class="graph-person-role">BD Expert / Mentor</div>
<div class="graph-person-chips"><span class="chip age">9 connections</span> <span class="chip age">last seen 2026-04-30</span></div>
</div>
</div>
</details>
<details id="health">
<summary>🫀 System Health<span class="summary-meta">— 🔴 RED<span class="fresh-badge fresh" title="0m ago">🟢 0m ago</span></span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">Heartbeat status of all scheduled tasks over the last 48h. RED = missed run or error. YELLOW = partial success or warnings.</p>
<p class="health-overall">🔴 Overall: <strong>RED</strong></p>
<div class="health-grid">
<div class="health-row yellow">
<span class="health-emoji">🟡</span>
<code>daily-beenverified-enrichment</code>
<span class="health-when">1.2d ago</span>
<span class="health-detail">Partial success</span>
</div>
<div class="health-row yellow">
<span class="health-emoji">🟡</span>
<code>daily-data-quality-check</code>
<span class="health-when">1.2d ago</span>
<span class="health-detail">Partial success</span>
</div>
<div class="health-row red">
<span class="health-emoji">🔴</span>
<code>transcript-scan</code>
<span class="health-when">19.2h ago</span>
<span class="health-detail">No heartbeat in 19.2h (max 8h)</span>
</div>
<div class="health-row green">
<span class="health-emoji">🟢</span>
<code>gmail-deep-scan</code>
<span class="health-when">2.2h ago</span>
<span class="health-detail">Idle run — 0 new threads since 2026-05-08T23:02:28Z; 6/6 current Gmail drafts already tracked in pen</span>
</div>
<div class="health-row green">
<span class="health-emoji">🟢</span>
<code>grand-county-property-scout</code>
<span class="health-when">4.6d ago</span>
<span class="health-detail">Refresh heartbeat post-fortification — last scout (5/4 11:45Z) successfully pushed R313386. Operatio</span>
</div>
<div class="health-row red">
<span class="health-emoji">🔴</span>
<code>nightly-consolidation</code>
<span class="health-when">1.5d ago</span>
<span class="health-detail">No heartbeat in 36.2h (max 36h)</span>
</div>
<div class="health-row green">
<span class="health-emoji">🟢</span>
<code>historical-gmail-backfill</code>
<span class="health-when">10.3d ago</span>
<span class="health-detail">Backfill already complete (2026-04-24, 590 msgs / 4 runs). No-op until re-enabled.</span>
</div>
</div>
</div>
</details>
<details id="activity-dashboard">
<summary>📊 Activity Dashboard<span class="summary-meta">— full velocity view</span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">All emails / deals / meetings / leads / system health, since you started, with monthly trends. Pulls from HS + SoT + heartbeats.</p>
<p style="margin-top:8px"><a href="/activity.html" style="display:inline-block;background:var(--accent);color:white;padding:10px 16px;border-radius:6px;text-decoration:none;font-weight:600">Open Activity Dashboard →</a></p>
</div>
</details>
<details id="tasks">
<summary>⏱ Scheduled Tasks<span class="summary-meta">— 7 running</span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">The full ambient fleet — runs in the background whether you're here or not.</p>
<article class="card task">
<h3>daily-beenverified-enrichment</h3>
<div class="chip schedule">6am daily</div>
<code>0 6 *</code>
<p>BV contact enrichment — 20 leads/day (blocked at credit cap, soft-fails)</p>
</article>
<article class="card task">
<h3>daily-data-quality-check</h3>
<div class="chip schedule">7am daily</div>
<code>0 7 *</code>
<p>SoT ↔ HubSpot ↔ SmartLead reconciliation</p>
</article>
<article class="card task">
<h3>transcript-scan</h3>
<div class="chip schedule">8am/12pm/4pm daily</div>
<code>0 8,12,16 *</code>
<p>Gmail + local sweep for new SkyRun transcripts</p>
</article>
<article class="card task">
<h3>gmail-deep-scan</h3>
<div class="chip schedule">9am/1pm/5pm/10pm daily</div>
<code>0 9,13,17,22 *</code>
<p>Categorize inbox, download attachments, surface insights</p>
</article>
<article class="card task">
<h3>grand-county-property-scout</h3>
<div class="chip schedule">Mondays 6am</div>
<code>0 6 1</code>
<p>Weekly STR property discovery + enrichment + push</p>
</article>
<article class="card task">
<h3>nightly-consolidation</h3>
<div class="chip schedule">11pm daily</div>
<code>0 23 *</code>
<p>Roll up day → upsert graph → write morning brief + refresh PWA</p>
</article>
<article class="card task">
<h3>historical-gmail-backfill</h3>
<div class="chip schedule">3am daily (one-time, self-disabling)</div>
<code>0 3 *</code>
<p>Backfill entire Gmail archive — ~250 msgs/run, resumable</p>
</article>
</div>
</details>
<details id="costs">
<summary>💰 Subscription & Usage<span class="summary-meta">— ~$10/mo net</span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">What this system costs to run and where usage sits against free-tier caps.</p>
<div class="card">
<h4>Net-new monthly cost</h4>
<dl>
<dt>Cloudflare Registrar (josephbowens.com)</dt><dd>$0.76/mo ($9.15/yr)</dd>
<dt>Cloudflare Pages / KV / Functions / Access</dt><dd>$0 (free tier, well under caps)</dd>
<dt>ntfy.sh push</dt><dd>$0 (free, unlimited personal use)</dd>
<dt><strong>TOTAL net-new</strong></dt><dd><strong>~$0.76/mo = $9.15/yr</strong></dd>
</dl>
</div>
<div class="card">
<h4>Existing BD-adjacent subscriptions</h4>
<dl>
<dt>BeenVerified Starter</dt><dd>$9.99/mo — 🔴 currently exhausted (upgrade path: Premium $89.99/mo)</dd>
<dt>Claude Code</dt><dd>pre-existing Joseph subscription</dd>
<dt>SmartLead</dt><dd>pre-existing SkyRun subscription</dd>
<dt>HubSpot</dt><dd>pre-existing SkyRun corporate tier (CRM only — sequences decommissioned)</dd>
</dl>
</div>
<div class="card">
<h4>Free-tier headroom</h4>
<dl>
<dt>Cloudflare Pages builds</dt><dd>~60/mo of 500/mo allowed</dd>
<dt>Cloudflare KV ops/day</dt><dd>~200/day of 100,000/day allowed</dd>
<dt>Cloudflare Access users</dt><dd>1 of 50 allowed</dd>
<dt>ntfy.sh</dt><dd>No limit hit (informal ~100/day/topic)</dd>
</dl>
<p style="font-size: 12px; color: var(--text-dim); margin-top: 10px;">Full breakdown: see <code>reference_subscription_costs.md</code></p>
</div>
</div>
</details>
<details id="reports">
<summary>📁 Consolidation Reports<span class="summary-meta">— 25 archived</span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">Nightly archive. Each captures graph diffs, memory changes, inbox signals, active deal status, and flags.</p>
<ul class="reports">
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-08.md">2026-05-08 — 2026-05-08.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-07.md">2026-05-07 — 2026-05-07.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-06_0501.md">2026-05-06 — 2026-05-06_0501.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-06_0425.md">2026-05-06 — 2026-05-06_0425.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-06.md">2026-05-06 — 2026-05-06.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-05_midday.md">2026-05-05 — 2026-05-05_midday.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-05_2030.md">2026-05-05 — 2026-05-05_2030.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-05_1810.md">2026-05-05 — 2026-05-05_1810.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-05_1725.md">2026-05-05 — 2026-05-05_1725.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-04_evening.md">2026-05-04 — 2026-05-04_evening.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-04.md">2026-05-04 — 2026-05-04.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-03.md">2026-05-03 — 2026-05-03.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-02.md">2026-05-02 — 2026-05-02.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-05-01.md">2026-05-01 — 2026-05-01.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-30_midday.md">2026-04-30 — 2026-04-30_midday.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-30.md">2026-04-30 — 2026-04-30.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-29.md">2026-04-29 — 2026-04-29.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-28_overnight.md">2026-04-28 — 2026-04-28_overnight.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-28.md">2026-04-28 — 2026-04-28.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-27.md">2026-04-27 — 2026-04-27.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-26.md">2026-04-26 — 2026-04-26.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-25.md">2026-04-25 — 2026-04-25.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-24.md">2026-04-24 — 2026-04-24.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-23.md">2026-04-23 — 2026-04-23.md</a></li>
<li><a href="file:///Users/josephbowens/Desktop/SkyRun/Consolidation Reports/2026-04-21.md">2026-04-21 — 2026-04-21.md</a></li>
</ul>
</div>
</details>
<details id="memory">
<summary>🧠 Project Memory<span class="summary-meta">— 122 files</span></summary>
<div class="body">
<p style="color: var(--text-dim); font-size: 13px;">The facts that every Claude session starts with. Organized by type.</p>
<h3 class="mem-cat">User (4)</h3>
<ul class="memory-list">
<li><a href="/memory/user_contact_info"><strong>User contact info (critical phone + email rule)</strong><span class="desc">970-817-8700 is the ONLY phone number that goes on any SkyRun-related material, ever. Joseph.Bowens@SkyRun.com is the only email.</span></a></li>
<li><a href="/memory/user_market_focus"><strong>Current market focus — Grand County, CO only</strong><span class="desc">Joseph's sole active market is SkyRun Grand County; Vermont is on hold pending a possible sale of that book of business</span></a></li>
<li><a href="/memory/user_persona_stack_context"><strong>Joseph's Claude persona stack (exec-team-as-a-tool)</strong><span class="desc">Joseph operates six distinct Cowork exec personas plus the main SkyRun project — each with its own scope and memory (count corrected 2026-04-30; was wrong "five" in original frontmatter despite body always listing six personas + main)</span></a></li>
<li><a href="/memory/user_role"><strong>User role and identity</strong><span class="desc">Joseph Bowens is Director of BD for SkyRun Grand County, contracted via Arc Consulting Services LLC, reporting to Rachel Scott</span></a></li>
</ul>
<h3 class="mem-cat">Feedback (22)</h3>
<ul class="memory-list">
<li><a href="/memory/RULES"><strong>RULES — master registry, impossible-to-miss enforcement</strong><span class="desc">Single registry of every rule in the system. Each rule has (1) statement, (2) behavioral test ("if about to violate, abort"), (3) enforcement mechanism (gate/script/assertion). Read before any action. Gate-proof verifies every rule has working enforcement. All rules are non-negotiable — hence rules.</span></a></li>
<li><a href="/memory/feedback_annualrevenue_is_commission"><strong>HubSpot annualrevenue field stores commission amount, NOT purchase price</strong><span class="desc">annualrevenue was repurposed to hold $1,000 (Bowens Sourced) or $700 (other) — purchase price lives in lead_source_notes as PP:######</span></a></li>
<li><a href="/memory/feedback_check_prior_decisions_before_drafting"><strong>Check Rachel/Joseph prior decisions before drafting outreach</strong><span class="desc">Before drafting an intro/discovery/follow-up reply to ANY prospect, the agent MUST search Gmail + active-deal memory files for prior decisions on that prospect (especially Rachel-vetoes or Joseph closed-lost calls). Hardwired 2026-05-02 after Tim Beegle Brooke-forward bypassed Rachel's 4/27 "this is a no" and an agent drafted a 30% pitch reply not knowing about the veto.</span></a></li>
<li><a href="/memory/feedback_commission_messaging"><strong>Commission rate messaging — 30% in outreach, never 35%</strong><span class="desc">SkyRun's advertised flat rate is 30%; the ability to flex to 35% is a negotiation tool only, never in cold outreach</span></a></li>
<li><a href="/memory/feedback_deliverable_lever_design"><strong>Rental projection deliverables — one big number, levers exposed, single-estimate format</strong><span class="desc">Rachel prefers ONE big stabilized number led with up-front, no multi-year split, levers (ADR/Booked Nights) directly editable. Updated 2026-04-27 with Devine + Weber feedback.</span></a></li>
<li><a href="/memory/feedback_do_what_is_asked_thoroughly"><strong>Do what's asked thoroughly, first time — Joseph notices shortcuts</strong><span class="desc">Joseph has twice called out half-measures explicitly; the pattern is to complete specified tasks fully rather than bail early with a partial result</span></a></li>
<li><a href="/memory/feedback_drafting_standard"><strong>Email drafting standard — read everything first</strong><span class="desc">Before drafting any email on Joseph's behalf, pull full thread history, sent mail to that person, relevant transcripts, and any live documents. Never draft off partial context.</span></a></li>
<li><a href="/memory/feedback_ea_voice"><strong>Live-EA voice calibration from Joseph's feedback</strong><span class="desc">Accumulated lessons from thumbs-up/down on live-ea drafts. Live-ea reads this before drafting every run. Updated weekly by nightly-consolidation Section H.</span></a></li>
<li><a href="/memory/feedback_email_status_verification"><strong>Email status verification — sent vs draft, verify before asserting</strong><span class="desc">Before claiming any email was sent (or saying "this was already sent"), verify via Gmail MCP directly. Never trust transcript-scan notes, queue entries, file metadata, or chat-history references alone.</span></a></li>
<li><a href="/memory/feedback_freshness_before_surface"><strong>Freshness before surface</strong><span class="desc">Never surface "overdue" or "needs action" items to Joseph based on stale ledger data without first re-checking the underlying source-of-truth channels.</span></a></li>
<li><a href="/memory/feedback_hs_engagement_logging_broken"><strong>HS Email engagement logging — VERIFIED + RECONCILED (2026-05-05 update)</strong><span class="desc">Final state — SL→HS engagement logging IS working through alias-via-Gmail integration. 2026-05-05 sl-to-hs-email-sync cron run confirmed: 67 of 80 Gmail-path candidates (84%) already logged in HS as Email engagements; 13 had no HS contact (shared-email pairs); 0 missing → 0 created. BCC dropbox + alias-via-Gmail path is the working ingestion path. The 5/4 baseline gap of 82 (24%) measured pre-2026-04-26 sends; everything since has been logging cleanly. Continuous engagement-reconciler runs every 30 min to detect any future regression. PROOF 17 in gate-proof verifies the reconciler stays alive.</span></a></li>
<li><a href="/memory/feedback_hs_reconciliation_method"><strong>HubSpot reconciliation uses lead_source_notes ID-tokens, not trackingsource</strong><span class="desc">HS v3 API treats trackingsource as filter-works/read-fails; lead_source_notes ID-token parsing is the canonical SoT↔HS reconciliation method</span></a></li>
<li><a href="/memory/feedback_hs_scope_joseph_only"><strong>HS scope — Joseph-owned ONLY (Day-One rule, explicitly hardwired 2026-05-04)</strong><span class="desc">Never read, modify, create, delete, or assign-ownership of any HubSpot contact NOT owned by Joseph (hubspot_owner_id = 88361194). Includes unowned contacts. Day-One rule. Behavioral test — any HS query returning >918 contacts has a missing scope filter.</span></a></li>
<li><a href="/memory/feedback_hs_stage_source_of_truth"><strong>HS deal stage — current API state is sole source of truth</strong><span class="desc">When determining a deal's CURRENT stage, query HS live (/api/crm/v3/objects/deals/{id}?properties=dealstage). DO NOT infer stage from email notifications, calendar events, or transcript content — those are HISTORICAL evidence and may reflect reverted/false-positive states. Hardwired 2026-05-01 after the Hadank double-false-positive.</span></a></li>
<li><a href="/memory/feedback_lead_dedup_before_add"><strong>Always dedup before adding any new lead</strong><span class="desc">Before inserting a lead into SoT or HubSpot, check the master inventory JSONs by address AND lead_id</span></a></li>
<li><a href="/memory/feedback_never_skip_source"><strong>Never skip an enrichment source — explicit Joseph rule (Grand County)</strong><span class="desc">Joseph stated on 2026-04-20 that Grand County enrichment must hit all 6 sources; partial is a failure state</span></a></li>
<li><a href="/memory/feedback_no_fabrication_personal"><strong>No-fabrication discipline (binds the agent, not just scheduled tasks)</strong><span class="desc">Personal source-verify rule for the agent itself. Every factual claim — date, day-of-week, dollar figure, message ID, person's name, quote, status, file path — AND every referential resolution (which draft, which lead, which file the user means) gets verified against an authoritative source BEFORE emit. No agreeable hedging. No prose continuity. No working-memory inference for tool-accessible artifacts. Hardwired 2026-04-30 after the agent shipped multiple fabrications under Joseph's name in a single session, then re-offended that same afternoon by inferring "which draft Joseph meant" from working-memory salience instead of looking.</span></a></li>
<li><a href="/memory/feedback_persona_handoff_pattern"><strong>User pattern — exec-persona Cowork handoff prompt</strong><span class="desc">When Joseph "onboards" a new Claude persona, he wants a comprehensive handoff doc, not a fresh restart</span></a></li>
<li><a href="/memory/feedback_rachel_deliverable_rules"><strong>Rachel's deliverable rules — single source of truth (HARDCODED, validated pre-ship)</strong><span class="desc">Every piece of Rachel feedback on client-facing deliverables (PDFs, PPTXs, XLSXs, projection emails). Sourced verbatim from Rachel emails / BD-meeting notes with date + thread citation. Each rule has a mechanical check that runs in skyrun-builder/scripts/validate_deliverable.py before any artifact is shipped. NO deliverable goes out without passing all checks.</span></a></li>
<li><a href="/memory/feedback_smartlead_sot_parity"><strong>SoT must contain 100% of SmartLead leads (standing order)</strong><span class="desc">Any lead that exists in SmartLead campaigns must also exist in the SoT master workbook — no exceptions</span></a></li>
<li><a href="/memory/feedback_stay_green_discipline"><strong>Stay-green discipline — heartbeat status classification rules</strong><span class="desc">How skills should classify their heartbeat status. Prevents yellow-drift from non-actionable conditions getting flagged as partial when they should be ok.</span></a></li>
<li><a href="/memory/pre_task_checklist"><strong>Pre-task checklist (mechanical pre-flight, non-negotiable)</strong><span class="desc">5 yes/no checks that gate any non-trivial response. If any answer is "no", the response cannot proceed — execute the missing lookup first, or surface the gap to the user explicitly. Hardwired 2026-04-30 PM after 6 same-shape regressions in a single session despite individual patches.</span></a></li>
</ul>
<h3 class="mem-cat">Project (30)</h3>
<ul class="memory-list">
<li><a href="/memory/project_active_deal_chris_hart"><strong>Active deal — Chris Hart / 308 Balsam Dr Granby</strong><span class="desc">Discovery-stage deal node created 2026-04-29 from stalled-deal-watchdog advisory; benchmarking owed (19th Hole + Indian Trail comp set from Rachel) per BD-meeting commitment 4/28</span></a></li>
<li><a href="/memory/project_active_deal_devine"><strong>Active deal — Ryan Devine / Granby Ranch (3 properties)</strong><span class="desc">Daniela-forwarded inbound 4/27; May 4 4pm MDT call complete; 5/5 8:45 AM MDT Ryan inbound questioning 30%-vs-15% net-revenue spread on Black Feather; Joseph clarification reply SENT 5/5 16:13Z (gmail msg 19df8eaabb77ab62) — re-anchored 30% flat. 5/7 15:18Z Ryan DECLINED the May 11 2nd meeting ("I cannot make this time now can we find a different time?"). Joseph replied 16:08Z asking for new windows; awaiting Ryan's response with new times. Bowens Sourced ($1k commission).</span></a></li>
<li><a href="/memory/project_active_deal_hadank"><strong>Active deal — Andy Hadank / Snowblaze B-32</strong><span class="desc">⚠️ FALSE-POSITIVE NOTIFICATION — no contract was actually sent. Stage = qualifiedtobuy (Secondary | Discovery) per HS verified 5/1 13:15 MDT. The 4/30 "Contract Sent" notification was triggered by deal_sync.py's old mapping bug flipping stage to presentationscheduled (the column that fires the contract email), then reverted by Joseph 4/30 14:42. Walkthrough done 4/23, "may-closer" sent 4/28 9:12am, checkpoint May 7. Joseph still owes mgmt agreement template + GL/Granby contractor names.</span></a></li>
<li><a href="/memory/project_active_deal_kina_danny_pole_creek"><strong>Active deal — Kina Miller + Danny Ezrol / Pole Creek Meadows (492 Mountain Peak Rd, Tabernash)</strong><span class="desc">Discovery call complete 4/29; post-call value-based follow-up email SENT 4/30 5:05 PM MDT (gmail thread 19de09ae404d7149, msg 19de0a40d11a2fca); SkyRun is one of three PMs in Kina's evaluation matrix; competitors quoted 25% vs SkyRun 30%; Mon May 4 4pm meeting with another PM; Memorial Day (May 24) listing-live target if SkyRun wins; verbal projection $65-75K gross given on call (NOT yet formalized as deliverable; held per Joseph 4/30); HOT lead, vendor decision pending. Built from full verbatim transcript 2026-04-29 (1:06:39, Drive doc 1-q7DtQEjatnVCxuTYZOx8KqwrJGsd11yU5qCTV8WVEs).</span></a></li>
<li><a href="/memory/project_active_deal_tim_beegle"><strong>CLOSED-LOST — Tim Beegle / 357 Hi Country Drive #23-1 (Rachel-vetoed 4/27)</strong><span class="desc">❌ CLOSED — Rachel vetoed this lead 2026-04-27 ("This is a no" — gmail msg 19dd0e1aa27cf9f8 in thread 19dd0e03b7d8b47b). Joseph acknowledged "Got it." same day. Brooke separately forwarded a duplicate inquiry 4/30 not knowing about the veto; Joseph drafted a reply not realizing Rachel had already declined. Draft discarded 5/2 03:30 UTC. DO NOT OUTREACH. NO FUTURE DRAFTS. NO HS PUSH.</span></a></li>
<li><a href="/memory/project_active_deal_weber"><strong>Active deal — Stephen Weber / 103 Reserve Way, Winter Park</strong><span class="desc">Walkthrough complete 2026-04-27 (Joseph + Rachel + Steven). Stage = projection_pending. Steven prefers email; Joseph owes Track + KeyData rental projection.</span></a></li>
<li><a href="/memory/project_active_deal_whitney_yeddis"><strong>Active referral — Whitney Yeddis (Compass) / 109 Deer Track Court (Granby Ranch)</strong><span class="desc">Whitney Yeddis (Compass realtor) referred buyer interested in 109 Deer Track Court. 5/1 projection sent ($107,230 gross / $72,166 net + leave-behind PDF). 5/5 closing-loop ack received from Whitney; ack draft queued by live-ea. Buyer questions still pending.</span></a></li>
<li><a href="/memory/project_adam_tenant_dormant"><strong>Adam tenant — DORMANT (paused 2026-05-02)</strong><span class="desc">Adam Phase 1 tenant is dormant — runtime preserved, scheduled tasks unregistered, system_hygiene unloaded. Conference deadline dropped; no urgency to revive. Easy to reactivate when Joseph chooses.</span></a></li>
<li><a href="/memory/project_audit_manifest_2026-04-30_pm"><strong>System fortification audit — 2026-04-30 PM (waves 1 + 2)</strong><span class="desc">Comprehensive bug hunt + structural fortification of the SkyRun ambient stack. Triggered by Joseph's directive after 6 same-shape regressions in one session. Wave 1 closed 8 flags + shipped 7 fortifications. Wave 2 closed an additional 11 items + 2 new memory references (HS pipeline stages, BV silent-fire diagnostic). Total: 19 items closed/verified, 0 regressions, all smoke-tested.</span></a></li>
<li><a href="/memory/project_bd_hub_context"><strong>BD Training Hub — persona context for EA Agent</strong><span class="desc">Grand County-only BD persona context (Mike's Thursday training) — active commercial language, pain statements, canonical closes, frameworks, cohort + top-performer intel. EA reads at Step 1 so drafts/scheduling stay consistent with what Joseph is road-testing in the field.</span></a></li>
<li><a href="/memory/project_bv_silent_fire_diagnostic_2026-04-30"><strong>BV silent-fire + throughput-collapse diagnostic — 2026-04-30 PM</strong><span class="desc">Closes flag #50 (P0). What looked like a "silent fire" today was actually a 4-lead entity-only SoS-substitute run with all four required heartbeat fields (task_id, started_at, timestamp, last_run_at) written as null — making it invisible to system_hygiene's matcher and the PWA dashboard. The deeper blocker (#19, #33) is real: BV's View button is unresponsive under chrome_bridge automation, capping daily throughput at 1-4 leads instead of the 12-lead target.</span></a></li>
<li><a href="/memory/project_conference_dropped"><strong>SkyRun annual conference (2026-05-04) — DROPPED from planning</strong><span class="desc">The May 4 conference is no longer a milestone. Adam's Phase 1 deadline pressure is gone. Plan accordingly.</span></a></li>
<li><a href="/memory/project_dry_run_2026-05-02"><strong>Adam-bd dry-run install proof — 2026-05-02 PM</strong><span class="desc">First end-to-end test of the franchise install bundle. Surfaced 6 install-time bugs; all patched + re-staged. Final state 38/38 gate-proof PASS, 29/30 verify GREEN, 0 RED. Bundle is now provably installable from clean state.</span></a></li>
<li><a href="/memory/project_froelich_incident_2026-04-22"><strong>Froelich incident — current owner received cold outreach email (2026-04-22)</strong><span class="desc">John Froelich (active SkyRun customer, R309421/106 Preserve Way) received a cold-intro email from a HubSpot sequence at 3:44 PM MDT. Root cause + guardrails now in place.</span></a></li>
<li><a href="/memory/project_hubspot_sequences_running"><strong>HubSpot sequences DECOMMISSIONED for outreach (2026-04-22)</strong><span class="desc">HubSpot is no longer part of SkyRun outreach. All Joseph-owned HS sequences paused and deleted 2026-04-22. Outreach channels = SmartLead (email) and Postcards (physical) only.</span></a></li>
<li><a href="/memory/project_mike_marach_sales_training"><strong>Mike Marach weekly Sandler-style sales training (Thursdays)</strong><span class="desc">First weekly training happened 2026-04-23 — 30-second commercial + scoreboard; ongoing Thursday autopsy calls. Other names heard on the call (Anna, Jessica, Alex, Matt, Joy, Adam) are SkyRun BD folks at varying points in Mike's training — participants or examples, NOT a defined cohort Joseph travels with. Adam Fleckles was cited as top performer (Keystone/Vail/Aspen ~70% close) — mentor target only.</span></a></li>
<li><a href="/memory/project_postmortems"><strong>Deal postmortems</strong><span class="desc">Rolling log of closed-deal postmortems (won + lost). Captured by deal-postmortem-capture skill on each close. Feeds predictive scoring v2.</span></a></li>
<li><a href="/memory/project_productization_path"><strong>Productization path — Mac-bundle through Adam, hybrid is v2</strong><span class="desc">Strategic decision 2026-05-02 PM. Stay on Mac-bundle delivery through Adam's deployment + first 3-5 paying clients. Pure cloud SaaS rejected (kills chrome_bridge moat + flips PII liability). Hybrid control-plane + local edge agent is the v2 architecture (post first 3-5 clients).</span></a></li>
<li><a href="/memory/project_rachel_in_flight_work"><strong>In-flight work items from Rachel 3/10 meeting</strong><span class="desc">Action items Rachel assigned or agreed-to that are still live; updated Apr 27 PM with Pole Creek reschedule (Tue→Wed), Beegle veto, Devine projection directive, Hadank followup email sent</span></a></li>
<li><a href="/memory/project_realtor_referral_pipeline"><strong>Realtor referral pipeline — 4 named contacts from Rachel</strong><span class="desc">Rachel committed to intro emails for 3 realtors in the 3/10 meeting; Whitney Yeddis (Compass) is a 4th source — first live intro 2026-04-30 for 109 Deer Track Court Granby Ranch</span></a></li>
<li><a href="/memory/project_shared_email_hs_pairs"><strong>Nine HubSpot contacts hold 2 SoT lead_ids each (shared-email owners)</strong><span class="desc">Same owner, two Grand County properties, one email — HS only allows one primary email, so contact holds dual-ID lead_source_notes</span></a></li>
<li><a href="/memory/project_skill_maintenance_flags"><strong>Skill maintenance watchlist — rolling debt log</strong><span class="desc">66+ numbered items accumulated across 10 days. 2026-05-02 PM deep-audit closure: 11 stale flags closed (#20, #31, #34, #36, #41, #44, #48, #50, #57, #61, #74) + 9 anti-tripping gates wired into PROOF 13 + package-snapshots re-synced for Adam/future tenants. Active OPEN ≈ 7 items.</span></a></li>
<li><a href="/memory/project_smartlead_campaigns_drafted"><strong>SmartLead campaigns ACTIVE — launched 2026-04-22</strong><span class="desc">3 campaigns, 201 enrolled (SWITCH=78, HOT+WARM=89, NURTURE+LOW=34) — 4 current-owner leaks manually removed 2026-04-28 morning; Email 1+2+3 delivered; 30% Email-1 bounce rate (YELLOW); all 3 DNC-clean per 2026-04-28 15:30Z verify</span></a></li>
<li><a href="/memory/project_str_engine_current_state"><strong>STR lead engine current state (as of 2026-05-05 16:25Z nightly-consolidation mid-day re-fire)</strong><span class="desc">866 leads in SoT (no overnight scout). Tiers SWITCH 261 / HOT 144 / WARM 197 / NURTURE 202 / LOW 62. Postcards 837. DQ 5/5 13:11Z YELLOW — 888 HS contacts pulled live (chrome_bridge 9-page pagination, +27 vs 5/4 reflecting ongoing HS-side activity); SmartLead in baseline-trusted mode. BV 5/5 12:10Z PARTIAL — 1 OK (Jordan R043923, +2 emails +2 phones, SoT+HS synced), 7 no_match (4 LLC entities pending SoS, 3 OOS no-card-match), 7/400 May budget consumed. ⚠ SmartLead push BLOCKED 5/5 — UI removed per-campaign Import-Leads affordance (now /lead-list with Delete + Download only); eligible R043923 NOT enrolled; fix_queue P1 added (provision SL REST API key via Settings → API & Integrations). Active deals: Devine 5/5 inbound 30%-vs-15% question RED-drafted; Hadank checkpoint May 7; Chris Hart 8d stalled (Rachel-internal blocker).</span></a></li>
<li><a href="/memory/project_superhuman_revoked_apr22"><strong>Superhuman OAuth access revoked 2026-04-22 (Hadank thread trash incident)</strong><span class="desc">Superhuman was silently attached to the SkyRun Gmail with full Read/Send/Delete permissions and is the likely cause of the Hadank thread getting trashed. Access revoked 2026-04-22.</span></a></li>
<li><a href="/memory/project_system_fortification_2026-05-04_pm"><strong>System fortification audit — 2026-05-04 evening sweep</strong><span class="desc">End-of-day deep clean producing zero partials, zero errors, zero actionable discrepancies. 17 distinct fortifications applied across reconciler, audit, chrome_bridge, build_pwa, deploy, fix_queue, system_hygiene, schema validation, and pwa_stale_drain. State at end of session 2026-05-04 ~19:50 MDT.</span></a></li>
<li><a href="/memory/project_transcript_infrastructure_status"><strong>Call Transcripts pipeline — current and aspirational</strong><span class="desc">42 files indexed as of 2026-04-25 (21 scan passes); Apr 24 Joseph/Adam + WP marketing + Hadank followup added</span></a></li>
<li><a href="/memory/project_vermont_on_hold"><strong>Vermont market — on hold pending possible sale</strong><span class="desc">VT work paused because the VT book of business may be sold; materials preserved on disk but no active work until sale closes or falls through</span></a></li>
<li><a href="/memory/project_vp_marketing_active"><strong>VP of Marketing persona — active (added 2026-04-29)</strong><span class="desc">7th Cowork persona. Owns owner-facing brand/content/growth + in-house replacement of paid SPMS services. Sits alongside VP of Demand Gen (which stays focused on top-of-funnel scout/enrich/cold-outbound).</span></a></li>
<li><a href="/memory/project_warm_leads_trevor_elle"><strong>Warm leads — Trevor Pyle + Elle Koagedal (Rachel re-engaged Apr 28)</strong><span class="desc">Two early-April warm leads Rachel re-engaged on 2026-04-28 21:36Z — Trevor Pyle (230 Buckhorn) and Elle Koagedal (Tabernash); Joseph BCC'd; deferred-follow-up posture</span></a></li>
</ul>
<h3 class="mem-cat">Reference (66)</h3>
<ul class="memory-list">
<li><a href="/memory/reference_active_homeowner_roster"><strong>Active homeowner roster — Rachel's canonical list (THE do-not-contact source)</strong><span class="desc">Rachel-sourced "Winter Park Homeowners" spreadsheet is the canonical active-owner list. Every outbound skill MUST check against this before contact. 73 units, 128 contact rows, 110 unique emails, 97 phones.</span></a></li>
<li><a href="/memory/reference_approval_queue"><strong>PWA approval queue — architecture and channel files</strong><span class="desc">The "Approvals" top section of brief.josephbowens.com. Four channel queues (SmartLead, Postcards, Direct drafts, Realtor intros) read from JSONL state files.</span></a></li>
<li><a href="/memory/reference_approval_queue_v2"><strong>Approval Queue v2 — Cloudflare Pages Functions + KV (swipe to dismiss)</strong><span class="desc">Live approval queue with server-side dismiss via Cloudflare Pages Functions. Items tapped "Dismiss" on phone instantly removed from view and marked dismissed in Cloudflare KV.</span></a></li>
<li><a href="/memory/reference_arc_finance"><strong>Arc Consulting finance tracking and invoicing</strong><span class="desc">Joseph's contractor finances for SkyRun live under /SkyRun/Invoices/ and /SkyRun/*.xlsx — bi-monthly invoices, financial tracker</span></a></li>
<li><a href="/memory/reference_beenverified_rotation"><strong>daily-beenverified-enrichment rotation logic</strong><span class="desc">12 leads/day under 400/mo Premium cap; HOT 3, WARM 3, NURTURE 2, SWITCH 3, LOW 1; monthly budget guard at 380/395</span></a></li>
<li><a href="/memory/reference_blog_distribution_playbook"><strong>GC blog tracking + distribution / syndication playbook</strong><span class="desc">Source-of-truth ledger for GC-attributed blog posts on skyrun.com + the in-house syndication strategy to broaden reach at $0 cost. Built 2026-04-29.</span></a></li>
<li><a href="/memory/reference_call_transcripts_index"><strong>Call transcripts and meeting notes index</strong><span class="desc">Structured index of 33 transcripts and summaries at /Call Transcripts/index.json, covering Feb–Apr 2026</span></a></li>
<li><a href="/memory/reference_chrome_bridge"><strong>Chrome bridge — AppleScript-based Chrome control for unattended scheduled tasks</strong><span class="desc">Replaces Chrome MCP for scheduled-task contexts. Sidesteps the per-domain "Allow?" prompt that blocked BV / DQ / scout for 10 days (Apr 16–26). Uses macOS Apple Events instead of Chrome's per-domain ACL.</span></a></li>
<li><a href="/memory/reference_close_loop_skills"><strong>Close-loop skills — handoff + postmortem + referral (Gaps D + E)</strong><span class="desc">Three skills that close the bottom of the prospecting funnel and feed value back to the top. Built 2026-04-27 in one pass. close-to-onboarding-handoff (daily 12pm); deal-postmortem-capture (daily 12:15pm); referral-watchdog (Sundays 8pm).</span></a></li>
<li><a href="/memory/reference_commitment_tracker"><strong>Commitment tracker — never drop a self-promised deadline</strong><span class="desc">Daily 8:30am scheduled task. Captures "I'll do X by Y" commitments from yesterday's transcripts + sent email; ledgers them; watches deadlines; surfaces drafts to PWA approval queue when overdue. Companion to stalled-deal-watchdog (cadence) and bounce-handler (deliverability). Built 2026-04-27.</span></a></li>
<li><a href="/memory/reference_data_classification"><strong>Data classification — PII inventory + handling rules</strong><span class="desc">Every PII-bearing file/directory in the SkyRun ambient system, classified by sensitivity. Hardwired 2026-05-02 PM enterprise sweep. Required reading before touching prospect/owner data.</span></a></li>
<li><a href="/memory/reference_delegation_tool"><strong>Cowork persona delegation — sk-delegate CLI</strong><span class="desc">One-command handoff-doc generator for delegating work to VP Demand Gen / VP Finance / VP Sales Ops / VP Ops / EA Cowork personas.</span></a></li>
<li><a href="/memory/reference_disaster_recovery"><strong>Disaster recovery — Mac loss + total restore procedure</strong><span class="desc">How to rebuild the SkyRun ambient system on a fresh Mac after Mac loss/theft/destruction. Tested-procedure target. Hardwired 2026-05-02 PM enterprise sweep.</span></a></li>
<li><a href="/memory/reference_dnc_system"><strong>DO-NOT-CONTACT system — canonical current-owner check for all outreach</strong><span class="desc">Two-tier guardrail (local DNC file + HS live check) wired into every outbound skill. Data at /Users/josephbowens/Desktop/SkyRun/DNC_active_homeowners.json, function at ~/Library/Application Support/SkyRun/dnc_check.py. Refreshed nightly.</span></a></li>
<li><a href="/memory/reference_drive_sync"><strong>Google Drive sync — SkyRun folder bidirectional backup to Joseph.Bowens@SkyRun.com</strong><span class="desc">~/Desktop/SkyRun is live-synced to Google Drive via Google Drive for Desktop. Every local file create/save/edit syncs to Drive within seconds. Office format is preserved. Live EA scans for orphaned SkyRun-related files outside the folder and proposes moves.</span></a></li>
<li><a href="/memory/reference_email_phone_ledger"><strong>EMAIL_ALL / PHONE_ALL multi-contact ledger</strong><span class="desc">Canonical reference for the multi-email/phone capture pattern. SoT EMAIL_ALL/PHONE_ALL columns hold ALL contacts with metadata; primary EMAIL/PHONE is derived. HS gets primary in email+phone, alts in hs_additional_emails+mobilephone. Hard-bounce → auto-rotation to high-conf alt; queue PWA approval for med/low-conf; queue BV re-enrich if no alt.</span></a></li>
<li><a href="/memory/reference_executive_briefings"><strong>Executive briefing package — 5 persona documents</strong><span class="desc">Full handoff briefings for each persona (VP Finance, VP Sales Ops, VP Demand Gen, EA, BD Director) live in /Executive Briefings/</span></a></li>
<li><a href="/memory/reference_gc_social_media_audit"><strong>SkyRun Grand County social media audit (2026-04-29)</strong><span class="desc">Verified state of GC-specific social accounts. Joseph thought GC had zero — reality is 2-3 dormant/legacy accounts exist. Audit + revive plan.</span></a></li>
<li><a href="/memory/reference_grand_lake_risk"><strong>Grand Lake insurance + fire-risk context</strong><span class="desc">Grand Lake properties increasingly hard to insure post-fires; affects pitch and owner onboarding</span></a></li>
<li><a href="/memory/reference_graph_enrichment"><strong>Knowledge graph enrichment — nightly deepening of entity + relationship data</strong><span class="desc">Beyond bare upserts, nightly-consolidation Section I computes last_seen_at, connection_count, recency_status, and flags stale deals. PWA surfaces top connected / dormant-valuable / stale people.</span></a></li>
<li><a href="/memory/reference_heartbeat_schema"><strong>Canonical heartbeat schema for scheduled tasks</strong><span class="desc">Required filename + JSON shape for every heartbeat written to ~/Library/Application Support/SkyRun/health/. Hardwired 2026-05-02 after 5 of 10 fleet-fire heartbeats wrote null fields. Required reading for every skill that writes a heartbeat. Single source of truth.</span></a></li>
<li><a href="/memory/reference_hs_pipeline_stages"><strong>HubSpot Sales Pipeline — stage IDs vs labels (CANONICAL REFERENCE)</strong><span class="desc">The default HubSpot pipeline stage IDs are scrambled vs the SkyRun-renamed labels. Created 2026-04-30 PM after the Hadank "Contract Sent" false-positive incident. Closes maintenance flag #61. Pulled live from /api/crm-pipelines/v1/pipelines/deals portal 23273108.</span></a></li>
<li><a href="/memory/reference_hubspot_admins"><strong>HubSpot admins and HQ contacts</strong><span class="desc">Key HQ-level people for HubSpot, marketing, BD coaching, and SPMS</span></a></li>
<li><a href="/memory/reference_hubspot_infrastructure"><strong>HubSpot infrastructure IDs and dashboards</strong><span class="desc">Portal, owner, and dashboard IDs for HS deep-links and API work. Sequences decommissioned 2026-04-22 — no longer used for outreach.</span></a></li>
<li><a href="/memory/reference_hubspot_manual_entry_lessons"><strong>HubSpot property panel click coordinates (manual browser automation fallback)</strong><span class="desc">Field-position quirks from Mar 2026 manual enrichment of 110 contacts — useful only if API fallback to UI automation is needed</span></a></li>
<li><a href="/memory/reference_hubspot_operations_capabilities"><strong>HubSpot operations capabilities — what chrome_bridge can do in HS</strong><span class="desc">Proven operations the system can execute against HubSpot via chrome_bridge.py + the in-browser CSRF API. Read this before asserting any HS operation is impossible. Companion to R-17/R-18.</span></a></li>
<li><a href="/memory/reference_incident_runbook"><strong>Incident response runbook — playbooks for security + stability events</strong><span class="desc">Concrete step-by-step procedures for the most likely incidents in the SkyRun ambient system. Hardwired 2026-05-02 PM enterprise sweep. The single page Joseph opens when something goes wrong.</span></a></li>
<li><a href="/memory/reference_key_data_dexai"><strong>KeyData + DexAI Studio — analytics vendor access</strong><span class="desc">KeyData is the market analytics platform; DexAI Studio is its AI dashboard generator bundled in</span></a></li>
<li><a href="/memory/reference_keydata_operations_capabilities"><strong>KeyData operations capabilities — what chrome_bridge can extract from the KeyData dashboard</strong><span class="desc">Proven data the system can pull from KeyData via chrome_bridge.py. Read THIS before asserting any KeyData operation needs an API key. Companion to R-17/R-18.</span></a></li>
<li><a href="/memory/reference_knowledge_graph"><strong>SkyRun knowledge graph — entity layer</strong><span class="desc">Lightweight JSON graph at /SkyRun/knowledge_graph.json linking leads, contacts, deals, meetings, deliverables, systems</span></a></li>
<li><a href="/memory/reference_llm_seo_playbook_bj_enoch"><strong>BJ Enoch / Dry Fly LLM-era SEO playbook (full webinar extraction)</strong><span class="desc">Verbatim-grounded playbook from the 2026-04-21 SkyRun Power Webinar on AI & LLMs. Every claim is sourced to BJ Enoch (Dry Fly Digital) or Maura Wall (HQ Marketing). The single richest source we have on getting GC discovered in ChatGPT, Perplexity, Gemini, AI Overviews. Layered on top of reference_seo_independent_playbook.md.</span></a></li>
<li><a href="/memory/reference_marketing_resource_inventory"><strong>GC marketing resource inventory — free / included / already-paid</strong><span class="desc">Every marketing resource the agent can use without spending a new dollar. Source-grounded against franchise-fee inclusions, existing tooling, and free public services.</span></a></li>
<li><a href="/memory/reference_meeting_loop"><strong>Meeting loop — pre-meeting briefs + post-meeting auto-capture</strong><span class="desc">Every calendar event with external attendees gets a context-rich brief in the morning brief. Every new transcript gets parsed for action items + deal movement + new contacts. Closes the meeting loop.</span></a></li>
<li><a href="/memory/reference_municipality_startup_costs"><strong>Grand County STR startup costs by municipality</strong><span class="desc">What an owner pays to get a property live in each municipality — from the Startup Cost Guide built 2026-03-09</span></a></li>
<li><a href="/memory/reference_office_only_policy"><strong>Microsoft Office only — document toolchain policy</strong><span class="desc">Hardwired rule (2026-04-27). Every document save / open / edit / create / convert in this ambient system uses the Microsoft Office suite (Word, Excel, PowerPoint). LibreOffice / Pages / Numbers / Keynote / Google Docs are banned for production artifacts. Applies to all skills, routines, scheduled tasks, scripts, and human-driven flows.</span></a></li>
<li><a href="/memory/reference_onboarding_checklist"><strong>Homeowner onboarding checklist — post-signature handoff to ops</strong><span class="desc">14-task per-property checklist that runs after an owner signs. Drives the BD-to-Ops handoff. Tracked per year per market.</span></a></li>
<li><a href="/memory/reference_ops_stack"><strong>SkyRun Grand County operations tech stack</strong><span class="desc">The full platform stack Mandy/Brooke run daily — canonical reference for ops-angle selling points</span></a></li>
<li><a href="/memory/reference_owner_agreement"><strong>SkyRun Management Agreement template + narrative (v5.1)</strong><span class="desc">Owner agreement template and Narrative (explains every section). Use for owner negotiations, objection handling, and deliverable accuracy.</span></a></li>
<li><a href="/memory/reference_owner_onboarding_flow"><strong>SkyRun new-owner onboarding process (BD → Ops handoff)</strong><span class="desc">Signed contract → live listing pipeline — the process the BD-to-Ops Handoff Map documents</span></a></li>
<li><a href="/memory/reference_pane_of_glass_pwa"><strong>SkyRun pane-of-glass PWA (Cloudflare Pages, permanent)</strong><span class="desc">Phone-friendly dashboard at https://brief.josephbowens.com — Cloudflare Pages-hosted, rebuilt and redeployed nightly by nightly-consolidation.</span></a></li>
<li><a href="/memory/reference_pipeline_forecast"><strong>Pipeline forecast + revenue pulse</strong><span class="desc">Morning brief blocks that show expected commission (30/90d/full pipeline) + yesterday's Track bookings + KeyData market trend. Generated by nightly-consolidation Section L.</span></a></li>
<li><a href="/memory/reference_postcard_ledger"><strong>Postcard ledger — closes the postcard prospecting loop</strong><span class="desc">Weekly Monday 10am scheduled task. Mines Gmail (Jasmine, Rachel, anyone in postcard threads) + transcripts for confirmed sends, syncs SoT ↔ HubSpot ledger, computes next-round candidates per criteria, generates Next_Postcard_Round_<DATE>.xlsx, composes the handoff email draft to Jasmine + Rachel. Built 2026-04-27.</span></a></li>
<li><a href="/memory/reference_push_notifications"><strong>Push notifications — ntfy.sh pipeline for RED-item alerts</strong><span class="desc">Mobile push notifications via free ntfy.sh service. Scheduled tasks POST to the topic on RED conditions. Joseph's iPhone receives via the ntfy app.</span></a></li>
<li><a href="/memory/reference_pwa_dismiss_anti_regression"><strong>PWA dismiss anti-regression — 4-layer guarantee</strong><span class="desc">Permanent prevention of the PWA dismiss-bug regression class (cards rendered with empty data-id getting stuck on 'Retry'). Four layers: build-time assertion, gate-proof check, nightly stale-drain, regression rule.</span></a></li>
<li><a href="/memory/reference_pwa_staleness"><strong>PWA staleness prevention — 3-layer freshness system</strong><span class="desc">Three overlapping mechanisms keep the pane-of-glass current. Instant-rebuild on state change, 20-min ceiling via live-ea, nightly baseline, plus per-section freshness badges so you always know how current each section is.</span></a></li>
<li><a href="/memory/reference_qb_quarterback"><strong>SkyRun QB — Joseph's quarterback agent (dedicated nerve center)</strong><span class="desc">Persistent agent in its own Claude Code session, branded SkyRun QB. Fires every 30 min from 6am-10pm to stay totally current across the entire ambient system. Joseph drops into the QB's session whenever he wants to work — either on what the system surfaces OR on his own off-the-cuff initiatives. Technical taskId is qb-quarterback; display name in the scheduled-tasks sidebar + ntfy + banners is "SkyRun QB". Built 2026-04-27.</span></a></li>
<li><a href="/memory/reference_quarterly_backup"><strong>Quarterly SkyRun backup — insurance against Workspace account loss</strong><span class="desc">Every quarter (Jan 1 / Apr 1 / Jul 1 / Oct 1 at 3am) a zipped snapshot of ~/Desktop/SkyRun is written to local + iCloud Drive. Survives Mac loss AND SkyRun account termination.</span></a></li>
<li><a href="/memory/reference_quick_capture"><strong>Quick capture — voice + text note-taking from the PWA</strong><span class="desc">Floating mic button on the PWA lets Joseph dump thoughts on the go. Live-ea classifies + routes each capture within 20 min — action items, HS notes, memory edits, or drafts.</span></a></li>
<li><a href="/memory/reference_rachel_norms"><strong>Rachel Scott — working-norm reference</strong><span class="desc">How Rachel operates so deliverables match her cadence, lever-focus, and decision pattern</span></a></li>
<li><a href="/memory/reference_scheduled_tasks"><strong>Active scheduled tasks (full fleet)</strong><span class="desc">Complete inventory of running automations wired to mcp__scheduled-tasks. Updated 2026-04-30 PM audit (was previously listing 7 of 16 — closes flag #41). What fires when, which skill drives it, what data flows where.</span></a></li>
<li><a href="/memory/reference_security_posture"><strong>Security posture — overall architecture + controls</strong><span class="desc">The single document that describes what controls exist in the SkyRun ambient system, how they map to enterprise security/stability standards, and where current gaps are. Hardwired 2026-05-02 PM enterprise sweep.</span></a></li>
<li><a href="/memory/reference_seo_independent_playbook"><strong>Independent SEO playbook ($0 cost, GC-local)</strong><span class="desc">How GC can run local + LLM-era SEO in-house without paying for tools or the Dry Fly retainer. Tactics grounded in BJ Enoch's Apr 21 SkyRun Power webinar + Dry Fly's $1,500/mo offering deconstructed.</span></a></li>
<li><a href="/memory/reference_session_keep_alive"><strong>Session keep-alive prober</strong><span class="desc">Every 10 min, probe each chrome_bridge-dependent source (Track, KeyData, SmartLead, BeenVerified) to detect session expiration within minutes and fire ntfy push when any source drops. Probe traffic also resets idle timers, extending session lifespan beyond natural timeout.</span></a></li>
<li><a href="/memory/reference_smartlead_bounce_handler"><strong>SmartLead bounce handler — closes the bounce loop</strong><span class="desc">Daily 11am scheduled task. Mines Gmail mailer-daemon notifications, classifies HARD vs SOFT bounces (RFC 5321), updates SoT bounce ledger, queues HS proposals + SmartLead-removal actions for hard-bounced contacts. Hard-bounced leads stay postcard-eligible (different channel). Built 2026-04-27.</span></a></li>
<li><a href="/memory/reference_smartlead_hs_email_logging"><strong>SmartLead → HubSpot Email Engagement Logging</strong><span class="desc">How SmartLead sends get logged as Email (not Note) in HubSpot. Path A configuration and Froelich-class follow-up.</span></a></li>
<li><a href="/memory/reference_smartlead_operations_capabilities"><strong>SmartLead operations capabilities — what chrome_bridge can do in the SL UI</strong><span class="desc">Proven operations the system can execute against SmartLead via chrome_bridge.py. Read THIS before asserting any SL operation is impossible. Updated when new capabilities are proven. Companion to R-17/R-18.</span></a></li>
<li><a href="/memory/reference_sot_canonical_architecture"><strong>SoT-canonical architecture — continuous enforcement of single source of truth</strong><span class="desc">SoT (Grand_County_STR_Engine_v3.5_filtered.xlsx Lead Details) is the single source of truth — was always the design intent, hardwired as RULES.md R-02 + structurally enforced by sot_reconciler.py running every 15 min. HubSpot is derivative. SmartLead enrolled-leads-list is a subset of SoT. This doc explains the architecture, why prior bandaids failed, why this is permanent, and how to add new HS-writing code without breaking it.</span></a></li>
<li><a href="/memory/reference_spms_replacement_map"><strong>SPMS service replacement readiness map</strong><span class="desc">Service-by-service inventory of paid/included SPMS offerings vs in-house replacement readiness. Sourced 2026-04-29 from SkyRun Premium Marketing Services 2026.pdf + transcripts + existing automation inventory.</span></a></li>
<li><a href="/memory/reference_str_audience_discovery_playbook"><strong>STR-industry audience discovery + community ledger</strong><span class="desc">Where to find STR-relevant audiences for blog syndication, expert positioning, and owner-acquisition. Joseph's personal LinkedIn network is NOT STR-focused — the agent must go OUT to communities that ARE. Built 2026-04-29.</span></a></li>
<li><a href="/memory/reference_subscription_costs"><strong>Subscription & usage inventory — what this system costs to run</strong><span class="desc">Full accounting of every subscription the SkyRun ambient system depends on. Clear view of incremental cost vs. pre-existing infra.</span></a></li>
<li><a href="/memory/reference_system_hygiene"><strong>System hygiene watchdog — keeps the ambient fleet from accumulating cruft</strong><span class="desc">Hourly launchd job that auto-cleans Claude Code zombies, flags stale tasks, monitors MCP drift, trims oversize logs. Pushes ntfy on partial/error.</span></a></li>
<li><a href="/memory/reference_system_monitoring"><strong>System monitoring — heartbeats, health synthesis, morning-brief alerting</strong><span class="desc">Every scheduled task writes a heartbeat JSON per run. Nightly-consolidation synthesizes them into overall system health. PWA shows status; RED conditions surface as morning-brief priority #1.</span></a></li>
<li><a href="/memory/reference_token_optimization_2026-05-09"><strong>reference_token_optimization_2026-05-09</strong><span class="desc"></span></a></li>
<li><a href="/memory/reference_transcript_scan_spec"><strong>transcript-scan skill — gmail + local filesystem sweep</strong><span class="desc">The scheduled transcript discovery pipeline — scans gmail senders, local folders, and now email body copy-pastes</span></a></li>
<li><a href="/memory/reference_vendor_security_posture"><strong>Vendor security posture — risk register + scope inventory</strong><span class="desc">Every external service the SkyRun ambient system touches, what data flows where, current OAuth scopes, last rotation date. Hardwired 2026-05-02 PM enterprise sweep.</span></a></li>
<li><a href="/memory/reference_voice_anti_patterns"><strong>Voice anti-patterns — phrases + structures Joseph never writes</strong><span class="desc">Concrete blacklist of AI-flavored phrases and structures that get caught in Joseph's drafts. Linter at ~/Library/Application Support/SkyRun/voice_check.py runs against this. Hardwired 2026-05-08 after Trevor draft was caught reading "super AI generated."</span></a></li>
</ul>
</div>
</details>
<!-- ─── SkyRun Body cards (P7) — added 2026-05-08 ─── -->
<details id="active-shields" open>
<summary>🛡 Active shields<span class="summary-meta">— protections live</span></summary>
<div class="body">
<section class="sr-body-cards">
<div class="sr-body-card sr-body-card--shield" data-card="active-deal-shield">
<header><span class="sr-body-card-emoji">🛡</span><h3>Active-Deal Shield</h3></header>
<div class="sr-body-card-value" data-bind="active_deal_count">8</div>
<div class="sr-body-card-sub">emails protected · last refresh <span data-bind="active_deal_last_refresh">today</span></div>
</div>
<div class="sr-body-card sr-body-card--dedup" data-card="send-dedup">
<header><span class="sr-body-card-emoji">🚧</span><h3>Send Dedup</h3></header>
<div class="sr-body-card-value">safe_send active</div>
<div class="sr-body-card-sub">last 24h · cooldown 600s · regression test ✅</div>
</div>
<div class="sr-body-card sr-body-card--registry" data-card="job-registry">
<header><span class="sr-body-card-emoji">📋</span><h3>Job Registry</h3></header>
<div class="sr-body-card-value">11 registered</div>
<div class="sr-body-card-sub">whitelist enforces phantom-job protection</div>
</div>
<div class="sr-body-card sr-body-card--freshness" data-card="brief-freshness">
<header><span class="sr-body-card-emoji">⏱</span><h3>Brief Freshness</h3></header>
<div class="sr-body-card-value">validator live</div>
<div class="sr-body-card-sub">errors when claimed-asof drifts past tolerance</div>
</div>
</section>
</div>
</details>
<style>
.sr-body-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px; margin: 8px 0 4px; }
.sr-body-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 14px; padding: 14px 16px; box-shadow: var(--shadow-card); }
.sr-body-card header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.sr-body-card header h3 { margin: 0; font-size: 13px; font-weight: 800; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-dim); }
.sr-body-card-emoji { font-size: 18px; }
.sr-body-card-value { font-size: 24px; font-weight: 900; color: var(--text); letter-spacing: -0.01em; }
.sr-body-card-sub { font-size: 12px; color: var(--text-dim); margin-top: 4px; }
.sr-body-card--shield { border-left: 3px solid var(--green); }
.sr-body-card--dedup { border-left: 3px solid var(--accent); }
.sr-body-card--registry { border-left: 3px solid var(--navy-dim); }
.sr-body-card--freshness { border-left: 3px solid var(--green); }
.sr-freshness-pill {
display: inline-flex; align-items: center; gap: 4px;
background: rgba(255,255,255,0.14);
border: 1px solid rgba(255,255,255,0.18);
border-radius: 999px; padding: 3px 10px; font-size: 11px; font-weight: 700;
color: rgba(255,255,255,0.85); margin-left: auto;
}
.sr-freshness-pill--green { background: rgba(74,154,67,0.30); border-color: rgba(74,154,67,0.50); }
.sr-freshness-pill--yellow { background: rgba(255,194,14,0.20); border-color: rgba(255,194,14,0.40); }
.sr-freshness-pill--red { background: rgba(229,91,74,0.30); border-color: rgba(229,91,74,0.50); }
.sr-freshness-pill--unknown { opacity: 0.6; }
</style>
<!-- /SkyRun Body cards -->
</main>
<!-- Quick capture floating action button -->
<button class="capture-fab" id="captureFab" aria-label="Quick capture a note">+</button>
<div class="capture-panel" id="capturePanel" role="dialog" aria-label="Quick capture">
<textarea id="captureText" placeholder="Quick thought, action item, or note… Claude will route it for you."></textarea>
<div class="capture-actions">
<button class="capture-mic" id="captureMic" aria-label="Record voice note">🎤</button>
<span class="capture-status" id="captureStatus"></span>
<button class="capture-send" id="captureSend" disabled>Capture</button>
</div>
</div>
<footer style="text-align: center; color: var(--text-dim); font-size: 12px; padding: 20px 0;">
Generated May 9, 2026 at 11:14 AM · Rebuilds nightly at 11pm
</footer>
<script>
// Approval queue interactivity — fetch already-dismissed list on load, wire up Dismiss buttons.
(function() {
// Auth-expiry detection: when Cloudflare Access session expires, fetch POST gets a
// cross-origin 302 to cloudflareaccess.com and fails CORS. We detect + trigger reload.
function isAuthExpiry(err, response) {
// Network-level rejection (CORS-blocked cross-origin redirect) throws TypeError
if (err && err.name === 'TypeError') return true;
// Response came back but with status 0 or 3xx (opaqueredirect) or non-JSON HTML
if (response) {
if (response.type === 'opaqueredirect') return true;
if (response.status === 0 || response.status === 401 || response.status === 403) return true;
const ct = response.headers && response.headers.get('content-type') || '';
if (ct && !ct.includes('application/json')) return true;
}
return false;
}
function reloadForAuth(msg) {
try { sessionStorage.setItem('pwa_auth_reload_reason', msg || 'auth_expired'); } catch (e) {}
// Full reload — goes through Access flow, comes back authenticated
location.reload();
}
async function apiPost(path, body) {
let r;
try {
r = await fetch(path, {
method: 'POST',
headers: { 'content-type': 'application/json' },
credentials: 'include',
redirect: 'manual',
body: JSON.stringify(body)
});
} catch (err) {
if (isAuthExpiry(err, null)) { reloadForAuth('fetch_cors'); return { __authReload: true }; }
throw err;
}
if (isAuthExpiry(null, r)) { reloadForAuth('response_redirect'); return { __authReload: true }; }
if (!r.ok) {
let data = {};
try { data = await r.json(); } catch (e) {}
return { ok: false, error: data.error || ('http_' + r.status) };
}
return r.json();
}
function hideDismissed(keys) {
for (const key of keys) {
// key format: "{channel}/{id}"
const [channel, ...idParts] = key.split('/');
const id = idParts.join('/');
const card = document.querySelector(
'.approval-card[data-channel="' + CSS.escape(channel) + '"][data-id="' + CSS.escape(id) + '"]'
);
if (card) card.classList.add('dismissed');
}
// If an entire channel section is now empty, hide its header too
document.querySelectorAll('.approval-channel').forEach(section => {
const remaining = section.querySelectorAll('.approval-card:not(.dismissed)');
if (remaining.length === 0) section.style.display = 'none';
});
}
// Fetch previously-dismissed on load (GET — tolerate auth failure silently, keeps page usable)
fetch('/api/dismissed', { credentials: 'include' })
.then(r => r.ok ? r.json() : { dismissed: [] })
.then(data => {
if (data.dismissed && data.dismissed.length) hideDismissed(data.dismissed);
})
.catch(() => { / silent — offline mode still shows everything / });
// Thumbs-up/down feedback handler (for live-ea drafts)
document.addEventListener('click', async function(e) {
const tbtn = e.target.closest('.approval-thumbs');
if (!tbtn) return;
e.preventDefault();
if (tbtn.classList.contains('submitted')) return; // already rated
const id = tbtn.dataset.id;
const rating = tbtn.dataset.rating;
let reason = '';
if (rating === 'down') {
reason = prompt("What was off? (optional — helps the EA learn)") || '';
}
tbtn.classList.add('submitted');
const data = await apiPost('/api/draft-feedback', { id, rating, reason });
if (data && data.__authReload) return; // reloading — don't touch UI
if (!data || !data.ok) {
tbtn.classList.remove('submitted');
console.error('Feedback failed:', data && data.error);
}
});
// Dismiss button handler
document.addEventListener('click', async function(e) {
const btn = e.target.closest('.approval-dismiss');
if (!btn) return;
e.preventDefault();
const id = btn.dataset.id;
const channel = btn.dataset.channel;
btn.classList.add('dismissing');
btn.textContent = 'Dismissing…';
const data = await apiPost('/api/dismiss', { id, channel });
if (data && data.__authReload) return; // reloading — don't touch UI
if (data && data.ok) {
const card = btn.closest('.approval-card');
if (card) {
card.classList.add('dismissed');
// Check if section is empty now
const section = card.closest('.approval-channel');
if (section && section.querySelectorAll('.approval-card:not(.dismissed)').length === 0) {
section.style.display = 'none';
}
}
} else {
btn.textContent = 'Retry';
btn.classList.remove('dismissing');
console.error('Dismiss failed:', data && data.error);
}
});
// If we just reloaded because of auth expiry, leave a subtle hint in console
try {
const reason = sessionStorage.getItem('pwa_auth_reload_reason');
if (reason) {
console.info('[PWA] Reloaded after auth expiry (' + reason + '). You may need to tap Dismiss again.');
sessionStorage.removeItem('pwa_auth_reload_reason');
}
} catch (e) {}
// ============= Quick capture =============
const fab = document.getElementById('captureFab');
const panel = document.getElementById('capturePanel');
const textarea = document.getElementById('captureText');
const sendBtn = document.getElementById('captureSend');
const micBtn = document.getElementById('captureMic');
const status = document.getElementById('captureStatus');
if (fab) {
fab.addEventListener('click', () => {
panel.classList.toggle('open');
if (panel.classList.contains('open')) textarea.focus();
});
textarea.addEventListener('input', () => {
sendBtn.disabled = !textarea.value.trim();
});
sendBtn.addEventListener('click', async () => {
const text = textarea.value.trim();
if (!text) return;
sendBtn.disabled = true;
status.textContent = 'Sending…';
const data = await apiPost('/api/capture', { text, source: micBtn.dataset.usedVoice ? 'voice' : 'text', client_ts: new Date().toISOString() });
if (data && data.__authReload) return;
if (data && data.ok) {
textarea.value = '';
delete micBtn.dataset.usedVoice;
status.textContent = '✓ Captured';
setTimeout(() => { status.textContent = ''; panel.classList.remove('open'); }, 1200);
} else {
status.textContent = 'Failed — try again';
sendBtn.disabled = false;
}
});
// Voice input via Web Speech API (iOS Safari 14.5+, Chrome, Edge)
let recognition = null;
const SpeechRec = window.SpeechRecognition || window.webkitSpeechRecognition;
if (SpeechRec) {
recognition = new SpeechRec();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = 'en-US';
recognition.onresult = (e) => {
let transcript = '';
for (let i = 0; i < e.results.length; i++) {
transcript += e.results[i][0].transcript;
}
textarea.value = transcript;
sendBtn.disabled = !transcript.trim();
};
recognition.onend = () => {
micBtn.classList.remove('recording');
fab.classList.remove('recording');
status.textContent = '';
};
recognition.onerror = (e) => {
status.textContent = 'Mic error: ' + e.error;
micBtn.classList.remove('recording');
fab.classList.remove('recording');
};
micBtn.addEventListener('click', () => {
if (micBtn.classList.contains('recording')) {
recognition.stop();
} else {
micBtn.classList.add('recording');
fab.classList.add('recording');
micBtn.dataset.usedVoice = '1';
status.textContent = 'Listening…';
try { recognition.start(); } catch (e) { status.textContent = 'Mic unavailable'; }
}
});
} else {
micBtn.style.display = 'none';
}
}
})();
</script>
<!-- ─── SkyRun foundation patches (P1+P2+P5+P7) — added 2026-05-08 ─── -->
<script src="sr-cmd-palette.js" defer></script>
<script src="sr-keyboard.js" defer></script>
<script src="sr-freshness-pill.js" defer></script>
<script src="sr-optimistic.js" defer></script>
<script src="sr-toast.js" defer></script>
<script src="sr-transitions.js" defer></script>
<link rel="stylesheet" href="sr-skeleton.css">
<link rel="stylesheet" href="sr-toast.css">
<link rel="stylesheet" href="sr-transitions.css">
<link rel="stylesheet" href="sr-print.css" media="print">
<!-- /SkyRun foundation -->
</body>
</html>