update
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
@@ -0,0 +1,766 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>H5: Billing Validator — Project Progress</title>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#f7f9fc;
|
||||
--card:#ffffff;
|
||||
--text:#111827;
|
||||
--muted:#4b5563;
|
||||
--line:#e5e7eb;
|
||||
--accent:#2563eb;
|
||||
--accent2:#0ea5e9;
|
||||
--warn:#b45309;
|
||||
--danger:#b91c1c;
|
||||
--success:#047857;
|
||||
--shadow: 0 10px 30px rgba(17,24,39,.08);
|
||||
--radius:16px;
|
||||
}
|
||||
|
||||
*{box-sizing:border-box;}
|
||||
html,body{height:100%;}
|
||||
body{
|
||||
margin:0;
|
||||
background:#0b1220; /* outer backdrop */
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
|
||||
color:var(--text);
|
||||
display:flex;
|
||||
align-items:center;
|
||||
justify-content:center;
|
||||
padding:0; /* let slide use most of the viewport */
|
||||
}
|
||||
|
||||
/* Viewport frame: let the slide grow on big screens while keeping 16:9 */
|
||||
.frame{
|
||||
width:100vw;
|
||||
height:100vh;
|
||||
display:flex;
|
||||
align-items:center;
|
||||
justify-content:center;
|
||||
padding: clamp(12px, 2.2vh, 28px);
|
||||
}
|
||||
|
||||
/* 16:9 single-slide canvas */
|
||||
.slide{
|
||||
/* Use as much space as possible, capped by viewport height */
|
||||
width: min(calc(100vw - 2 * clamp(12px, 2.2vh, 28px)), calc((100vh - 2 * clamp(12px, 2.2vh, 28px)) * (16/9)));
|
||||
height: min(calc(100vh - 2 * clamp(12px, 2.2vh, 28px)), calc((100vw - 2 * clamp(12px, 2.2vh, 28px)) * (9/16)));
|
||||
aspect-ratio: 16 / 9;
|
||||
|
||||
background:var(--bg);
|
||||
border-radius:22px;
|
||||
box-shadow: 0 30px 80px rgba(0,0,0,.35);
|
||||
overflow:hidden;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
/* Optional: if the window is very short (e.g., split screen), reduce inner padding */
|
||||
@media (max-height: 820px){
|
||||
.inner{ padding: 26px 32px !important; }
|
||||
}
|
||||
|
||||
.inner{
|
||||
height:100%;
|
||||
padding:38px 46px;
|
||||
display:grid;
|
||||
grid-template-rows: auto 1fr;
|
||||
gap:18px;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.header{
|
||||
display:grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
align-items:end;
|
||||
gap:16px;
|
||||
}
|
||||
.title{
|
||||
line-height:1.05;
|
||||
}
|
||||
.title h1{
|
||||
margin:0;
|
||||
font-size: clamp(28px, 2.4vw, 40px);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
.title .subtitle{
|
||||
margin-top:10px;
|
||||
color:var(--muted);
|
||||
font-size: clamp(14px, 1.15vw, 18px);
|
||||
display:flex;
|
||||
gap:10px;
|
||||
flex-wrap:wrap;
|
||||
}
|
||||
.pill{
|
||||
display:inline-flex;
|
||||
align-items:center;
|
||||
gap:8px;
|
||||
padding:6px 10px;
|
||||
border-radius:999px;
|
||||
border:1px solid var(--line);
|
||||
background:rgba(255,255,255,.75);
|
||||
font-weight:600;
|
||||
}
|
||||
.pill b{color:var(--text)}
|
||||
|
||||
.meta{
|
||||
text-align:right;
|
||||
color:var(--muted);
|
||||
font-size: clamp(12px, 1.0vw, 14px);
|
||||
line-height:1.35;
|
||||
}
|
||||
.meta .date{
|
||||
color:var(--text);
|
||||
font-weight:800;
|
||||
letter-spacing:.02em;
|
||||
}
|
||||
|
||||
/* Main layout */
|
||||
.main{
|
||||
display:grid;
|
||||
grid-template-columns: 1.1fr 0.9fr;
|
||||
gap:18px;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.col{
|
||||
display:grid;
|
||||
grid-template-rows: 0.9fr 1.1fr;
|
||||
gap:18px;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.card{
|
||||
background:var(--card);
|
||||
border:1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: var(--shadow);
|
||||
padding:16px 16px;
|
||||
overflow:hidden;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.card h2{
|
||||
margin:0 0 10px 0;
|
||||
font-size: clamp(14px, 1.1vw, 16px);
|
||||
letter-spacing:.01em;
|
||||
text-transform:uppercase;
|
||||
color:#0f172a;
|
||||
}
|
||||
|
||||
.small{
|
||||
color:var(--muted);
|
||||
font-size: clamp(12px, 0.95vw, 13px);
|
||||
line-height:1.35;
|
||||
}
|
||||
|
||||
/* Timeline (compact gantt) */
|
||||
.timeline{
|
||||
display:grid;
|
||||
grid-template-rows: auto 1fr;
|
||||
gap:10px;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.gantt{
|
||||
position:relative;
|
||||
border:1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(#fff, #fff);
|
||||
padding:10px 12px 12px 12px;
|
||||
min-height:0;
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
/* Timeline axis: month ticks + vertical gridlines */
|
||||
.axis{
|
||||
position:relative;
|
||||
height: 22px;
|
||||
margin-left: 120px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.axis .axis-label{
|
||||
position:absolute;
|
||||
top:0;
|
||||
transform: translateX(-50%);
|
||||
color:var(--muted);
|
||||
font-size: 12px;
|
||||
font-weight:700;
|
||||
letter-spacing:.04em;
|
||||
text-transform:uppercase;
|
||||
white-space:nowrap;
|
||||
pointer-events:none;
|
||||
background: rgba(255,255,255,.75);
|
||||
padding:0 4px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.axis .tick{
|
||||
position:absolute;
|
||||
top:22px;
|
||||
bottom:-999px; /* extend over all rows */
|
||||
width:0;
|
||||
border-left:1px solid rgba(148,163,184,.25);
|
||||
pointer-events:none;
|
||||
}
|
||||
|
||||
/* Remove the old evenly-spaced guide lines, we'll use real month ticks */
|
||||
.track::before{
|
||||
content:none;
|
||||
}
|
||||
|
||||
/* Today marker tuned for the new axis height */
|
||||
.today{
|
||||
position:absolute;
|
||||
inset: 32px 12px 12px 132px;
|
||||
pointer-events:none;
|
||||
}
|
||||
.today-line{
|
||||
position:absolute;
|
||||
top:0;
|
||||
bottom:0;
|
||||
width:0;
|
||||
border-left:2px dashed rgba(185,28,28,.75);
|
||||
filter: drop-shadow(0 0 6px rgba(185,28,28,.25));
|
||||
}
|
||||
.today-label{
|
||||
position:absolute;
|
||||
top:-20px;
|
||||
transform: translateX(-50%);
|
||||
font-size: 11px;
|
||||
font-weight:900;
|
||||
color: rgba(185,28,28,1);
|
||||
background: rgba(255,255,255,.9);
|
||||
padding:2px 6px;
|
||||
border:1px solid rgba(185,28,28,.25);
|
||||
border-radius:999px;
|
||||
white-space:nowrap;
|
||||
}
|
||||
|
||||
/* Progress cards */
|
||||
.two-col{
|
||||
display:grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap:12px;
|
||||
min-height:0;
|
||||
}
|
||||
.mini{
|
||||
border:1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
padding:12px;
|
||||
background: rgba(255,255,255,.92);
|
||||
min-height:0;
|
||||
}
|
||||
.mini h3{
|
||||
margin:0 0 6px 0;
|
||||
font-size: 13px;
|
||||
text-transform:uppercase;
|
||||
letter-spacing:.05em;
|
||||
}
|
||||
ul{
|
||||
margin:0;
|
||||
padding-left: 16px;
|
||||
}
|
||||
li{
|
||||
margin: 4px 0;
|
||||
font-size: clamp(12px, 0.95vw, 13px);
|
||||
color: #0f172a;
|
||||
line-height:1.25;
|
||||
}
|
||||
li span{ color: var(--muted); }
|
||||
|
||||
.tag{
|
||||
display:inline-flex;
|
||||
align-items:center;
|
||||
padding:2px 8px;
|
||||
border-radius:999px;
|
||||
border:1px solid var(--line);
|
||||
font-size:11px;
|
||||
font-weight:900;
|
||||
letter-spacing:.02em;
|
||||
margin-left:6px;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.tag.ok{ color:var(--success); background: rgba(4,120,87,.08); border-color: rgba(4,120,87,.18); }
|
||||
.tag.mid{ color:var(--warn); background: rgba(180,83,9,.08); border-color: rgba(180,83,9,.18);}
|
||||
.tag.risk{ color:var(--danger); background: rgba(185,28,28,.06); border-color: rgba(185,28,28,.18);}
|
||||
|
||||
/* Solution flow */
|
||||
.flow{
|
||||
display:grid;
|
||||
grid-template-rows:auto 1fr;
|
||||
gap:10px;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.flowgrid{
|
||||
display:grid;
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
gap:8px;
|
||||
align-items:stretch;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.step{
|
||||
border:1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
background: rgba(255,255,255,.92);
|
||||
padding:10px 10px;
|
||||
position:relative;
|
||||
overflow:hidden;
|
||||
min-height:0;
|
||||
}
|
||||
.step .k{
|
||||
font-size:11px;
|
||||
font-weight:1000;
|
||||
letter-spacing:.08em;
|
||||
text-transform:uppercase;
|
||||
color: var(--muted);
|
||||
}
|
||||
.step .v{
|
||||
margin-top:4px;
|
||||
font-size: 13px;
|
||||
font-weight:900;
|
||||
color:#0f172a;
|
||||
line-height:1.1;
|
||||
}
|
||||
.step .d{
|
||||
margin-top:6px;
|
||||
font-size:11.5px;
|
||||
color: var(--muted);
|
||||
line-height:1.25;
|
||||
}
|
||||
|
||||
.arrow{
|
||||
position:absolute;
|
||||
right:-7px;
|
||||
top:50%;
|
||||
transform: translateY(-50%);
|
||||
width:14px;
|
||||
height:14px;
|
||||
background: var(--accent);
|
||||
clip-path: polygon(0 0, 0 100%, 100% 50%);
|
||||
opacity:.6;
|
||||
}
|
||||
|
||||
.step:nth-child(1) { box-shadow: inset 0 0 0 1px rgba(37,99,235,.15); }
|
||||
.step:nth-child(2) { box-shadow: inset 0 0 0 1px rgba(14,165,233,.18); }
|
||||
.step:nth-child(3) { box-shadow: inset 0 0 0 1px rgba(14,165,233,.18); }
|
||||
.step:nth-child(4) { box-shadow: inset 0 0 0 1px rgba(4,120,87,.16); }
|
||||
.step:nth-child(5) { box-shadow: inset 0 0 0 1px rgba(180,83,9,.14); }
|
||||
.step:nth-child(6) { box-shadow: inset 0 0 0 1px rgba(37,99,235,.15); }
|
||||
|
||||
/* Footer risks */
|
||||
.riskrow{
|
||||
display:grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap:12px;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.compare{
|
||||
display:grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap:12px;
|
||||
align-items:start;
|
||||
min-height:0;
|
||||
}
|
||||
|
||||
.callout{
|
||||
border:1px dashed rgba(185,28,28,.25);
|
||||
background: rgba(185,28,28,.04);
|
||||
border-radius: 14px;
|
||||
padding:12px;
|
||||
}
|
||||
.callout h3{
|
||||
margin:0 0 6px 0;
|
||||
font-size: 13px;
|
||||
letter-spacing:.04em;
|
||||
text-transform:uppercase;
|
||||
color: rgba(185,28,28,1);
|
||||
}
|
||||
|
||||
.callout.good{
|
||||
border-color: rgba(4,120,87,.25);
|
||||
background: rgba(4,120,87,.05);
|
||||
}
|
||||
.callout.good h3{ color: rgba(4,120,87,1); }
|
||||
|
||||
/* Tiny helper to keep everything inside without scrollbars */
|
||||
.card, .mini, .step, .gantt{ overscroll-behavior: none; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="frame">
|
||||
<div class="slide" role="img" aria-label="Project progress slide: H5 Billing Validator">
|
||||
<div class="inner">
|
||||
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<h1>H5: Billing Validator — Project Progress</h1>
|
||||
<div class="subtitle">
|
||||
<span class="pill"><b>Goal</b> Validate vendor billing files via AI-driven SOP + Agents</span>
|
||||
<span class="pill"><b>Output</b> Validation report → business review → email to CEC manager</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta">
|
||||
<div class="date">2026‑02‑03</div>
|
||||
<div>Single-slide update (16:9) • Light theme</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="main">
|
||||
<div class="col">
|
||||
|
||||
<section class="card timeline">
|
||||
<h2>Timeline (Dec 2025 → Jun 2026)</h2>
|
||||
<div class="small">Window aligned to plan: <b>2025‑12‑17</b> → <b>2026‑06‑01</b> (MVP go‑live milestone: <b>Mar 31</b>)</div>
|
||||
|
||||
<div class="gantt" aria-label="Timeline gantt" data-gantt-start="2025-12-17" data-gantt-end="2026-06-01" data-today="2026-02-03">
|
||||
<div class="axis" aria-hidden="true"></div>
|
||||
|
||||
<div class="lane">
|
||||
<div class="label">Agent Build‑up</div>
|
||||
<div class="tasks">
|
||||
<div class="task">
|
||||
<div class="task-name">Wave1 · SGS</div>
|
||||
<div class="track">
|
||||
<div class="bar blue" data-start="2025-12-17" data-end="2026-01-23" title="FTE Wave1 - SGS">2025‑12‑17 → 2026‑01‑23</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Wave2 · Top3</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-01-19" data-end="2026-01-31" title="FTE Wave2 - Top3">2026‑01‑19 → 2026‑01‑31</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Wave3 · Others</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-02-02" data-end="2026-02-14" title="FTE Wave3 - Others (10+ scenarios)">2026‑02‑02 → 2026‑02‑14</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">PPM</div>
|
||||
<div class="track">
|
||||
<div class="bar blue" data-start="2026-02-24" data-end="2026-04-30" title="PPM">2026‑02‑24 → 2026‑04‑30</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Chat</div>
|
||||
<div class="track">
|
||||
<div class="bar green" data-start="2026-05-06" data-end="2026-06-01" title="Chat">2026‑05‑06 → 2026‑06‑01</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="lane">
|
||||
<div class="label">Data Integration</div>
|
||||
<div class="tasks">
|
||||
<div class="task">
|
||||
<div class="task-name">S/T Solution</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-01-19" data-end="2026-02-18" title="S/T Solution">2026‑01‑19 → 2026‑02‑18</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">SIT</div>
|
||||
<div class="track">
|
||||
<div class="bar blue" data-start="2026-02-21" data-end="2026-02-28" title="SIT">2026‑02‑21 → 2026‑02‑28</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">L/T Solution</div>
|
||||
<div class="track">
|
||||
<div class="small" style="padding-left:10px;">TBD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="lane">
|
||||
<div class="label">Product (MVP)</div>
|
||||
<div class="tasks">
|
||||
<div class="task">
|
||||
<div class="task-name">PRD Draft</div>
|
||||
<div class="track">
|
||||
<div class="bar milestone-bar" data-at="2026-01-16" title="PRD Draft milestone"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Req. Align</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-01-19" data-end="2026-01-23" title="Req. Alignment">2026‑01‑19 → 2026‑01‑23</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">MVP Dev</div>
|
||||
<div class="track">
|
||||
<div class="bar blue" data-start="2026-01-26" data-end="2026-03-06" title="MVP Dev">2026‑01‑26 → 2026‑03‑06</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Add. Dev</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-03-06" data-end="2026-03-15" title="Additional Dev">2026‑03‑06 → 2026‑03‑15</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">SIT</div>
|
||||
<div class="track">
|
||||
<div class="bar green" data-start="2026-03-09" data-end="2026-03-18" title="SIT">2026‑03‑09 → 2026‑03‑18</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">UAT</div>
|
||||
<div class="track">
|
||||
<div class="bar cyan" data-start="2026-03-19" data-end="2026-03-27" title="UAT">2026‑03‑19 → 2026‑03‑27</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="task-name">Go‑Live</div>
|
||||
<div class="track">
|
||||
<div class="bar milestone-bar" data-at="2026-03-31" title="Go live milestone"></div>
|
||||
<div class="milestone-label" data-at="2026-03-31">Mar 31</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="today" aria-hidden="true">
|
||||
<div class="today-line"></div>
|
||||
<div class="today-label">Today</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<h2>Status & Next Steps</h2>
|
||||
<div class="two-col">
|
||||
|
||||
<div class="mini">
|
||||
<h3>What has been done <span class="tag ok">on track</span></h3>
|
||||
<ul>
|
||||
<li><b>Agent build-up:</b> SGS + Top3 implemented (9 scenes); 3 scenes in implementation; FTE completion target <b>Feb 14</b>.</li>
|
||||
<li><b>Data integration:</b> aligned w/ data team; POC with dummy data ready; starting data-link testing.</li>
|
||||
<li><b>Product engineering:</b> PRD aligned w/ IT; MVP in dev, targeting <b>mid‑Mar</b>.</li>
|
||||
<li><b>Reviews:</b> EA review pass; BIA checkpoint pass.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="mini">
|
||||
<h3>Next steps <span class="tag mid">focus</span></h3>
|
||||
<ul>
|
||||
<li><b>Agent build-up:</b> implement 8 scenes; fix issues found during testing.</li>
|
||||
<li><b>Data integration:</b> LUDP data-link testing; work long-term solution with data team.</li>
|
||||
<li><b>Product engineering:</b> continue MVP development towards SIT/UAT.</li>
|
||||
<li><b>Reviews:</b> Legal (RAI/PDD) ongoing; Security review pending dev complete.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- Right column: solution + risks -->
|
||||
<div class="col">
|
||||
|
||||
<section class="card flow">
|
||||
<h2>Solution (SOP → Agentic execution)</h2>
|
||||
<div class="small">AI turns a human SOP into a step-by-step plan, agents execute per billing file, and business reviews the report before auto-emailing results.</div>
|
||||
|
||||
<div class="flowgrid" aria-label="Solution flow">
|
||||
<div class="step">
|
||||
<div class="k">Input</div>
|
||||
<div class="v">Billing file</div>
|
||||
<div class="d">Vendor-provided billing data</div>
|
||||
<div class="arrow" aria-hidden="true"></div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="k">SOP</div>
|
||||
<div class="v">Validation SOP</div>
|
||||
<div class="d">Business-defined checklist & rules</div>
|
||||
<div class="arrow" aria-hidden="true"></div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="k">AI Planner</div>
|
||||
<div class="v">Plan decomposition</div>
|
||||
<div class="d">Break SOP → executable steps</div>
|
||||
<div class="arrow" aria-hidden="true"></div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="k">Agents</div>
|
||||
<div class="v">Auto execution</div>
|
||||
<div class="d">Run checks, fetch data, compute deltas</div>
|
||||
<div class="arrow" aria-hidden="true"></div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="k">Output</div>
|
||||
<div class="v">Validation report</div>
|
||||
<div class="d">Per-file findings + evidence</div>
|
||||
<div class="arrow" aria-hidden="true"></div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="k">Action</div>
|
||||
<div class="v">Review & email</div>
|
||||
<div class="d">Business approves → email to CEC manager</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<h2>Risks & Mitigations</h2>
|
||||
<div class="compare">
|
||||
<div class="callout">
|
||||
<h3>Delays <span class="tag risk">risk</span></h3>
|
||||
<ul>
|
||||
<li>SOP agent implementation had higher-than-expected complexity.</li>
|
||||
<li>Extra tuning needed for consistently correct, actionable SOPs.</li>
|
||||
<li>Prioritized SGS & IBM first (more complex than others).</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="callout good">
|
||||
<h3>Mitigations <span class="tag ok">in place</span></h3>
|
||||
<ul>
|
||||
<li>Restructured SOP content to provide clearer inputs.</li>
|
||||
<li>Rebalanced resources to speed up development.</li>
|
||||
<li>Focus on early stability before scaling scenarios.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Timeline renderer that mirrors the provided Mermaid Gantt:
|
||||
// - dateFormat YYYY-MM-DD
|
||||
// - tickInterval 1month (month ticks at the 1st)
|
||||
// - todayMarker on
|
||||
// - sections + tasks already represented in DOM rows
|
||||
(function(){
|
||||
const parseUTC = (s) => {
|
||||
const [y,m,d] = s.split('-').map(Number);
|
||||
return Date.UTC(y, m-1, d);
|
||||
};
|
||||
|
||||
const clamp01 = (v) => Math.max(0, Math.min(1, v));
|
||||
|
||||
const fmtYYYYMM = (utcMs) => {
|
||||
const d = new Date(utcMs);
|
||||
const y = d.getUTCFullYear();
|
||||
const m = String(d.getUTCMonth() + 1).padStart(2,'0');
|
||||
return `${y}-${m}`;
|
||||
};
|
||||
|
||||
const monthStartUTC = (utcMs) => {
|
||||
const d = new Date(utcMs);
|
||||
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);
|
||||
};
|
||||
|
||||
const nextMonthStartUTC = (utcMs) => {
|
||||
const d = new Date(utcMs);
|
||||
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);
|
||||
};
|
||||
|
||||
document.querySelectorAll('.gantt').forEach((gantt) => {
|
||||
// Collect all tasks to derive the exact window (like Mermaid does)
|
||||
const ranged = Array.from(gantt.querySelectorAll('.bar[data-start][data-end]'))
|
||||
.map((el) => ({ start: parseUTC(el.dataset.start), end: parseUTC(el.dataset.end) }));
|
||||
const milestones = Array.from(gantt.querySelectorAll('.bar.milestone-bar[data-at]'))
|
||||
.map((el) => ({ at: parseUTC(el.dataset.at) }));
|
||||
|
||||
const allStarts = ranged.map(x => x.start);
|
||||
const allEnds = ranged.map(x => x.end);
|
||||
const allAts = milestones.map(x => x.at);
|
||||
|
||||
// Fallback to existing dataset if something is missing
|
||||
const fallbackStart = gantt.dataset.ganttStart ? parseUTC(gantt.dataset.ganttStart) : Date.UTC(2025,11,17);
|
||||
const fallbackEnd = gantt.dataset.ganttEnd ? parseUTC(gantt.dataset.ganttEnd) : Date.UTC(2026,5,1);
|
||||
|
||||
const minDate = Math.min(fallbackStart, ...(allStarts.length ? allStarts : [fallbackStart]), ...(allAts.length ? allAts : [fallbackStart]));
|
||||
const maxDate = Math.max(fallbackEnd, ...(allEnds.length ? allEnds : [fallbackEnd]), ...(allAts.length ? allAts : [fallbackEnd]));
|
||||
|
||||
// Mermaid's tickInterval 1month: axis ticks at start of each month.
|
||||
// Start ticks at the month containing minDate; end at month containing maxDate.
|
||||
const axisStart = monthStartUTC(minDate);
|
||||
const axisEnd = nextMonthStartUTC(monthStartUTC(maxDate));
|
||||
const total = Math.max(1, axisEnd - axisStart);
|
||||
|
||||
// Build month ticks + labels
|
||||
const axis = gantt.querySelector('.axis');
|
||||
if (axis) {
|
||||
axis.innerHTML = '';
|
||||
|
||||
for (let t = axisStart; t <= axisEnd; t = nextMonthStartUTC(t)) {
|
||||
const left = clamp01((t - axisStart) / total) * 100;
|
||||
|
||||
const tick = document.createElement('div');
|
||||
tick.className = 'tick';
|
||||
tick.style.left = left + '%';
|
||||
axis.appendChild(tick);
|
||||
|
||||
// Label at each month start
|
||||
const label = document.createElement('div');
|
||||
label.className = 'axis-label';
|
||||
label.style.left = left + '%';
|
||||
label.textContent = fmtYYYYMM(t);
|
||||
axis.appendChild(label);
|
||||
}
|
||||
}
|
||||
|
||||
// Position ranged bars
|
||||
gantt.querySelectorAll('.bar[data-start][data-end]').forEach((bar) => {
|
||||
const s = parseUTC(bar.dataset.start);
|
||||
const e = parseUTC(bar.dataset.end);
|
||||
|
||||
const left = clamp01((s - axisStart) / total) * 100;
|
||||
const width = Math.max(0.8, clamp01((e - s) / total) * 100);
|
||||
|
||||
bar.style.left = left + '%';
|
||||
bar.style.width = width + '%';
|
||||
});
|
||||
|
||||
// Position milestone dots
|
||||
gantt.querySelectorAll('.bar.milestone-bar[data-at]').forEach((m) => {
|
||||
const at = parseUTC(m.dataset.at);
|
||||
const left = clamp01((at - axisStart) / total) * 100;
|
||||
m.style.left = left + '%';
|
||||
// keep it centered on the date
|
||||
m.style.transform = 'translateX(-50%)';
|
||||
});
|
||||
|
||||
gantt.querySelectorAll('.milestone-label[data-at]').forEach((ml) => {
|
||||
const at = parseUTC(ml.dataset.at);
|
||||
const left = clamp01((at - axisStart) / total) * 100;
|
||||
ml.style.left = left + '%';
|
||||
});
|
||||
|
||||
// Today marker (Mermaid todayMarker on)
|
||||
const todayStr = gantt.dataset.today;
|
||||
const today = todayStr ? parseUTC(todayStr) : Date.now();
|
||||
const tleft = clamp01((today - axisStart) / total) * 100;
|
||||
|
||||
const line = gantt.querySelector('.today-line');
|
||||
const label = gantt.querySelector('.today-label');
|
||||
if (line) line.style.left = tleft + '%';
|
||||
if (label) label.style.left = tleft + '%';
|
||||
|
||||
// Excludes weekends is ignored visually (Mermaid uses it for working-day calculations).
|
||||
// We intentionally map by calendar time for a clean axis.
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
接下来你的任务是和我一起完成一份项目进展的PPT。
|
||||
我们的任务边界是针对一个项目(H5:Billing Validator)进行一页的PPT。
|
||||
我会告知你一些关键板块,你来整理提炼出PPT的大致内容,然后根据这些内容使用HTML生成一页PPT。
|
||||
生成出来的PPT只需要一页即可,需要严格保证是16:9的比例。
|
||||
|
||||
|
||||
**注意**
|
||||
- 采用浅色背景深色文字的配色方案。
|
||||
- 结构应当清晰,内容简洁明了。
|
||||
- PPT内容应当尽量避免出现滚动条,如果内容过多需要进行适当的压缩和调整,确保在16:9的比例下完整展示所有内容。
|
||||
- PPT应当适配大屏展示,内容不应当贴边,保持一定的留白。
|
||||
|
||||
PPT当中的内容:
|
||||
|
||||
Timeline:
|
||||
```mermaid
|
||||
gantt
|
||||
title Billing Validation Enablement
|
||||
dateFormat YYYY-MM-DD
|
||||
axisFormat %Y-%m
|
||||
tickInterval 1month
|
||||
todayMarker on
|
||||
excludes weekends
|
||||
Section Agent Build Up
|
||||
FTE Wave1-SGS: 2025-12-17,2026-01-23
|
||||
FTE Wave2-Top3: 2026-01-19,2026-01-31
|
||||
FTE Wave3-Others(10+ Scenarios): 2026-02-02,2026-02-14
|
||||
PPM: 2026-02-24, 2026-04-30
|
||||
Chat: 2026-05-06,2026-06-01
|
||||
Section Data Integration
|
||||
S/T Solution: 2026-01-19,2026-02-18
|
||||
SIT: 2026-02-21,2026-02-28
|
||||
L/T Solution:
|
||||
Section Product Engineering (MVP)
|
||||
PRD Draft: milestone,2026-01-16,2026-01-16
|
||||
Req. Alignment: 2026-01-19,2026-01-23
|
||||
MPV Dev.: 2026-01-26,2026-03-06
|
||||
Additional Dev.: 2026-03-06,2026-03-15
|
||||
SIT: 2026-03-09,2026-03-18
|
||||
UAT: 2026-03-19,2026-03-27
|
||||
Go live: milestone, 2026-03-31, 2026-03-31
|
||||
```
|
||||
给了一个mermaid格式的时间线,你不一定要照搬,你可以根据内容进行调整和优化。
|
||||
|
||||
Solution
|
||||
核心是业务同学整体对vendor提供的billing file进行validate的SOP,然后我们的AI系统将其拆解为可以分步执行的计划,然后由agent自动执行这些计划,针对每一份billing file生成对应的validation report,交由业务同学review以后自动给CEC manager发邮件。这块内容怎么呈现我还没有想好,你可以先想一想,有什么想法可以和我讨论一下。我会觉得这块是比较重要的内容。
|
||||
|
||||
|
||||
What Has Been Done
|
||||
1. Agent Build-up
|
||||
- SGS+TOP3 implemented(9 Scenes)
|
||||
- 3 Scenes in implementation
|
||||
- On track for Feb 14th FTE completion
|
||||
2. Data Integration
|
||||
- Aligned with data team
|
||||
- POC w/ dummy data ready, start data link testing Product
|
||||
3. Product Engineering
|
||||
- PRD Aligned with IT team, no major issue
|
||||
- MPV in dev, targeting mid-March delivery
|
||||
4. Reviews
|
||||
- EA review pass
|
||||
- BIA Checkpoint review pass
|
||||
|
||||
Next Steps
|
||||
1. Agent Build-up
|
||||
- Implementation of 8 Scenes
|
||||
- Fixing issues found during testing
|
||||
2. Data Integration
|
||||
- LUDP data link testing
|
||||
- Working on long term solution with data team
|
||||
3. Product Engineering
|
||||
- MVP development
|
||||
4. Reviews
|
||||
- Legal review(RAI/PDD) on going
|
||||
- Security review pending dev complete
|
||||
|
||||
Delays
|
||||
- The SOP agent implementation involved higher-than-expected complexity
|
||||
- Additional tuning was required to consistently generate correct and actionable SOPs
|
||||
- We prioritized SGS and IBM, which is more complicated than others
|
||||
|
||||
Mitigations
|
||||
- Restructured SOP content to provide clearer inputs.
|
||||
- Rebalanced resources to speed up development, avoiding further delays
|
||||
@@ -0,0 +1,7 @@
|
||||
你的任务是和我一起规划一个春节期间的旅游计划
|
||||
|
||||
我在今年春节期间打算在上海附近开车玩一玩。
|
||||
只有我和我女朋友两个人,我们两个都属于比较低能量的人,不太想凑热闹。更偏好于随性而游,非常不喜欢去参加人挤人的场景。
|
||||
你帮我想想可以怎么个玩法。去年我们是从浦东出发开车往北边走了走,主要是想放烟花但是上海买不到。这次粗浅的想法是青浦出发开车往苏州那边走一走。
|
||||
我还没啥太好的想法,你可以和我讨论,再确定方案
|
||||
你可以使用网络搜索功能来查找一些适合春节期间的旅游景点和活动,尤其是那些不太拥挤的地方。
|
||||
@@ -0,0 +1,145 @@
|
||||
# 春节上海周边自驾旅行计划(执行版:方案1)
|
||||
|
||||
> 本文件已从“讨论稿”收敛为你们确认的 **方案1**(2天1夜)。
|
||||
> 目标:不早起、每天驾驶≤4h、尽量不排队不人挤人、体验江南年味与夜景。
|
||||
|
||||
## 总原则(你们这趟的“体验护栏”)
|
||||
1. **每半天只安排 1 个主活动**(其余留白:累了就撤)。
|
||||
2. **不排队**:看到需要等位/排队就换下一家/下一段路。
|
||||
3. **热门点只做“外围快闪”**:只要氛围,不求打卡齐全。
|
||||
4. **停车优先**:宁可多走 10 分钟,也不要为停车消耗情绪。
|
||||
|
||||
---
|
||||
|
||||
## 行程总览
|
||||
- **Day 1**:上海(青浦)→ 苏州;下午古城外围慢走;晚上平江路/山塘街夜游;(可选)烟花;住一晚
|
||||
- **Day 2**:中午后出门 → 金鸡湖傍晚夜景 → 晚饭后返程
|
||||
- **备选Day 2**:寒山寺外围/短进短出(触发条件见下)
|
||||
|
||||
### 驾驶时间预算(控制在≤4h/天)
|
||||
- Day 1:青浦→苏州 单程约 1.5–2.5h + 市内短途(尽量不“跨城来回横跳”)
|
||||
- Day 2:苏州→青浦 单程约 1.5–2.5h + 市内短途
|
||||
|
||||
---
|
||||
|
||||
## Day 1(不早起版):古城外围 + 夜游年味
|
||||
|
||||
### 1) 出发与抵达
|
||||
- **建议出发**:10:30–12:30(不早起&兼顾路况的折中)
|
||||
- **抵达后第一件事**:先解决“停车 + 休息 + 上厕所”三件套,然后再开始走。
|
||||
|
||||
### 2) 下午主活动(选1段即可,60–120分钟)
|
||||
目标是“有江南水城味道,但空间更开阔、可随时撤”。
|
||||
- 选择方向(原则):
|
||||
- **护城河/河道边的可步行空间**
|
||||
- **古城非核心窄巷**(避开最挤的中心段)
|
||||
- **可随时拐进室内**(避冷/避风/避人流)
|
||||
|
||||
> 执行提示:下午只做“走一段 + 找个地方吃点东西/歇一歇”,不要把体力花光。
|
||||
|
||||
### 3) 晚上主活动:平江路/山塘街“夜游快闪”
|
||||
- 核心打法:**只看灯光与氛围**,不追网红店、不坐热门游船。
|
||||
- **快闪时长**:20–60分钟(觉得人多就直接撤)
|
||||
- 你们的优势:可以晚一点玩,所以尽量避开“饭点+黄金时段”的最拥挤波峰。
|
||||
|
||||
### 4) 住宿(300–500/晚,住得舒服但不度假)
|
||||
- 选址原则:
|
||||
1. **停车方便**(最好酒店自带/附近有大停车场)
|
||||
2. **隔音与干净**(比景观更重要)
|
||||
3. **晚到好入住**(前台服务时间/自助入住)
|
||||
4. 不强求住在老街旁(会显著增加堵车与停车成本)
|
||||
|
||||
---
|
||||
|
||||
## 烟花模块(可选):怎么买、在哪放、怎么不踩雷
|
||||
|
||||
> 重要前提:各地对烟花爆竹管控差异很大,春节期间执法也更严格。
|
||||
> 我这里给的是“低风险策略”,并**不保证某地一定允许燃放**。
|
||||
|
||||
### 你们要的体验目标
|
||||
- 不是“放很大很久”,而是“有年味、拍两张、听个响、10分钟内收工”。
|
||||
|
||||
### 购买策略(尽量减少信息不确定性)
|
||||
- **优先选择正规渠道**:大型连锁超市/合规烟花销售点(更可能明确告知哪里能放、什么能放)。
|
||||
- **买小而简单的**:仙女棒/小喷花/小鞭炮(如果当地允许),避免体积大、噪声巨大的。
|
||||
- 现场确认三件事:
|
||||
1. 是否 **允许购买/携带/运输**(有些地方可能限制)
|
||||
2. 具体 **可燃放区域**(如果对方说不清楚就别买大件)
|
||||
3. 是否有 **指定时间段**
|
||||
|
||||
### 燃放地点选择(低风险“选址原则”)
|
||||
- 目标是“空旷、远离建筑与人群、好撤离、能停车”。
|
||||
- **推荐选址类型**(按优先级):
|
||||
1. 远离老城核心的 **空旷广场/河堤开阔地**(确认不影响行人)
|
||||
2. **郊外停车场附近空地**(确认非禁放区)
|
||||
3. **民宿/酒店允许的室外区域**(必须先问清规则)
|
||||
- **强烈不建议**:老街巷子、桥上、人多的湖边步道、景区出入口。
|
||||
|
||||
### 最小安全清单(建议就按这个执行)
|
||||
- 打火机/点火器、一次性手套、纸巾/湿巾、装垃圾的袋子、少量水(灭火/清理)
|
||||
- 规则:只放一小会儿;放完马上清理;旁边有人多就不放。
|
||||
|
||||
---
|
||||
|
||||
## Day 2(默认主线):金鸡湖傍晚夜景 + 晚饭后返程
|
||||
|
||||
### 1) 出门时间
|
||||
- 你们不早起:建议 **中午前后出门** 或 **午饭后再出发**。
|
||||
|
||||
### 2) 主活动:金鸡湖步道(偏“走走看看+拍夜景”)
|
||||
- 体验目标:吹风、散步、看城市灯光倒影。
|
||||
- 避人流方式:
|
||||
1. **不一定进最核心商圈**,走相对开阔的湖边段即可
|
||||
2. 拍完夜景就撤,不把体力消耗在“找停车/找座位”等琐事上
|
||||
|
||||
### 3) 返程
|
||||
- 晚饭后返程,你们可接受晚到:这一点能换到更好的夜景体验。
|
||||
|
||||
---
|
||||
|
||||
## Day 2 备选:寒山寺(短进短出/外围为主)
|
||||
|
||||
### 触发条件(满足任意一条就启用备选或直接跳过)
|
||||
- 你们当天状态一般,不想走太多;
|
||||
- 金鸡湖附近明显人潮/停车压力过大;
|
||||
- 你们更想“新年祈福/年味宗教氛围”而非城市夜景。
|
||||
|
||||
### 人流判断(春节大概率拥挤)
|
||||
- 寒山寺属于春节期间典型热门点,**白天更容易拥堵**。
|
||||
- 你们不早起,因此更推荐:
|
||||
- **外围体验为主**(把它当“年味氛围点”)
|
||||
- 或者 **晚一点再去**(以现场开放与限流为准)
|
||||
|
||||
### 动线建议(低能量版)
|
||||
- 停车优先:找“停车方便的点”→ 走到外围拍照/感受氛围 → 若入口排队明显则直接撤
|
||||
- 若决定入内:
|
||||
- 设定上限:排队>15分钟就放弃
|
||||
- 设定时长:入内停留 30–60分钟足够
|
||||
|
||||
### 与金鸡湖的取舍
|
||||
- 若选寒山寺为主线:金鸡湖改为“路过外围看两眼/不进商圈”。
|
||||
|
||||
---
|
||||
|
||||
## 吃什么(先按“低排队、年味、停车友好”来定)
|
||||
|
||||
> 你们这趟更适合“吃得顺、吃得稳”,而不是为了某家名店排队。
|
||||
|
||||
### Day 1(苏州):晚饭建议(年味/地方感更强)
|
||||
- 方向 1:**苏帮菜家常馆**(偏甜口、红烧、酱汁类)
|
||||
- 方向 2:**面馆/汤面**(更快、更不需要等位)
|
||||
- 方向 3:**小吃拼盘型**(但要警惕热门老街核心区排队)
|
||||
|
||||
挑店原则(你们用得上的):
|
||||
- 有停车/离停车点近;
|
||||
- 菜单简单、翻台快;
|
||||
- 不追“必吃榜”,看到排队就换。
|
||||
|
||||
### Day 2(苏州→返程前/路上):晚饭建议
|
||||
- 方向 1:金鸡湖附近 **商圈简餐/连锁**(省心、车位相对好找)
|
||||
- 方向 2:回程路上 **高速服务区补给**(不追求仪式感但很稳)
|
||||
- 方向 3:回上海后再吃夜宵(把拥堵和停车压力留在苏州外面)
|
||||
|
||||
### 你回答两个问题,我就把“吃饭清单”从建议变成可选组合
|
||||
1. 你们能接受苏州甜口吗?(能 / 不能 / 一般)
|
||||
2. 更想吃:A) 正餐桌菜 B) 面/馄饨/汤面 C) 小吃随便拼 D) 都行但不排队
|
||||
Reference in New Issue
Block a user