1645 lines
82 KiB
HTML
1645 lines
82 KiB
HTML
<!doctype html>
|
||
<html lang="vi">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>CASAN Core Member Training — FPT Japan · 2026</title>
|
||
<style>
|
||
:root {
|
||
--bg: #070a12;
|
||
--surface: #101522;
|
||
--surface-2: #151c2d;
|
||
--ink: #f5f7fb;
|
||
--muted: #9ea9bb;
|
||
--line: rgba(255,255,255,.12);
|
||
--orange: #f37021;
|
||
--blue: #00aeef;
|
||
--green: #7dbb42;
|
||
--red: #ff6262;
|
||
--amber: #ffbf5b;
|
||
--violet: #a98cff;
|
||
--ok: #6ed59b;
|
||
--shadow: 0 28px 80px rgba(0,0,0,.42);
|
||
}
|
||
* { box-sizing: border-box; }
|
||
html, body { width: 100%; height: 100%; margin: 0; overflow: hidden; }
|
||
body {
|
||
color: var(--ink);
|
||
background:
|
||
radial-gradient(900px 560px at -5% -10%, rgba(243,112,33,.20), transparent 58%),
|
||
radial-gradient(900px 620px at 105% 0%, rgba(0,174,239,.17), transparent 56%),
|
||
radial-gradient(800px 520px at 48% 120%, rgba(125,187,66,.11), transparent 62%),
|
||
var(--bg);
|
||
font-family: Inter, "Segoe UI", "Noto Sans", "Noto Sans JP", system-ui, sans-serif;
|
||
}
|
||
body::after {
|
||
content: "";
|
||
position: fixed;
|
||
inset: 0;
|
||
pointer-events: none;
|
||
opacity: .24;
|
||
background-image: radial-gradient(rgba(255,255,255,.13) .7px, transparent .7px);
|
||
background-size: 25px 25px;
|
||
}
|
||
a { color: #9edfff; }
|
||
button { font: inherit; }
|
||
.deck { position: fixed; inset: 0; z-index: 1; }
|
||
.slide {
|
||
position: absolute;
|
||
inset: 0;
|
||
display: none;
|
||
padding: 7.2vh 7vw 7.5vh;
|
||
align-content: center;
|
||
overflow: hidden;
|
||
}
|
||
.slide.active {
|
||
display: grid;
|
||
animation: enter .32s ease both;
|
||
}
|
||
@keyframes enter {
|
||
from { opacity: 0; transform: translateY(10px); }
|
||
to { opacity: 1; transform: none; }
|
||
}
|
||
.slide::before {
|
||
content: attr(data-section);
|
||
position: absolute;
|
||
left: 7vw;
|
||
top: 3.3vh;
|
||
color: var(--orange);
|
||
font: 800 11px/1.2 ui-monospace, SFMono-Regular, Consolas, monospace;
|
||
letter-spacing: .16em;
|
||
text-transform: uppercase;
|
||
}
|
||
h1, h2, h3, p { margin: 0; }
|
||
h1 {
|
||
max-width: 1050px;
|
||
font-size: clamp(46px, 5.6vw, 78px);
|
||
line-height: 1.03;
|
||
letter-spacing: -.038em;
|
||
}
|
||
h2 {
|
||
max-width: 1180px;
|
||
font-size: clamp(32px, 4vw, 55px);
|
||
line-height: 1.08;
|
||
letter-spacing: -.03em;
|
||
margin-bottom: .52em;
|
||
}
|
||
h3 {
|
||
font-size: clamp(20px, 1.8vw, 27px);
|
||
line-height: 1.2;
|
||
margin-bottom: .4em;
|
||
}
|
||
.lead {
|
||
max-width: 1060px;
|
||
margin-top: 1.1em;
|
||
color: var(--muted);
|
||
font-size: clamp(19px, 2vw, 29px);
|
||
line-height: 1.5;
|
||
}
|
||
.small {
|
||
color: var(--muted);
|
||
font-size: clamp(13px, 1.15vw, 17px);
|
||
line-height: 1.48;
|
||
}
|
||
.accent {
|
||
color: transparent;
|
||
background: linear-gradient(100deg, var(--orange), #ffba78 42%, var(--blue));
|
||
-webkit-background-clip: text;
|
||
background-clip: text;
|
||
}
|
||
.blue { color: var(--blue); }
|
||
.green { color: var(--ok); }
|
||
.orange { color: var(--orange); }
|
||
.red { color: var(--red); }
|
||
.amber { color: var(--amber); }
|
||
.muted { color: var(--muted); }
|
||
.mono { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
|
||
.pill {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: .45em;
|
||
padding: .35em .72em;
|
||
border: 1px solid var(--line);
|
||
border-radius: 999px;
|
||
color: var(--muted);
|
||
font: 800 clamp(10px, .85vw, 13px)/1 ui-monospace, SFMono-Regular, Consolas, monospace;
|
||
letter-spacing: .08em;
|
||
text-transform: uppercase;
|
||
}
|
||
.pill.proven { color: #bdf2d1; border-color: rgba(110,213,155,.55); background: rgba(110,213,155,.08); }
|
||
.pill.partial { color: #ffd593; border-color: rgba(255,191,91,.5); background: rgba(255,191,91,.08); }
|
||
.pill.missing { color: #ffadad; border-color: rgba(255,98,98,.5); background: rgba(255,98,98,.08); }
|
||
.rule {
|
||
width: 94px;
|
||
height: 4px;
|
||
margin: 1.3em 0;
|
||
background: linear-gradient(90deg, var(--orange), var(--blue));
|
||
border-radius: 99px;
|
||
}
|
||
.big-quote {
|
||
max-width: 1120px;
|
||
font-size: clamp(34px, 4.7vw, 65px);
|
||
line-height: 1.13;
|
||
letter-spacing: -.035em;
|
||
font-weight: 830;
|
||
}
|
||
.split {
|
||
display: grid;
|
||
grid-template-columns: minmax(0,1fr) minmax(0,1fr);
|
||
gap: clamp(28px, 5vw, 78px);
|
||
align-items: center;
|
||
}
|
||
.split.wide-left { grid-template-columns: 1.2fr .8fr; }
|
||
.split.wide-right { grid-template-columns: .82fr 1.18fr; }
|
||
.stack { display: grid; gap: 1.2rem; }
|
||
.flat-list {
|
||
display: grid;
|
||
gap: .76em;
|
||
padding: 0;
|
||
margin: .5em 0 0;
|
||
list-style: none;
|
||
}
|
||
.flat-list li {
|
||
position: relative;
|
||
padding-left: 1.45em;
|
||
color: #e8edf7;
|
||
font-size: clamp(18px, 1.7vw, 25px);
|
||
line-height: 1.42;
|
||
}
|
||
.flat-list li::before {
|
||
content: "—";
|
||
position: absolute;
|
||
left: 0;
|
||
color: var(--orange);
|
||
font-weight: 900;
|
||
}
|
||
.flat-list.tight { gap: .48em; }
|
||
.flat-list.tight li { font-size: clamp(15px, 1.3vw, 19px); }
|
||
.metrics {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 1rem;
|
||
margin-top: 1.3rem;
|
||
}
|
||
.metric {
|
||
min-height: 170px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: flex-end;
|
||
padding: 1.2rem 1.25rem;
|
||
background: linear-gradient(160deg, rgba(255,255,255,.065), rgba(255,255,255,.025));
|
||
border-top: 3px solid var(--blue);
|
||
border-bottom: 1px solid var(--line);
|
||
}
|
||
.metric:nth-child(2) { border-top-color: var(--orange); }
|
||
.metric:nth-child(3) { border-top-color: var(--green); }
|
||
.metric .value {
|
||
font-size: clamp(35px, 4vw, 58px);
|
||
line-height: 1;
|
||
font-weight: 900;
|
||
letter-spacing: -.04em;
|
||
}
|
||
.metric .label {
|
||
margin-top: .62em;
|
||
color: var(--muted);
|
||
font-size: clamp(13px, 1.15vw, 17px);
|
||
line-height: 1.4;
|
||
}
|
||
.rail {
|
||
display: grid;
|
||
grid-template-columns: repeat(7, 1fr);
|
||
gap: .72rem;
|
||
margin-top: 1.6rem;
|
||
}
|
||
.rail-item {
|
||
min-height: 182px;
|
||
padding: 1rem .85rem;
|
||
border-top: 4px solid var(--orange);
|
||
background: rgba(255,255,255,.045);
|
||
border-bottom: 1px solid var(--line);
|
||
}
|
||
.rail-item:nth-child(4) { border-top-color: var(--red); }
|
||
.rail-item:nth-child(5) { border-top-color: var(--blue); }
|
||
.rail-item:nth-child(6) { border-top-color: var(--green); }
|
||
.rail-item:nth-child(7) { border-top-color: var(--violet); }
|
||
.rail-item b { display: block; font-size: 24px; margin-bottom: .5em; }
|
||
.rail-item span { color: var(--muted); font-size: clamp(12px, 1vw, 15px); line-height: 1.38; }
|
||
.ladder {
|
||
display: grid;
|
||
grid-template-columns: repeat(5, 1fr);
|
||
gap: .65rem;
|
||
align-items: end;
|
||
margin-top: 1rem;
|
||
}
|
||
.level {
|
||
padding: 1rem;
|
||
background: rgba(255,255,255,.045);
|
||
border-top: 3px solid var(--line);
|
||
min-height: 150px;
|
||
}
|
||
.level:nth-child(1) { min-height: 130px; }
|
||
.level:nth-child(2) { min-height: 160px; }
|
||
.level:nth-child(3) { min-height: 190px; }
|
||
.level:nth-child(4) { min-height: 235px; border-top-color: var(--orange); background: rgba(243,112,33,.08); }
|
||
.level:nth-child(5) { min-height: 275px; border-top-color: var(--blue); background: rgba(0,174,239,.07); }
|
||
.level strong { display: block; font-size: clamp(21px, 2vw, 29px); }
|
||
.level p { margin-top: .6em; color: var(--muted); font-size: clamp(12px, 1.05vw, 15px); line-height: 1.42; }
|
||
.level .num { color: var(--orange); font: 900 13px/1 ui-monospace, monospace; margin-bottom: .75em; }
|
||
.table-wrap {
|
||
border-top: 1px solid var(--line);
|
||
margin-top: .6rem;
|
||
}
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
table-layout: fixed;
|
||
}
|
||
th, td {
|
||
padding: .72em .78em;
|
||
border-bottom: 1px solid var(--line);
|
||
text-align: left;
|
||
vertical-align: top;
|
||
font-size: clamp(13px, 1.1vw, 17px);
|
||
line-height: 1.38;
|
||
}
|
||
th {
|
||
color: var(--blue);
|
||
font: 800 clamp(11px, .9vw, 14px)/1.2 ui-monospace, monospace;
|
||
letter-spacing: .08em;
|
||
text-transform: uppercase;
|
||
}
|
||
td:first-child { color: white; font-weight: 760; }
|
||
td { color: #cad3e3; }
|
||
.terminal {
|
||
position: relative;
|
||
padding: 1.25rem 1.35rem;
|
||
border: 1px solid rgba(255,255,255,.14);
|
||
border-radius: 15px;
|
||
background: rgba(2,4,9,.72);
|
||
box-shadow: var(--shadow);
|
||
color: #dce8ff;
|
||
font: 500 clamp(12px, 1.1vw, 16px)/1.64 ui-monospace, SFMono-Regular, Consolas, monospace;
|
||
white-space: pre-wrap;
|
||
overflow-wrap: anywhere;
|
||
}
|
||
.terminal::before {
|
||
content: "● ● ●";
|
||
display: block;
|
||
margin-bottom: .8rem;
|
||
color: #59637a;
|
||
letter-spacing: .35em;
|
||
}
|
||
.terminal .cmd { color: #ffd3af; }
|
||
.terminal .out { color: #a9efc2; }
|
||
.terminal .warn { color: #ffd07d; }
|
||
.terminal .bad { color: #ff9e9e; }
|
||
.copy {
|
||
position: absolute;
|
||
right: 12px;
|
||
top: 10px;
|
||
color: var(--muted);
|
||
border: 1px solid var(--line);
|
||
border-radius: 8px;
|
||
background: rgba(255,255,255,.04);
|
||
padding: .35em .65em;
|
||
cursor: pointer;
|
||
font-size: 11px;
|
||
}
|
||
.copy:hover { color: white; border-color: rgba(255,255,255,.3); }
|
||
.flow {
|
||
display: grid;
|
||
gap: 0;
|
||
margin-top: 1rem;
|
||
}
|
||
.flow-row {
|
||
display: grid;
|
||
grid-template-columns: 72px minmax(0,1fr);
|
||
gap: 1.2rem;
|
||
min-height: 74px;
|
||
align-items: start;
|
||
position: relative;
|
||
}
|
||
.flow-row:not(:last-child)::after {
|
||
content: "";
|
||
position: absolute;
|
||
left: 35px;
|
||
top: 42px;
|
||
bottom: -5px;
|
||
width: 2px;
|
||
background: linear-gradient(var(--orange), rgba(255,255,255,.18));
|
||
}
|
||
.flow-no {
|
||
width: 44px;
|
||
height: 44px;
|
||
display: grid;
|
||
place-items: center;
|
||
border-radius: 50%;
|
||
border: 2px solid var(--orange);
|
||
background: var(--bg);
|
||
color: white;
|
||
font-weight: 900;
|
||
z-index: 1;
|
||
}
|
||
.flow-copy strong { display: block; font-size: clamp(17px, 1.45vw, 22px); margin-bottom: .18em; }
|
||
.flow-copy span { color: var(--muted); font-size: clamp(13px, 1.05vw, 16px); line-height: 1.36; }
|
||
.bars { display: grid; gap: .6rem; }
|
||
.bar-row {
|
||
display: grid;
|
||
grid-template-columns: 120px minmax(0,1fr) 52px;
|
||
gap: .8rem;
|
||
align-items: center;
|
||
}
|
||
.bar-label { color: #dfe6f2; font: 800 14px/1 ui-monospace, monospace; }
|
||
.bar-track { height: 14px; background: rgba(255,255,255,.075); overflow: hidden; }
|
||
.bar-fill { height: 100%; background: linear-gradient(90deg, var(--orange), var(--blue)); }
|
||
.bar-value { text-align: right; font: 900 15px/1 ui-monospace, monospace; }
|
||
.callout {
|
||
padding: 1.15rem 1.25rem;
|
||
border-left: 4px solid var(--orange);
|
||
background: rgba(243,112,33,.07);
|
||
color: #e9eef8;
|
||
font-size: clamp(17px, 1.55vw, 23px);
|
||
line-height: 1.45;
|
||
}
|
||
.callout.blue { border-left-color: var(--blue); background: rgba(0,174,239,.07); color: #e9eef8; }
|
||
.callout.red { border-left-color: var(--red); background: rgba(255,98,98,.07); color: #e9eef8; }
|
||
.source-chip {
|
||
position: absolute;
|
||
right: 7vw;
|
||
bottom: 7vh;
|
||
color: #69758b;
|
||
font: 700 10px/1 ui-monospace, monospace;
|
||
letter-spacing: .08em;
|
||
text-transform: uppercase;
|
||
}
|
||
.speaker-notes { display: none; }
|
||
.brand {
|
||
position: fixed;
|
||
right: 26px;
|
||
top: 17px;
|
||
z-index: 10;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
}
|
||
.brand b {
|
||
font-size: 20px;
|
||
letter-spacing: -.03em;
|
||
color: transparent;
|
||
background: linear-gradient(90deg,var(--orange),var(--blue),var(--green));
|
||
-webkit-background-clip: text;
|
||
background-clip: text;
|
||
}
|
||
.brand span { color: #778299; font: 700 10px/1 ui-monospace, monospace; letter-spacing: .08em; }
|
||
.progress {
|
||
position: fixed;
|
||
left: 0;
|
||
top: 0;
|
||
height: 4px;
|
||
z-index: 11;
|
||
background: linear-gradient(90deg,var(--orange),var(--blue),var(--green));
|
||
transition: width .25s ease;
|
||
}
|
||
.footer {
|
||
position: fixed;
|
||
left: 26px;
|
||
right: 26px;
|
||
bottom: 16px;
|
||
z-index: 10;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
color: #677288;
|
||
font: 700 11px/1 ui-monospace, monospace;
|
||
}
|
||
.keys { display: flex; gap: .45rem; align-items: center; }
|
||
.key {
|
||
min-width: 22px;
|
||
padding: 3px 6px;
|
||
text-align: center;
|
||
border: 1px solid var(--line);
|
||
border-radius: 5px;
|
||
color: #8490a7;
|
||
}
|
||
.notes-panel {
|
||
position: fixed;
|
||
z-index: 30;
|
||
right: 22px;
|
||
top: 58px;
|
||
bottom: 54px;
|
||
width: min(540px, 42vw);
|
||
display: none;
|
||
overflow: auto;
|
||
padding: 1.2rem 1.3rem;
|
||
background: rgba(9,13,23,.96);
|
||
border: 1px solid rgba(255,255,255,.16);
|
||
border-radius: 16px;
|
||
box-shadow: var(--shadow);
|
||
}
|
||
.notes-panel.open { display: block; }
|
||
.notes-panel h3 { color: var(--orange); font-size: 16px; }
|
||
.notes-panel p, .notes-panel li {
|
||
color: #c8d0de;
|
||
font-size: 14px;
|
||
line-height: 1.55;
|
||
}
|
||
.notes-panel .sources {
|
||
margin-top: 1rem;
|
||
padding-top: 1rem;
|
||
border-top: 1px solid var(--line);
|
||
color: #9da8ba;
|
||
font-size: 12px;
|
||
line-height: 1.5;
|
||
}
|
||
.overview {
|
||
position: fixed;
|
||
z-index: 40;
|
||
inset: 24px;
|
||
display: none;
|
||
overflow: auto;
|
||
padding: 1.5rem;
|
||
background: rgba(5,8,14,.97);
|
||
border: 1px solid var(--line);
|
||
border-radius: 18px;
|
||
box-shadow: var(--shadow);
|
||
}
|
||
.overview.open { display: block; }
|
||
.overview h3 { margin-bottom: 1rem; color: var(--orange); }
|
||
.overview-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, minmax(0,1fr));
|
||
gap: .75rem;
|
||
}
|
||
.overview button {
|
||
min-height: 105px;
|
||
padding: .8rem;
|
||
color: #dfe6f1;
|
||
background: rgba(255,255,255,.04);
|
||
border: 1px solid var(--line);
|
||
text-align: left;
|
||
cursor: pointer;
|
||
}
|
||
.overview button:hover { border-color: var(--orange); background: rgba(243,112,33,.08); }
|
||
.overview button b { display: block; color: var(--orange); font: 800 11px/1 monospace; margin-bottom: .5em; }
|
||
.overview button span { font-size: 13px; line-height: 1.35; }
|
||
@media (max-width: 900px) {
|
||
.slide { padding-left: 5vw; padding-right: 5vw; }
|
||
.split { grid-template-columns: 1fr; gap: 1.4rem; }
|
||
.metrics, .rail { grid-template-columns: repeat(2,1fr); }
|
||
.ladder { grid-template-columns: 1fr; align-items: stretch; }
|
||
.level, .level:nth-child(n) { min-height: 0; }
|
||
.overview-grid { grid-template-columns: repeat(2,1fr); }
|
||
}
|
||
@media print {
|
||
html, body { overflow: visible; background: #070a12; }
|
||
.deck { position: static; }
|
||
.slide, .slide.active {
|
||
position: relative;
|
||
display: grid !important;
|
||
width: 13.333in;
|
||
height: 7.5in;
|
||
page-break-after: always;
|
||
}
|
||
.brand, .progress, .footer, .notes-panel, .overview { display: none !important; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="progress" id="progress"></div>
|
||
<div class="brand"><b>FPT</b><span>CASAN · CORE MEMBER TRAINING</span></div>
|
||
|
||
<main class="deck" id="deck">
|
||
<section class="slide active" data-section="Mở đầu">
|
||
<div>
|
||
<span class="pill proven">Core member enablement · 29/07/2026</span>
|
||
<div class="rule"></div>
|
||
<h1>CASAN không phải một lệnh cài đặt.<br><span class="accent">CASAN là cách tổ chức chịu trách nhiệm khi dùng AI.</span></h1>
|
||
<p class="lead">Tư tưởng · cài đặt · vận hành · Level 4 · Level 5 · kiểm soát token · demo NEHOPS Basic Design.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Mở bằng sự khác biệt giữa “có AI tool” và “có năng lực vận hành AI”. Mục tiêu buổi học không phải thuộc câu lệnh, mà hiểu bằng chứng nào cho phép chúng ta tin một kết quả AI.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
docs/guides/CASAN_USING_FOR_REAL_PROJECTS_VI.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Mục tiêu đào tạo">
|
||
<div>
|
||
<h2>Kết thúc buổi học, mỗi core member phải tự trả lời được 6 câu hỏi</h2>
|
||
<div class="split">
|
||
<ol class="flat-list" style="counter-reset:item">
|
||
<li>CASAN kiểm soát điều gì mà coding agent không kiểm soát?</li>
|
||
<li><code>casan init</code> tạo gì — và tuyệt đối không tạo gì?</li>
|
||
<li>Một run được gọi là có bằng chứng khi nào?</li>
|
||
</ol>
|
||
<ol class="flat-list">
|
||
<li>Level 4 khác “có nhiều script” ở điểm nào?</li>
|
||
<li>Level 5 đòi hỏi thay đổi cấp tổ chức ra sao?</li>
|
||
<li>Token giảm bao nhiêu, đo bằng nguồn nào, có mất nghĩa không?</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Dùng sáu câu hỏi này làm pre-test và post-test. Nếu thành viên chỉ nhớ command nhưng không phân biệt evidence, estimate và provider telemetry, buổi đào tạo chưa đạt.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Nội dung tổng hợp từ source CASAN và yêu cầu đào tạo của người dùng.
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="FPT Japan · bối cảnh 2026">
|
||
<div>
|
||
<h2>CASAN đi đúng hướng FPT Japan: AI-First cho legacy modernization, nhưng phải scale có kiểm soát</h2>
|
||
<div class="metrics">
|
||
<div class="metric"><div class="value">$1B</div><div class="label">Mục tiêu doanh thu thị trường Nhật năm 2027; mũi nhọn gồm Legacy Modernization, AI, Automotive, ERP.</div></div>
|
||
<div class="metric"><div class="value">~60%</div><div class="label">Hệ thống IT tại Nhật được FPT nêu là đã vận hành trên 20 năm — áp lực hiện đại hóa rất lớn.</div></div>
|
||
<div class="metric"><div class="value">800K</div><div class="label">Thiếu hụt nhân lực IT dự báo đến 2030; AI phải tăng năng suất mà không hạ chuẩn chất lượng.</div></div>
|
||
</div>
|
||
<p class="lead">FPT chính thức giới thiệu CASAN năm 2026 như khung 5 cấp để đi từ thử nghiệm rời rạc đến vận hành AI ở quy mô doanh nghiệp.</p>
|
||
</div>
|
||
<span class="source-chip">Nguồn công khai FPT · 2025–2026</span>
|
||
<aside class="speaker-notes">
|
||
<p>Liên hệ trực tiếp với dự án NEHOPS: đây là bài toán chuyển đổi hệ thống VB lâu năm sang Angular/Java, đúng nhóm legacy modernization mà FPT Japan đang ưu tiên. CASAN phải giúp tăng quy mô mà vẫn giữ traceability, tiếng Nhật, security và khả năng audit.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
<a href="https://fpt.com/en/news/fpt-news/fpt-japan-surpasses-500-million-usd-in-revenue-targets-1-billion-usd-by-2027">FPT Japan surpasses USD 500M, targets USD 1B by 2027 — 05/02/2025</a><br>
|
||
<a href="https://fpt.com/en/news/fpt-news/300-lanh-dao-doanh-nghiep-nhat-ban-ban-chien-luoc-chuyen-doi-ai-cung-fpt-tai-ha-long">More than 300 Japanese Business Leaders Discuss AI Strategies with FPT — 03/07/2026</a><br>
|
||
<a href="https://fpt.com/en/news/fpt-news/fpt-va-forrester-cong-bo-bao-cao-toan-cau-ve-chuyen-doi-ai">FPT study: From pilots to reusable platforms — 08/07/2026</a>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Tư tưởng CASAN">
|
||
<div class="big-quote">Model tạo ra <span class="accent">đề xuất</span>.<br>Harness quyết định đề xuất có được <span class="accent">tin, thực thi và chứng nhận</span> hay không.</div>
|
||
<div class="rule"></div>
|
||
<p class="lead">Nhanh không đủ. Phải đúng nguồn, đúng quyền, qua gate, có người chịu trách nhiệm và có evidence tái kiểm chứng.</p>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là câu lõi cần “thấm”. Model không tự tuyên bố DONE. Output đẹp không đồng nghĩa output đúng. CASAN tách quyền sinh nội dung khỏi quyền gây side effect.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/guides/CASAN_USING_FOR_REAL_PROJECTS_VI.md<br>
|
||
docs/output/casan/casan-higher-level-criteria.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Kiến trúc tư duy">
|
||
<div>
|
||
<h2>Bảy harness là bảy câu hỏi bắt buộc trước khi tin AI</h2>
|
||
<div class="rail">
|
||
<div class="rail-item"><b>H1</b><span>Đúng context? Có cũ, thừa hoặc thiếu không?</span></div>
|
||
<div class="rail-item"><b>H2</b><span>Đúng tool, đúng quyền, chạy lại có an toàn?</span></div>
|
||
<div class="rail-item"><b>H3</b><span>Output có qua tiêu chí và regression?</span></div>
|
||
<div class="rail-item"><b>H4</b><span>Injection, secret, PII, egress đã bị chặn?</span></div>
|
||
<div class="rail-item"><b>H5</b><span>Ai duyệt, theo policy nào, log có bị sửa?</span></div>
|
||
<div class="rail-item"><b>H6</b><span>Token, cost, latency, retry, failure có được đo?</span></div>
|
||
<div class="rail-item"><b>H7</b><span>Retry, fallback, rollback, orchestration có giới hạn?</span></div>
|
||
</div>
|
||
<p class="lead"><strong>Harness yếu nhất quyết định trần.</strong> H1/H3 mạnh không bù được H4/H5/H6 bằng 0.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Khi review một project, đừng bắt đầu bằng “có agent nào”. Bắt đầu bằng bảy câu hỏi. Mỗi câu trả lời phải trỏ đến evidence, không chỉ trỏ đến file config.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
harness_Review/casan_harness_assessment.md trong dự án demo<br>
|
||
docs/output/casan/casan-level4-assessment.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Khái niệm dễ nhầm">
|
||
<div>
|
||
<h2>Edition là thứ được đóng gói. Maturity là năng lực đã được chứng minh.</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Trục</th><th>Câu hỏi</th><th>Ví dụ</th><th>Sự thật sau init</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>Product edition</td><td>CASAN ship những capability nào?</td><td>Core, DevKit, Platform Preview</td><td>Enterprise bị từ chối vì chưa được ship</td></tr>
|
||
<tr><td>Maturity L1–L5</td><td>Tổ chức đã vận hành và giữ evidence đến đâu?</td><td>L4 Automated, L5 Native</td><td><code>level: null</code>, <code>not_assessed</code></td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<div class="callout red" style="margin-top:1.2rem"><strong>Không được nói:</strong> “Đã chạy <code>casan init</code> nên project đạt Level 4.”</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Source của init chủ động tách hai taxonomy. Khi chọn enterprise, lệnh trả lỗi thay vì tạo adoption “giả hoàn chỉnh”. Đây là guardrail về claim.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
packages/casan-devkit/casan-init.py — cmd_init, cmd_level<br>
|
||
docs/packaging/EDITION_FEATURE_LIMITATION_MATRIX.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Bản đồ trưởng thành">
|
||
<div>
|
||
<h2>Năm cấp không phải năm nhãn — là năm thay đổi trong cách vận hành</h2>
|
||
<div class="ladder">
|
||
<div class="level"><div class="num">L1</div><strong>Curious</strong><p>Cá nhân thử AI, chưa có chuẩn chung.</p></div>
|
||
<div class="level"><div class="num">L2</div><strong>Augmented</strong><p>Dùng tool được duyệt, tăng năng suất từng công việc.</p></div>
|
||
<div class="level"><div class="num">L3</div><strong>Standard</strong><p>Quy trình, template, review gate và test lặp lại được.</p></div>
|
||
<div class="level"><div class="num">L4</div><strong>Automated</strong><p>H4/H5/H6 là runtime gate; side effect có policy + approval + evidence.</p></div>
|
||
<div class="level"><div class="num">L5</div><strong>Native</strong><p>Tái dùng đa dự án; drift, fallback, rollback, KPI và governance tập trung hoạt động thật.</p></div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>L4 là trọng tâm buổi học: automation phải chạy quanh hành động thật. L5 không chỉ thêm feature; nó gắn agent decision với outcome và cơ chế tự phục hồi có giới hạn.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
<a href="https://fpt.com/en/news/fpt-news/fpt-gianh-9-giai-thuong-sao-khue">FPT Wins 9 Sao Khue Awards — CASAN five-level framework, 2026</a>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Cài đặt">
|
||
<div class="split wide-right">
|
||
<div>
|
||
<h2><code>casan init</code> là enrollment ở cấp repository</h2>
|
||
<ul class="flat-list tight">
|
||
<li>Pin runtime/version/hash</li>
|
||
<li>Merge hook Claude/Codex</li>
|
||
<li>Bật enforce/observe</li>
|
||
<li>Tạo state/log root</li>
|
||
<li>DevKit thêm Domain Pack + CI template</li>
|
||
<li>Kết nối dashboard/ingest nếu cấu hình</li>
|
||
</ul>
|
||
</div>
|
||
<div class="terminal"><button class="copy">COPY</button><span class="cmd">cd "/path/to/project"
|
||
casan init \
|
||
--project nehops-bd-v27 \
|
||
--edition devkit \
|
||
--runtime managed \
|
||
--client claude,codex \
|
||
--mode enforce
|
||
|
||
casan doctor
|
||
casan readiness --refresh
|
||
casan verify-harness</span></div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Managed runtime phù hợp máy developer và CI được quản lý. Vendored dành cho offline/air-gapped. Re-init giữ runtime mode cũ nếu không chỉ định lại. Init merge config, không clobber command hiện có.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/packaging/ADOPTION_GUIDE.md<br>
|
||
packages/casan-devkit/casan-init.py
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Cài đặt · ranh giới">
|
||
<div>
|
||
<h2>Init không thể provision những thứ thuộc hạ tầng, tổ chức và hợp đồng</h2>
|
||
<div class="split">
|
||
<div class="stack">
|
||
<span class="pill missing">Không do init tạo</span>
|
||
<ul class="flat-list tight">
|
||
<li>Enterprise OIDC / CA / private network</li>
|
||
<li>Cloud KMS, HSM, S3 Object Lock/WORM</li>
|
||
<li>HA topology, RPO/RTO, failover</li>
|
||
<li>On-call, uptime SLA, service credit</li>
|
||
<li>External pentest hoặc chứng nhận</li>
|
||
</ul>
|
||
</div>
|
||
<div class="callout"><strong>CASAN cung cấp building blocks và evidence contract.</strong><br><br>Khách hàng/FPT phải triển khai dịch vụ thật, vận hành thật và thuê đánh giá độc lập.</div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Nhấn mạnh trách nhiệm phân chia: repo team sở hữu Domain Pack và CI; platform/operations sở hữu IdP, KMS, WORM, observability, DR; security/legal sở hữu audit, risk acceptance và SLA.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/packaging/EDITION_FEATURE_LIMITATION_MATRIX.md<br>
|
||
infra/production/README.md<br>
|
||
docs/compliance/EXTERNAL_SECURITY_REVIEW_SCOPE.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Cài đặt · demo probe">
|
||
<div>
|
||
<h2>Probe trên bản sao cấu trúc NEHOPS: Core chạy, nhưng còn 3 việc phải xử lý ngay</h2>
|
||
<div class="metrics">
|
||
<div class="metric"><div class="value">1.0.7</div><div class="label">Harness được pin bằng SHA-256; DevKit init thành công.</div></div>
|
||
<div class="metric"><div class="value amber">ATTN</div><div class="label">Codex hook đã tạo nhưng chưa trust; cần mở <code>/hooks</code>.</div></div>
|
||
<div class="metric"><div class="value red">0</div><div class="label">Chưa có project manifest và chưa quan sát provider token/cost.</div></div>
|
||
</div>
|
||
<p class="lead">Kết quả thật: <code>ready_with_attention</code>; maturity vẫn là <code>not_assessed</code>.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Probe được chạy ngày 29/07/2026 trên một thư mục tạm chứa đúng cấu trúc instruction/hook tiêu biểu của NEHOPS. Không thay đổi project gốc. Claude route operational; Codex route action_required.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Output thực tế của packages/casan-devkit/casan-init.py init --json, 29/07/2026.<br>
|
||
packages/casan-harness/scripts/python/readiness.py
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Sau init">
|
||
<div>
|
||
<h2>Những file scaffold phải được thay bằng sự thật của project — không giữ placeholder</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Artifact</th><th>Điền bằng evidence NEHOPS</th><th>Không được làm</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>requirement.md</td><td>FR từ CLAUDE.md + BD_Instruction.md: tiếng Nhật, lowercase ID, no-inference, thứ tự review</td><td>Giữ FR-01 health placeholder</td></tr>
|
||
<tr><td>architecture.md</td><td>VB.NET → AST → BD → Angular/Java; Windows analyzer; output boundaries</td><td>Tự bịa runtime/deployment</td></tr>
|
||
<tr><td>traceability-map.json</td><td>FR → VB/AST/instruction → reviewed output/review report</td><td>Map vào file không tồn tại</td></tr>
|
||
<tr><td>golden-runs/</td><td>FRR04701 reviewed output + final review, sau khi kiểm tra dữ liệu nhạy cảm</td><td>Dùng draft chưa review làm golden</td></tr>
|
||
<tr><td>corpus/</td><td>Benign tiếng Nhật + red-team injection/secret/PII theo domain</td><td>Chỉ dùng corpus tiếng Anh mẫu</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Domain Pack template hiện chỉ là khung. Golden phải là output đã qua Round 4. Red-team cần tiếng Nhật và tình huống “source comment chứa chỉ dẫn độc”. Traceability không chỉ map code-test kiểu web app; với document pipeline có thể map requirement → source/AST → validator/review evidence.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
packages/casan-devkit/templates/domain-pack/<br>
|
||
docs/packaging/DOMAIN_PACK_GUIDE.md<br>
|
||
Dự án demo: CLAUDE.md, BD/instructions/BD_Instruction.md, BD/output_reviewed/frr04701/
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Prompt mở đầu">
|
||
<div class="split wide-right">
|
||
<div>
|
||
<h2>Prompt đầu tiên phải là preflight read-only, không phải “hãy chạy toàn bộ”</h2>
|
||
<div class="callout blue">Mục tiêu của prompt đầu: xác nhận scope, nguồn chuẩn, vùng được ghi, tool được phép và acceptance evidence.</div>
|
||
</div>
|
||
<div class="terminal"><button class="copy">COPY</button><span class="cmd">Thực hiện CASAN onboarding preflight cho NEHOPS BD v2.7.
|
||
|
||
CHẾ ĐỘ: READ-ONLY. Không sửa VB-Source, AST-outputs,
|
||
BD/output, BD/output_reviewed, ref_docs hoặc instruction.
|
||
|
||
Đọc theo thứ tự:
|
||
1. CLAUDE.md
|
||
2. BD/instructions/BD_Instruction.md
|
||
3. .github/skills/common-knowhow/README.md
|
||
4. .claude/commands/bd/boss.md
|
||
5. harness_Review/nehops_casan_assessment.md
|
||
|
||
Yêu cầu:
|
||
- Liệt kê evidence H1–H7 bằng đường dẫn cụ thể.
|
||
- Phát hiện mâu thuẫn trong assessment hiện có.
|
||
- Chỉ ra Domain Pack cần điền sau casan init.
|
||
- Không suy đoán logic thiếu; ghi UNKNOWN kèm evidence thiếu.
|
||
- Không tự tuyên bố Level; đề xuất acceptance test cần chạy.
|
||
- Trả lời trong chat, không tạo file.</span></div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Prompt này tránh việc agent ngay lập tức sửa tài liệu. Sau preflight, team review và mới cấp action có quyền ghi. Có thể dùng tiếng Nhật cho khách hàng; nội dung kiểm soát không thay đổi.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dựa trực tiếp vào instruction và folder thực tế của dự án demo.<br>
|
||
docs/casan/CASAN_PROMPT_ENFORCEMENT.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Vận hành hằng ngày">
|
||
<div class="split wide-left">
|
||
<div>
|
||
<h2>Luồng vận hành đúng: evidence được tạo quanh hành động thật</h2>
|
||
<div class="flow">
|
||
<div class="flow-row"><div class="flow-no">1</div><div class="flow-copy"><strong>Admission</strong><span>H4 scan input; H5 phân loại risk và quyền.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">2</div><div class="flow-copy"><strong>Governed execution</strong><span>Command/action đã đăng ký, timeout, audit, idempotency nếu có side effect.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">3</div><div class="flow-copy"><strong>Evaluation</strong><span>H3 test/golden/review; fail thì retry có giới hạn.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">4</div><div class="flow-copy"><strong>Finalize</strong><span>H4 scan output; H6 ghi token/cost/latency; H5 seal evidence.</span></div></div>
|
||
</div>
|
||
</div>
|
||
<div class="terminal"><span class="cmd">casan verify-harness
|
||
casan gate
|
||
casan run in.txt out.txt step -- command...
|
||
casan report latest
|
||
casan pack <run-id>
|
||
casan verify-pack <run-id></span></div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Không chạy command nguy hiểm trực tiếp rồi mới “ghi log sau”. Gate phải ở trước side effect; metrics bao quanh thực thi; output lại qua security scan.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-level4-assessment.md<br>
|
||
docs/guides/CASAN_USING_FOR_REAL_PROJECTS_VI.md<br>
|
||
bin/casan
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Evidence">
|
||
<div>
|
||
<h2>Evidence Pack trả lời câu hỏi khó nhất: “Vì sao được phép tin run này?”</h2>
|
||
<div class="split">
|
||
<div class="stack">
|
||
<span class="pill proven">Chain of custody</span>
|
||
<ul class="flat-list tight">
|
||
<li>H1–H7 reports</li>
|
||
<li>Decision log và approver identity</li>
|
||
<li>Token/cost/latency/failure evidence</li>
|
||
<li>Manifest hash và signature status</li>
|
||
<li>Certification withheld nếu thiếu gate</li>
|
||
</ul>
|
||
</div>
|
||
<div class="terminal"><span class="cmd">$ casan verify-pack run-2026-07-29</span>
|
||
<span class="out">EVIDENCE_PACK_VALID</span>
|
||
|
||
<span class="cmd"># sửa một file đã bind vào manifest</span>
|
||
<span class="bad">EVIDENCE_PACK_TAMPERED · exit=1</span></div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Hash-linked hoặc signed local evidence vẫn chưa đồng nghĩa WORM enterprise. Để claim bất biến production, anchor phải đi ra KMS/WORM/Object Lock thật.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-level4-assessment.md<br>
|
||
packages/casan-control-panel/frontend/src/pages/EvidencePacks.tsx<br>
|
||
infra/production/README.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo · project thực tế">
|
||
<div>
|
||
<h2>NEHOPS là case Japan điển hình: legacy source rất lớn, output phải đúng bằng chứng và đúng tiếng Nhật</h2>
|
||
<div class="metrics">
|
||
<div class="metric"><div class="value">2.6GB</div><div class="label">Workspace hiện tại; không phải Git repository.</div></div>
|
||
<div class="metric"><div class="value">34,572</div><div class="label">File VB — đọc toàn bộ mỗi vòng là không khả thi.</div></div>
|
||
<div class="metric"><div class="value">0→4</div><div class="label">AST, pre-analysis, generation, rồi bốn round review.</div></div>
|
||
</div>
|
||
<p class="lead">Use case demo: <strong>FRR04701 · 部屋状況リスト</strong> — đã có AST, pre-analysis, output và final review.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Project root: /Users/thanhnguyen/Downloads/tmp-prj/BD/Basic Design (Screen&Report)_v2.7. Vì project không có Git, live demo nên snapshot/backup hoặc khởi tạo Git trước khi init để nhìn rõ diff và provenance.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Kết quả khảo sát filesystem ngày 29/07/2026.<br>
|
||
Dự án demo: CLAUDE.md, .claude/commands/bd/boss.md, tools/README.md.
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo · assessment hiện tại">
|
||
<div class="split wide-left">
|
||
<div>
|
||
<h2>Assessment hiện có chứa một lỗi phân loại — core member phải phát hiện, không được sao chép</h2>
|
||
<div class="bars">
|
||
<div class="bar-row"><div class="bar-label">H1 Context</div><div class="bar-track"><div class="bar-fill" style="width:70%"></div></div><div class="bar-value">70</div></div>
|
||
<div class="bar-row"><div class="bar-label">H2 Tool</div><div class="bar-track"><div class="bar-fill" style="width:68%"></div></div><div class="bar-value">68</div></div>
|
||
<div class="bar-row"><div class="bar-label">H3 Eval</div><div class="bar-track"><div class="bar-fill" style="width:75%"></div></div><div class="bar-value">75</div></div>
|
||
<div class="bar-row"><div class="bar-label">H4 Security</div><div class="bar-track"><div class="bar-fill" style="width:25%"></div></div><div class="bar-value red">25</div></div>
|
||
<div class="bar-row"><div class="bar-label">H5 Governance</div><div class="bar-track"><div class="bar-fill" style="width:35%"></div></div><div class="bar-value amber">35</div></div>
|
||
<div class="bar-row"><div class="bar-label">H6 AgentOps</div><div class="bar-track"><div class="bar-fill" style="width:20%"></div></div><div class="bar-value red">20</div></div>
|
||
<div class="bar-row"><div class="bar-label">H7 Orchestr.</div><div class="bar-track"><div class="bar-fill" style="width:65%"></div></div><div class="bar-value">65</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="stack">
|
||
<div class="callout red">File kết luận “3 harness dưới 30”, nhưng dữ liệu chỉ có <strong>H4=25 và H6=20</strong>. H5 là 35.</div>
|
||
<div class="callout blue">Theo chính rubric đi kèm: average 51,1 và ≤2 GAP ⇒ <strong>Level 3</strong>, không phải Level 2. Sau init, maturity vẫn phải để <strong>not_assessed</strong> đến khi chạy evidence.</div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là ví dụ “không tin assessment chỉ vì nó nằm trong repo”. CASAN cần evaluation của chính evidence đánh giá maturity. Đề nghị sửa assessment sau buổi demo hoặc tạo assessment mới đã kiểm chứng.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: harness_Review/nehops_casan_assessment.md<br>
|
||
Dự án demo: harness_Review/casan_harness_assessment.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo · khoảng trống thật">
|
||
<div>
|
||
<h2>NEHOPS đã có workflow tốt, nhưng chưa có runtime assurance</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Đã có</th><th>Còn thiếu để vận hành CASAN</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>AST analyzer + call/dependency graph</td><td>Tool registry, command schema, timeout, idempotency, per-call audit</td></tr>
|
||
<tr><td>Instruction tiếng Nhật và no-inference</td><td>H4 scan input/source comment/output; secret/PII/egress policy</td></tr>
|
||
<tr><td>Pre-analysis + Round 1–4 review</td><td>Golden regression tự động và fail-able gate</td></tr>
|
||
<tr><td>Boss command tuần tự</td><td>Bounded retry, fallback, rollback, pipeline state</td></tr>
|
||
<tr><td>Analyzer log</td><td>Provider token/cost, latency, failure, drift và alert</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Điểm mạnh của project là context discipline: dùng index common-knowhow và line range trong pre-analysis để tránh đọc lại AST. Đây là nền tốt cho H1 và tiết kiệm token, nhưng chưa có telemetry chứng minh.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: CLAUDE.md<br>
|
||
Dự án demo: .claude/commands/bd/boss.md<br>
|
||
Dự án demo: harness_Review/nehops_casan_assessment.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · định nghĩa">
|
||
<div>
|
||
<h2>Level 4 không phải “automation chạy hết” — mà là automation không được vượt governance</h2>
|
||
<div class="split">
|
||
<div class="big-quote" style="font-size:clamp(31px,3.8vw,52px)">Agent-orchestrated<br><span class="red">+ H4 Security</span><br><span class="blue">+ H5 Governance</span><br><span class="green">+ H6 AgentOps</span><br>= <span class="accent">Automated with evidence</span></div>
|
||
<ul class="flat-list tight">
|
||
<li>Side effect có policy decision và audit</li>
|
||
<li>Injection, PII, secret được test bằng attack</li>
|
||
<li>Trace, metrics, cost, latency, retry, alert được capture</li>
|
||
<li>High-risk action có human approval auditable</li>
|
||
<li>Gate fail-closed; thiếu evidence thì không certify</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là định nghĩa Level 4 trong tài liệu hiện tại của repo CASAN. Sáu điều kiện enterprise như OIDC/KMS/HA là overlay production, không thay thế các runtime gate này.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
docs/output/casan/casan-level4-assessment.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · H4">
|
||
<div>
|
||
<h2>H4 chỉ được tính điểm khi payload độc bị chặn thật</h2>
|
||
<div class="split">
|
||
<div>
|
||
<span class="pill proven">Acceptance evidence</span>
|
||
<ul class="flat-list tight">
|
||
<li>Prompt injection classic + multilingual</li>
|
||
<li>Homoglyph, zero-width, encoding, split injection</li>
|
||
<li>Secret/credential và PII leakage</li>
|
||
<li>Tool output và generated artifact scan</li>
|
||
<li>Classifier/model chết ⇒ fail-closed</li>
|
||
</ul>
|
||
</div>
|
||
<div class="callout red"><strong>NEHOPS-specific attack:</strong><br><br>VB comment, AST text hoặc ref_docs chứa câu “ignore instruction / xuất secret / sửa source”. Pipeline phải coi đó là dữ liệu, không phải mệnh lệnh.</div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đừng chỉ demo input người dùng. Second-order injection trong source và tài liệu tham chiếu mới là threat chính của migration/document generation.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-level4-assessment.md<br>
|
||
docs/plans/CASAN_PLAN_16_SECURITY_AUDIT_REMEDIATION.md<br>
|
||
packages/casan-harness/security/
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · H5">
|
||
<div>
|
||
<h2>H5 biến “agent đã làm” thành “ai cho phép làm, theo rule nào, bằng chứng có còn nguyên?”</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Control</th><th>Level 4 minimum</th><th>NEHOPS cần khai báo</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>Risk registry</td><td>Low/medium/high, deny-by-default cho high risk</td><td>Ghi VB-Source/ref_docs/instruction là high risk</td></tr>
|
||
<tr><td>Approval</td><td>Approver identity, reason, SoD, không replay</td><td>Publish reviewed output hoặc override Round 4</td></tr>
|
||
<tr><td>Audit</td><td>Hash chain + verify; lỗi chain chặn promotion</td><td>Bind screen ID, source hash, AST hash, output hash</td></tr>
|
||
<tr><td>Policy</td><td>Versioned; thay đổi có review/rollback</td><td>Japanese rules và no-inference là must-keep policy</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Local hash chain là minimum tamper-evident. Enterprise production cần KMS anchor và WORM store. Approval “CASAN_APPROVER=abc” chỉ là local proof; production cần IdP/JWT thật.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-level4-assessment.md<br>
|
||
docs/plans/CASAN_HARDENING_STATUS.md<br>
|
||
docs/security/CONTROL_PANEL_AUTH_HARDENING.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · H6">
|
||
<div>
|
||
<h2>H6 không chỉ đo token — phải biết số đó đáng tin đến đâu</h2>
|
||
<div class="split">
|
||
<div>
|
||
<ul class="flat-list tight">
|
||
<li>Per-step input/output/total tokens</li>
|
||
<li>Cost source: estimate hay provider telemetry</li>
|
||
<li>Latency, retry, exit code, failure</li>
|
||
<li>Token-overuse, spike, slow-boil, alert</li>
|
||
<li>Freshness và coverage của telemetry</li>
|
||
</ul>
|
||
</div>
|
||
<div class="callout blue"><strong>Truth rule:</strong><br><br>Nếu client/provider không cấp usage đáng tin, ghi <code>null</code> hoặc <code>estimate</code>. Không biến word count thành “billed token”.</div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>agent-metrics.sh dùng word count làm fallback và chỉ thay bằng provider telemetry khi có record khớp đúng step. Control Panel hiển thị token/cost coverage để tránh số “đẹp nhưng rỗng”.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
packages/casan-harness/scripts/bash/agent-metrics.sh<br>
|
||
packages/casan-control-panel/backend/src/telemetry/telemetry.service.ts<br>
|
||
docs/casan/CASAN_AGENTIC_CLIENT_SECURITY.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · H1/H2/H3/H7">
|
||
<div>
|
||
<h2>Đóng H4/H5/H6 chưa đủ nếu bốn harness còn lại không chạy quanh workflow thật</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Harness</th><th>Exit condition cho NEHOPS</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>H1 Context</td><td>Index-first, chỉ đọc relevant knowhow/line range; stale context được phát hiện</td></tr>
|
||
<tr><td>H2 Tool</td><td>Roslyn analyzer là registered action; exact argv, timeout, output paths, no shell injection</td></tr>
|
||
<tr><td>H3 Evaluation</td><td>Golden FRR04701, deterministic validators, Round 4 fail-able; không chỉ LLM tự review</td></tr>
|
||
<tr><td>H7 Orchestration</td><td>State từng step; retry giới hạn; analyzer fail thì dừng; fallback không bypass policy</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p class="lead">Không tạo project manifest với command test giả. NEHOPS hiện chưa có test contract tự động — phải viết validator deterministic trước.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Schema project manifest bắt buộc build/test command. Project demo hiện không có test suite. Vì vậy trạng thái đúng sau init là “domain discovered, no manifest”, không nên điền một command luôn PASS để làm đẹp readiness.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
packages/casan-devkit/schemas/project-manifest.schema.json<br>
|
||
packages/casan-harness/scripts/python/readiness.py<br>
|
||
Dự án demo: tools/README.md, .claude/commands/bd/boss.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · enterprise overlay">
|
||
<div>
|
||
<h2>Để claim Level 4 trong môi trường enterprise Japan, thêm lớp production assurance</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Control</th><th>Repo có gì</th><th>Điều kiện đóng thật</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>OIDC</td><td>Mock/local smoke + oauth2-proxy scaffold</td><td>Enterprise issuer/audience/JWKS, CA, group-role mapping, negative test</td></tr>
|
||
<tr><td>Tenant isolation</td><td>Per-tenant state/RBAC/pre-audit</td><td>Independent review identity/app/db/network/KMS boundaries</td></tr>
|
||
<tr><td>KMS/WORM</td><td>Vault/S3 paths + preflight scripts</td><td>Non-exportable key, workload identity, Object Lock COMPLIANCE</td></tr>
|
||
<tr><td>HA/DR</td><td>Backup/verify/restore workflow</td><td>Topology, replication, RPO/RTO, restore + failover drill</td></tr>
|
||
<tr><td>SLA/review</td><td>Draft + pentest scope</td><td>Measured SLO, on-call/contract, independent signed report + retest</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Nếu tiêu chí khách hàng FPT Japan coi sáu mục này là Level 4 exit criteria thì áp dụng overlay nghiêm ngặt hơn. Không dùng local mock làm bằng chứng production.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
infra/production/README.md<br>
|
||
docs/compliance/TENANT_ISOLATION_REVIEW.md<br>
|
||
docs/compliance/EXTERNAL_SECURITY_REVIEW_SCOPE.md<br>
|
||
docs/jp-poc/07_本番SLA・サポート・エスカレーション案.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 4 · evidence gate">
|
||
<div>
|
||
<h2>Chỉ tuyên bố Level 4 khi một run đầy đủ trả lời “Có” cho toàn bộ bảng này</h2>
|
||
<div class="split">
|
||
<ul class="flat-list tight">
|
||
<li>Attack injection/secret/PII bị chặn</li>
|
||
<li>High-risk denied by default</li>
|
||
<li>Approval có identity + reason + scope</li>
|
||
<li>Audit chain verify thành công</li>
|
||
<li>Trace/metrics/alerts hợp lệ và còn fresh</li>
|
||
</ul>
|
||
<ul class="flat-list tight">
|
||
<li>Golden regression không drift ngoài ngưỡng</li>
|
||
<li>Tool/action không vượt allowlist</li>
|
||
<li>Retry/fallback không bypass governance</li>
|
||
<li>Evidence Pack verify được sau khi export</li>
|
||
<li>Không có Harness GAP hoặc evidence “not recorded”</li>
|
||
</ul>
|
||
</div>
|
||
<div class="callout" style="margin-top:1rem">Score là kết quả của evidence — không phải input do người đánh giá tự gõ.</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Rubric dự án cũ dùng average >80 và không GAP. Tài liệu maturity mới mô tả bằng capability/evidence. Khi đào tạo, nên dùng cả hai: numeric score để theo dõi, evidence checklist để quyết định claim.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-level4-assessment.md<br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
Dự án demo: harness_Review/casan_harness_assessment.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Token & chi phí · hiện trạng">
|
||
<div>
|
||
<h2>CASAN đã đo token/cost, nhưng chưa có baseline tiết kiệm đáng tin cho NEHOPS</h2>
|
||
<div class="metrics">
|
||
<div class="metric"><div class="value">64</div><div class="label">Runtime metric records trong repo CASAN: 85.202 token, cost estimate 0,08714 USD.</div></div>
|
||
<div class="metric"><div class="value">98</div><div class="label">Provider usage records: 234.906 token, cost 0,16668 USD; gồm sample/local/test/API.</div></div>
|
||
<div class="metric"><div class="value red">N/A</div><div class="label">Không thể suy ra “% tiết kiệm” FPT/NEHOPS từ hai tập log hỗn hợp này.</div></div>
|
||
</div>
|
||
<p class="lead">Không cộng hai tập log thành tổng spend: chúng có thể là hai projection của cùng hoạt động và có dữ liệu test/demo.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Số liệu được aggregate trực tiếp từ .specify/logs ngày 29/07/2026. Runtime metrics có nhiều cost source: word_count_estimate, provider_telemetry, readonly_word_count, local real tokens, provider usage logs. Provider log có sample-provider, Ollama, OpenAI và compatible gateway.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
.specify/logs/cost/metrics.jsonl<br>
|
||
.specify/logs/level5/provider-usage.jsonl<br>
|
||
packages/casan-control-panel/backend/src/telemetry/telemetry.service.ts
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Token & chi phí · compressor">
|
||
<div class="split wide-left">
|
||
<div>
|
||
<h2>Log thật giảm 2.446 → 24 “token” — nhưng kết quả phải bị từ chối</h2>
|
||
<div class="metrics" style="grid-template-columns:repeat(2,1fr)">
|
||
<div class="metric"><div class="value">99,0%</div><div class="label">Word-count bị loại bởi structural compressor trên analyzer-20260512.log.</div></div>
|
||
<div class="metric"><div class="value red">0</div><div class="label">Dòng <code>[WRN] VBSource root not found</code> còn lại trong compressed view.</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="stack">
|
||
<div class="terminal"><span class="warn">COMPRESS mode=structural
|
||
in_tokens=2446
|
||
out_tokens=24
|
||
saved=2422
|
||
ratio=0.0098</span>
|
||
|
||
Compressed view chỉ còn:
|
||
<span class="bad">Error Messages: 0 × 3</span></div>
|
||
<div class="callout red"><strong>Kết luận:</strong> con số tiết kiệm cao không có giá trị nếu mất cảnh báo. Phải cấu hình must-keep + H3 faithfulness trước khi đưa vào model.</div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là measurement thật trên log của project demo, nhưng không phải end-to-end savings. Compressor dùng len(text.split()), không dùng provider tokenizer. Regex hiện nhận từ “warning” nhưng không nhận mã log “[WRN]”, nên warning bị bỏ. Đây là gap cần fix/test.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: logs/analyzer-20260512.log<br>
|
||
packages/casan-harness/scripts/bash/context-compress.py<br>
|
||
packages/casan-harness/tests/phase08-compression-tests.sh
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Token & chi phí · chiến lược">
|
||
<div>
|
||
<h2>Giảm token đúng cách cho FPT Japan: giảm đọc lại, không giảm bằng chứng</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Ưu tiên</th><th>Cơ chế</th><th>Evidence cần giữ</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>1 · Index-first</td><td>Đọc common-knowhow README rồi chỉ mở file liên quan</td><td>Danh sách file/pattern đã chọn</td></tr>
|
||
<tr><td>2 · Line-range context</td><td>Pre-analysis trỏ chính xác AST lines cho vòng sau</td><td>Source hash + cited ranges</td></tr>
|
||
<tr><td>3 · Structural view</td><td>Giữ summary/error/warning/must-keep; raw artifact giữ nguyên</td><td>Raw hash + compressed hash + ratio</td></tr>
|
||
<tr><td>4 · Model routing</td><td>Local/deterministic cho classify; cloud cho task cần reasoning</td><td>Model/provider + real usage</td></tr>
|
||
<tr><td>5 · Budget gate</td><td>Per-screen/token ceiling, spike và slow-boil alert</td><td>Provider telemetry + acceptance result</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>NEHOPS command đã có nguyên tắc đọc line range và tránh full reread — đây là quick win. Để đo savings: chạy cùng screen, cùng model, cùng acceptance test; so baseline trước/sau; dùng provider usage; báo quality/rework cùng token.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: .claude/commands/bd/boss.md, .claude/commands/bd/analyze.md<br>
|
||
docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md<br>
|
||
docs/plans/CASAN_PLAN_19_HARNESS_REPORTING.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Token & chi phí · KPI">
|
||
<div>
|
||
<h2>Dashboard token tốt phải ghép “chi phí” với “chất lượng đầu ra”</h2>
|
||
<div class="split">
|
||
<div>
|
||
<span class="pill partial">FinOps minimum</span>
|
||
<ul class="flat-list tight">
|
||
<li>Provider tokens và billed cost / screen</li>
|
||
<li>Token coverage và cost coverage</li>
|
||
<li>P50/P95 latency, retries, fallback</li>
|
||
<li>Compression ratio + must-keep pass</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<span class="pill proven">Business quality</span>
|
||
<ul class="flat-list tight">
|
||
<li>Round 1–4 defect/rework count</li>
|
||
<li>Hallucination/no-evidence findings</li>
|
||
<li>Cycle time / screen</li>
|
||
<li>Customer acceptance và escaped defect</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="callout blue" style="margin-top:1.2rem">Tối ưu token mà tăng rework là tối ưu giả.</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là cầu nối L4 → L5: L4 đo kỹ thuật; L5 phải gắn với business KPI. Token là đầu vào chi phí, không phải mục tiêu độc lập.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md<br>
|
||
packages/casan-control-panel/backend/src/telemetry/telemetry.service.ts
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 5 · bản chất">
|
||
<div>
|
||
<h2>Level 5 bắt đầu khi CASAN không còn là “project setup”, mà trở thành operating system dùng chung</h2>
|
||
<div class="split">
|
||
<ul class="flat-list tight">
|
||
<li>Harness package tái dùng và versioned đa project</li>
|
||
<li>Golden data phát hiện drift theo model/prompt version</li>
|
||
<li>Fallback có policy; failure có rollback</li>
|
||
<li>Tool registry có schema + idempotency</li>
|
||
</ul>
|
||
<ul class="flat-list tight">
|
||
<li>Governance/policy signed và centrally controlled</li>
|
||
<li>AgentOps tổng hợp cross-project</li>
|
||
<li>Incident/reviewer feedback quay thành evaluation</li>
|
||
<li>Business KPI gắn với agent decision</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Local file-based evidence trong repo chỉ là demonstration. Enterprise L5 cần external services: IdP, WORM/KMS, live provider API và hosted dashboard.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
docs/output/casan/casan-level4-assessment.md — Level 5 production-style add-ons
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 5 · exit criteria">
|
||
<div>
|
||
<h2>Level 5 phải chứng minh được sáu “chuyện khó”, không chỉ bật sáu feature</h2>
|
||
<div class="flow">
|
||
<div class="flow-row"><div class="flow-no">1</div><div class="flow-copy"><strong>Reuse</strong><span>Ít nhất hai project dùng cùng harness version.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">2</div><div class="flow-copy"><strong>Drift</strong><span>Golden dataset bắt thay đổi trước production.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">3</div><div class="flow-copy"><strong>Fallback</strong><span>Đổi model/tool path mà không bypass governance.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">4</div><div class="flow-copy"><strong>Rollback</strong><span>Side effect thất bại được phục hồi có evidence.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">5</div><div class="flow-copy"><strong>Outcome</strong><span>KPI chứng minh giảm cycle time/rework/defect.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">6</div><div class="flow-copy"><strong>Federation</strong><span>Dashboard và policy tập trung, signed, không sửa tùy ý tại project.</span></div></div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>NEHOPS có thể là project thứ hai để chứng minh reuse cùng OKR/Service Desk. Nhưng project phải dùng đúng shared harness; không copy gate riêng.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md — Level 5 Exit Criteria<br>
|
||
docs/plans/CASAN_PLAN_06_ONBOARD.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Level 5 · roadmap">
|
||
<div>
|
||
<h2>Thứ tự nâng cấp an toàn: chứng minh L4 trước, rồi mới federate lên L5</h2>
|
||
<div class="flow">
|
||
<div class="flow-row"><div class="flow-no">A</div><div class="flow-copy"><strong>Project truth</strong><span>Domain Pack NEHOPS, validator, golden, corpus, traceability.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">B</div><div class="flow-copy"><strong>Level 4 run</strong><span>Enforce H4/H5/H6 quanh một screen; Evidence Pack verify.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">C</div><div class="flow-copy"><strong>Production overlay</strong><span>OIDC, tenant isolation, KMS/WORM, monitoring, DR, review.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">D</div><div class="flow-copy"><strong>Scale</strong><span>Reuse registry, central AgentOps, provider telemetry, signed policy.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">E</div><div class="flow-copy"><strong>Learn</strong><span>Drift/fallback/rollback và business feedback tự cải thiện bounded.</span></div></div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Không bật abstractive compression hay self-healing trước khi H3/H4/H5 đủ mạnh; mỗi capability mới tăng attack surface.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
docs/plans/CASAN_PLAN_08_CONTEXT_COMPRESSION.md<br>
|
||
docs/plans/CASAN_PLAN_17_LOOP_ENGINEERING.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo live · chuẩn bị">
|
||
<div class="split wide-right">
|
||
<div>
|
||
<h2>Live demo dùng đúng project thật, nhưng không đánh đổi an toàn</h2>
|
||
<ul class="flat-list tight">
|
||
<li>Project hiện không có Git ⇒ snapshot trước</li>
|
||
<li>Mac có .NET 7; analyzer yêu cầu .NET 8/Windows EXE</li>
|
||
<li>Demo dùng AST/output FRR04701 đã có</li>
|
||
<li>Không rerun Roslyn analyzer trên Mac</li>
|
||
<li>Chỉ ghi CASAN scaffold sau khi người trình bày xác nhận</li>
|
||
</ul>
|
||
</div>
|
||
<div class="terminal"><button class="copy">COPY</button><span class="cmd">cd "/Users/thanhnguyen/Downloads/tmp-prj/BD/Basic Design (Screen&Report)_v2.7"
|
||
|
||
# Trước buổi demo: snapshot hoặc đưa project vào Git.
|
||
casan init \
|
||
--project nehops-bd-v27 \
|
||
--edition devkit \
|
||
--runtime managed \
|
||
--client claude,codex \
|
||
--mode enforce</span></div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Không chạy init trong deck build này; probe đã chạy trên thư mục tạm. Khi demo thật, dùng `casan uninstall` nếu cần gỡ các file owned bởi init, nhưng ưu tiên Git để xem/revert diff.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: tools/README.md yêu cầu .NET 8 / Windows self-contained analyzer.<br>
|
||
Khảo sát môi trường: dotnet 7.0.302; project không phải Git repo.<br>
|
||
packages/casan-devkit/casan-init.py
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo live · kịch bản">
|
||
<div>
|
||
<h2>Kịch bản 15 phút: cài → phát hiện attention → điền truth → chạy gate → xem evidence</h2>
|
||
<div class="flow">
|
||
<div class="flow-row"><div class="flow-no">1</div><div class="flow-copy"><strong>Init</strong><span>Cho xem file được tạo và maturity=not_assessed.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">2</div><div class="flow-copy"><strong>Doctor</strong><span>Trust Codex hooks; giải thích provider telemetry chưa có.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">3</div><div class="flow-copy"><strong>Preflight prompt</strong><span>Agent phát hiện assessment misclassification, không sửa file.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">4</div><div class="flow-copy"><strong>Domain truth</strong><span>Thay placeholder bằng FR/architecture/golden/corpus/traceability NEHOPS.</span></div></div>
|
||
<div class="flow-row"><div class="flow-no">5</div><div class="flow-copy"><strong>Gate/evidence</strong><span>Chạy H4 attack + safe AST validation; mở report/evidence.</span></div></div>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Nếu chưa kịp xây deterministic validator, dừng ở readiness/domain discovered; tuyệt đối không giả lập project pipeline PASS. Có thể demo Core admission/report trước, rồi đưa validator thành action item.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Output init probe 29/07/2026.<br>
|
||
docs/packaging/ADOPTION_GUIDE.md<br>
|
||
packages/casan-harness/scripts/python/readiness.py
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo live · lệnh kiểm tra">
|
||
<div class="split wide-right">
|
||
<div>
|
||
<h2>Một governed step an toàn: xác minh AST JSON có thể đọc được</h2>
|
||
<p class="lead">Đây chỉ là smoke action H2/H6 — chưa thay thế bộ validator chất lượng BD.</p>
|
||
</div>
|
||
<div class="terminal"><button class="copy">COPY</button><span class="cmd">printf 'Validate FRR04700 CL AST JSON\n' \
|
||
> /tmp/nehops-casan-input.txt
|
||
|
||
casan run \
|
||
/tmp/nehops-casan-input.txt \
|
||
/tmp/nehops-casan-output.txt \
|
||
validate-frr04700-cl-ast -- \
|
||
python3 -c '
|
||
import json, os
|
||
p="AST-outputs/FRR04700_CL/FRR04700_CL_AST.json"
|
||
json.load(open(p, encoding="utf-8"))
|
||
open(os.environ["CASAN_OUTPUT"],"w").write("AST_JSON_VALID\n")
|
||
'
|
||
|
||
casan report latest</span></div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Command không dùng shell interpolation bên trong CASAN action; Python nhận output path qua CASAN_OUTPUT. Để productionize, đăng ký thành fixed action/tool schema và thêm content validators thay vì chạy free-form Python.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
bin/casan — run command<br>
|
||
packages/casan-harness/scripts/bash/agent-metrics.sh<br>
|
||
Dự án demo: AST-outputs/FRR04700_CL/FRR04700_CL_AST.json
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Demo live · token lesson">
|
||
<div class="split">
|
||
<div class="terminal"><button class="copy">COPY</button><span class="cmd">python3 \
|
||
/path/to/casan-harness/scripts/bash/context-compress.py \
|
||
--mode structural \
|
||
--input logs/analyzer-20260512.log</span>
|
||
|
||
<span class="warn">2446 → 24 · ratio 0.0098</span>
|
||
<span class="bad">Nhưng warning quan trọng biến mất.</span></div>
|
||
<div>
|
||
<h2>Demo “savings” phải kết thúc bằng một lần REJECT</h2>
|
||
<ul class="flat-list tight">
|
||
<li>Cho khán giả thấy raw warning</li>
|
||
<li>Cho thấy compressed view bỏ warning</li>
|
||
<li>Giải thích must-keep/faithfulness</li>
|
||
<li>Không ghi 99% vào KPI dự án</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là phần demo quan trọng nhất về tư tưởng: CASAN không ưu tiên con số đẹp hơn sự thật. Sau buổi học, bổ sung nhận diện `[WRN]`, `[ERR]`, `[INF]` và test NEHOPS-specific trước khi bật compressor.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Measurement thực ngày 29/07/2026 trên logs/analyzer-20260512.log.<br>
|
||
packages/casan-harness/scripts/bash/context-compress.py
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Các điểm yếu phải nói thẳng">
|
||
<div>
|
||
<h2>Những phần chưa được phép quảng cáo là hoàn chỉnh</h2>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<thead><tr><th>Area</th><th>Trạng thái trung thực</th><th>Việc tiếp theo</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>Enterprise edition</td><td>Future; init chủ động từ chối</td><td>Không bán/claim như shipped product</td></tr>
|
||
<tr><td>OIDC/KMS/WORM</td><td>Local lab/scaffold + production paths</td><td>Deploy managed infra và giữ evidence khách hàng</td></tr>
|
||
<tr><td>HA/SLA/pentest</td><td>Runbook/draft/scope, chưa có kết quả vận hành độc lập</td><td>DR drill, measured SLO, contract, assessor report</td></tr>
|
||
<tr><td>Token savings</td><td>Compressor MVP; no NEHOPS end-to-end baseline</td><td>Fix warning/must-keep; A/B cùng acceptance</td></tr>
|
||
<tr><td>NEHOPS maturity</td><td>Assessment cũ mâu thuẫn; init ⇒ not_assessed</td><td>Chạy assessment evidence-backed mới</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Claim guardrail là một phần của văn hóa CASAN. Người trình bày phải phân biệt implemented+tested, scaffold+tested, needs-infra và external-process.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/packaging/EDITION_FEATURE_LIMITATION_MATRIX.md<br>
|
||
docs/plans/CASAN_BACKLOG_STATUS.md<br>
|
||
docs/plans/CASAN_HARDENING_STATUS.md
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Japan delivery · trọng tâm bổ sung">
|
||
<div>
|
||
<h2>Với FPT Japan, “đúng kỹ thuật” phải đi cùng “đúng nguồn, đúng ngôn ngữ, đúng trách nhiệm”</h2>
|
||
<div class="split">
|
||
<ul class="flat-list tight">
|
||
<li>Japanese output và terminology consistency</li>
|
||
<li>No-inference: thiếu evidence phải ghi UNKNOWN</li>
|
||
<li>Legacy traceability: VB → AST → BD → review</li>
|
||
<li>Data residency/model route rõ ràng</li>
|
||
</ul>
|
||
<ul class="flat-list tight">
|
||
<li>Human oversight cho publish/override</li>
|
||
<li>APPI/data-processing register theo tenant</li>
|
||
<li>Incident/SLA escalation bằng run ID/evidence hash</li>
|
||
<li>Security review bám đúng deployed image/config</li>
|
||
</ul>
|
||
</div>
|
||
<p class="lead">Japan AI governance đang nhấn mạnh governance, guideline và audit — CASAN phải biến các yêu cầu đó thành runtime evidence.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Không nói CASAN “compliant” với APPI/METI chỉ vì có template. Dùng chúng làm cấu trúc evidence và hoàn tất với legal/security owner của từng khách hàng.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Dự án demo: CLAUDE.md, BD/instructions/BD_Instruction.md<br>
|
||
docs/compliance/APPI_DATA_PROCESSING.md<br>
|
||
<a href="https://www.meti.go.jp/policy/it_policy/ai-governance/index.html">METI AI Governance</a><br>
|
||
<a href="https://www.meti.go.jp/shingikai/mono_info_service/ai_shakai_jisso/pdf/20250328_3.pdf">Japan AI Guidelines for Business v1.1</a>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Core member operating rules">
|
||
<div>
|
||
<h2>Bảy nguyên tắc làm việc của core team</h2>
|
||
<div class="split">
|
||
<ul class="flat-list tight">
|
||
<li>Evidence trước claim</li>
|
||
<li>Fail-closed trước convenience</li>
|
||
<li>Không sửa gate riêng theo project</li>
|
||
<li>Không dùng mock làm proof production</li>
|
||
</ul>
|
||
<ul class="flat-list tight">
|
||
<li>Không tối ưu token bằng cách mất nghĩa</li>
|
||
<li>Không để model tự tuyên bố DONE</li>
|
||
<li>Mỗi incident trở thành golden/red-team test</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Đây là slide cam kết. Có thể yêu cầu từng thành viên chọn một nguyên tắc và đưa ví dụ từ project mình phụ trách.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
Tổng hợp từ CASAN higher-level criteria, security remediation, evidence pack và compression plans.
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Hành động sau đào tạo">
|
||
<div>
|
||
<h2>Ba quyết định cần chốt để NEHOPS tiến tới Level 4</h2>
|
||
<div class="metrics">
|
||
<div class="metric"><div class="value">01</div><div class="label"><strong>Owner:</strong> ai sở hữu Domain Pack, golden và corpus tiếng Nhật?</div></div>
|
||
<div class="metric"><div class="value">02</div><div class="label"><strong>Gate:</strong> deterministic validator nào thay cho “LLM review thấy ổn”?</div></div>
|
||
<div class="metric"><div class="value">03</div><div class="label"><strong>Platform:</strong> Control Plane/IdP/KMS/WORM dùng dịch vụ nào tại FPT Japan?</div></div>
|
||
</div>
|
||
<p class="lead">Chỉ sau ba quyết định này mới lập kế hoạch Level 4 có owner, acceptance evidence và deadline.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Không tự gán owner hoặc deadline trong deck vì source không có thông tin đó. Đây là ba quyết định cần workshop với core team, security/platform và delivery owner.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/compliance/CERTIFICATION_ROADMAP.md<br>
|
||
docs/plans/CASAN_BACKLOG_STATUS.md<br>
|
||
Dự án demo: assessment và workflow artifacts.
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
|
||
<section class="slide" data-section="Kết">
|
||
<div>
|
||
<span class="pill proven">Thông điệp cuối</span>
|
||
<div class="rule"></div>
|
||
<h1>AI-Native không có nghĩa AI được tự do.<br><span class="accent">Nó có nghĩa tổ chức kiểm soát AI bằng evidence ở quy mô lớn.</span></h1>
|
||
<p class="lead">Level 4: automation có security, governance, AgentOps. Level 5: hệ thống học và mở rộng — nhưng vẫn bị ràng buộc bởi policy, rollback và business outcome.</p>
|
||
</div>
|
||
<aside class="speaker-notes">
|
||
<p>Kết thúc bằng việc quay lại câu mở đầu. CASAN không phải lệnh cài; init chỉ mở cửa. Maturity đến từ cách cả tổ chức vận hành sau cánh cửa đó.</p>
|
||
<div class="sources"><strong>[Sources]</strong><br>
|
||
docs/output/casan/casan-higher-level-criteria.md<br>
|
||
<a href="https://fpt.com/en/news/fpt-news/fpt-va-forrester-cong-bo-bao-cao-toan-cau-ve-chuyen-doi-ai">FPT: From pilots to reusable platforms — 08/07/2026</a>
|
||
</div>
|
||
</aside>
|
||
</section>
|
||
</main>
|
||
|
||
<aside class="notes-panel" id="notesPanel" aria-live="polite"></aside>
|
||
<aside class="overview" id="overview">
|
||
<h3>Slide overview — bấm để chuyển</h3>
|
||
<div class="overview-grid" id="overviewGrid"></div>
|
||
</aside>
|
||
|
||
<div class="footer">
|
||
<div class="keys">
|
||
<span class="key">←</span><span class="key">→</span>
|
||
<span class="key">F</span> fullscreen
|
||
<span class="key">N</span> notes
|
||
<span class="key">O</span> overview
|
||
<span class="key">P</span> print
|
||
</div>
|
||
<div id="counter">1 / 40</div>
|
||
</div>
|
||
|
||
<script>
|
||
const slides = [...document.querySelectorAll(".slide")];
|
||
const progress = document.getElementById("progress");
|
||
const counter = document.getElementById("counter");
|
||
const notesPanel = document.getElementById("notesPanel");
|
||
const overview = document.getElementById("overview");
|
||
const overviewGrid = document.getElementById("overviewGrid");
|
||
let index = Math.max(0, Math.min(slides.length - 1, Number(location.hash.slice(1)) - 1 || 0));
|
||
|
||
function titleOf(slide) {
|
||
return (slide.querySelector("h1,h2")?.textContent || slide.dataset.section || "Slide").trim();
|
||
}
|
||
|
||
slides.forEach((slide, i) => {
|
||
const button = document.createElement("button");
|
||
button.innerHTML = `<b>${String(i + 1).padStart(2, "0")} · ${slide.dataset.section || ""}</b><span>${titleOf(slide)}</span>`;
|
||
button.addEventListener("click", () => {
|
||
overview.classList.remove("open");
|
||
go(i);
|
||
});
|
||
overviewGrid.appendChild(button);
|
||
});
|
||
|
||
function updateNotes() {
|
||
const source = slides[index].querySelector(".speaker-notes");
|
||
notesPanel.innerHTML = `<h3>Speaker notes · ${index + 1}/${slides.length}</h3>${source ? source.innerHTML : "<p>Không có notes.</p>"}`;
|
||
}
|
||
|
||
function go(next) {
|
||
index = Math.max(0, Math.min(slides.length - 1, next));
|
||
slides.forEach((slide, i) => slide.classList.toggle("active", i === index));
|
||
progress.style.width = `${((index + 1) / slides.length) * 100}%`;
|
||
counter.textContent = `${index + 1} / ${slides.length}`;
|
||
history.replaceState(null, "", `#${index + 1}`);
|
||
updateNotes();
|
||
}
|
||
|
||
document.addEventListener("keydown", event => {
|
||
const key = event.key.toLowerCase();
|
||
if (["arrowright", "arrowdown", " ", "pagedown"].includes(key)) {
|
||
event.preventDefault(); go(index + 1);
|
||
} else if (["arrowleft", "arrowup", "pageup"].includes(key)) {
|
||
event.preventDefault(); go(index - 1);
|
||
} else if (key === "home") {
|
||
go(0);
|
||
} else if (key === "end") {
|
||
go(slides.length - 1);
|
||
} else if (key === "f") {
|
||
if (!document.fullscreenElement) document.documentElement.requestFullscreen();
|
||
else document.exitFullscreen();
|
||
} else if (key === "n") {
|
||
notesPanel.classList.toggle("open");
|
||
updateNotes();
|
||
} else if (key === "o") {
|
||
overview.classList.toggle("open");
|
||
} else if (key === "p") {
|
||
window.print();
|
||
} else if (key === "escape") {
|
||
notesPanel.classList.remove("open");
|
||
overview.classList.remove("open");
|
||
}
|
||
});
|
||
|
||
let touchX = 0;
|
||
document.addEventListener("touchstart", event => {
|
||
touchX = event.touches[0].clientX;
|
||
}, { passive: true });
|
||
document.addEventListener("touchend", event => {
|
||
const delta = event.changedTouches[0].clientX - touchX;
|
||
if (Math.abs(delta) > 50) go(index + (delta < 0 ? 1 : -1));
|
||
}, { passive: true });
|
||
|
||
document.querySelectorAll(".copy").forEach(button => {
|
||
button.addEventListener("click", async event => {
|
||
event.stopPropagation();
|
||
const terminal = button.parentElement;
|
||
const text = [...terminal.childNodes]
|
||
.filter(node => node !== button)
|
||
.map(node => node.textContent)
|
||
.join("")
|
||
.trim();
|
||
try {
|
||
if (navigator.clipboard?.writeText) {
|
||
await navigator.clipboard.writeText(text);
|
||
} else {
|
||
const fallback = document.createElement("textarea");
|
||
fallback.value = text;
|
||
fallback.style.position = "fixed";
|
||
fallback.style.opacity = "0";
|
||
document.body.appendChild(fallback);
|
||
fallback.select();
|
||
document.execCommand("copy");
|
||
fallback.remove();
|
||
}
|
||
button.textContent = "COPIED";
|
||
} catch {
|
||
button.textContent = "SELECT";
|
||
}
|
||
setTimeout(() => button.textContent = "COPY", 1200);
|
||
});
|
||
});
|
||
|
||
go(index);
|
||
</script>
|
||
</body>
|
||
</html>
|