feat(web): add IwoooS AwoooP handoff packets

This commit is contained in:
Your Name
2026-05-20 14:38:12 +08:00
parent a957adde4b
commit f2e3873ed5
11 changed files with 499 additions and 9 deletions

View File

@@ -2954,6 +2954,51 @@
"guard": "Visible preflight is not request sent, received, accepted, or audit emitted."
}
}
},
"awooopCrossSessionHandoff": {
"title": "AwoooP Cross-Session Handoff",
"subtitle": "S2.52 freezes the current PR, branch, progress semantics, required guards, forbidden actions, and next coordination gate as read-only handoff packets so another AwoooP Session can continue without treating the handoff as production landing or execution authorization.",
"packetLabel": "Handoff packet",
"handoffLabel": "Handoff note",
"guardLabel": "Still locked",
"items": {
"branchAndPrAnchor": {
"title": "PR / branch anchor",
"body": "PR #117 and codex/security-supply-chain-contracts-20260512 are the current read-only sync anchors.",
"handoff": "The other Session should confirm the same PR, branch, and latest commit, then read LOGBOOK and the rollup ledger.",
"guard": "Do not merge, deploy, switch primary, or mutate refs from the handoff."
},
"progressSemantics": {
"title": "Progress semantics",
"body": "The headline remains 58%; framework is 80-85%; runtime / ingestion / GitHub primary / AwoooP production landing remains 35-40%.",
"handoff": "New UI, docs, and snapshots stay in the framework_detail ledger unless owner response, runtime gate, GitHub primary, or production landing evidence exists.",
"guard": "Do not treat framework detail, readiness, handoff, or guard pass as headline delta."
},
"requiredGuardCommands": {
"title": "Required guards",
"body": "Run security-mirror-progress-guard.py and source-control-owner-response-guard.py before taking over.",
"handoff": "Continue read-only projection only after both guards pass; if either fails, fix the contract or snapshot first.",
"guard": "Do not skip guards; do not treat guard pass as runtime approval."
},
"forbiddenRuntimeActions": {
"title": "Runtime forbidden actions",
"body": "Kali /execute, SSH, host update, active scan, credentialed scan, blocking control, repo / refs / workflow actions remain unauthorized.",
"handoff": "The other Session may only add read-only evidence, UI projection, docs, snapshots, and guards.",
"guard": "runtime_execution_authorized=false; action_buttons_allowed=false"
},
"awooopReadOnlyInputs": {
"title": "AwoooP read-only inputs",
"body": "AwoooP may consume the rollup snapshot, IwoooS projection, owner response validation rollup, Kali status, and rollout policy.",
"handoff": "Main-line AwoooP intake may display only state, evidence refs, route groups, and forbidden actions.",
"guard": "Do not store raw payloads, credential plaintext, token values, or execution payloads."
},
"nextCoordinationGate": {
"title": "Next coordination gate",
"body": "The next high-level gates that can move the headline remain owner response accepted, redacted payload ingestion, active runtime gate, GitHub primary ready, or AwoooP production landing.",
"handoff": "If the other Session advances production landing, it must provide read-only consumption evidence and deployment proof.",
"guard": "Do not treat handoff packets as production consumption."
}
}
}
},
"tickets": {

View File

@@ -2955,6 +2955,51 @@
"guard": "preflight 可見不代表 request sent、received、accepted 或 audit emitted。"
}
}
},
"awooopCrossSessionHandoff": {
"title": "AwoooP 跨 Session Handoff",
"subtitle": "S2.52 將目前 PR、分支、進度語義、必跑 guard、禁止動作與下一個協調 gate 固定成只讀 handoff packet讓另一個 AwoooP Session 可直接接手,不把 handoff 當 production landing 或執行授權。",
"packetLabel": "Handoff packet",
"handoffLabel": "交接說明",
"guardLabel": "仍鎖住",
"items": {
"branchAndPrAnchor": {
"title": "PR / 分支錨點",
"body": "目前以 PR #117 與 codex/security-supply-chain-contracts-20260512 作為只讀同步錨點。",
"handoff": "另一個 Session 先確認同一 PR / branch / latest commit再讀 LOGBOOK 與 rollup ledger。",
"guard": "不從 handoff 自動 merge、deploy、切 primary 或改 refs。"
},
"progressSemantics": {
"title": "進度語義",
"body": "headline 仍是 58%framework 80-85%runtime / ingestion / GitHub primary / AwoooP production landing 35-40%。",
"handoff": "所有新 UI / docs / snapshot 只能進 framework_detail ledger除非 owner response、runtime gate、GitHub primary 或 production landing 有 evidence。",
"guard": "不把 framework detail、readiness、handoff、guard pass 當 headline delta。"
},
"requiredGuardCommands": {
"title": "必跑 Guard",
"body": "接手前先跑 security-mirror-progress-guard.py 與 source-control-owner-response-guard.py。",
"handoff": "兩個 guard 都通過後才能繼續 read-only projection失敗時先停下修 contract / snapshot。",
"guard": "不跳過 guard不把 guard pass 當 runtime approval。"
},
"forbiddenRuntimeActions": {
"title": "Runtime 禁止動作",
"body": "Kali /execute、SSH、host update、active scan、credentialed scan、blocking control、repo / refs / workflow 動作仍未授權。",
"handoff": "另一個 Session 只能新增 read-only evidence、UI projection、docs、snapshot、guard。",
"guard": "runtime_execution_authorized=falseaction_buttons_allowed=false"
},
"awooopReadOnlyInputs": {
"title": "AwoooP 只讀輸入",
"body": "可消費 rollup snapshot、IwoooS projection、owner response validation rollup、Kali status 與 rollout policy。",
"handoff": "AwoooP 主線接入時只顯示狀態、evidence refs、route group 與 forbidden actions。",
"guard": "不保存 raw payload、credential plaintext、token value 或 execution payload。"
},
"nextCoordinationGate": {
"title": "下一個協調 Gate",
"body": "下一個真正能推動 headline 的高層 gate 仍是 owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready 或 AwoooP production landing。",
"handoff": "若另一個 Session 要推進 production landing必須提交 read-only consumption evidence 與 deployment proof。",
"guard": "不把 handoff packet 當 production consumption。"
}
}
}
},
"tickets": {

View File

@@ -52,6 +52,13 @@ type AwoooPReadOnlyLandingReadinessItem = {
tone: 'steady' | 'warn' | 'locked'
}
type AwoooPCrossSessionHandoffPacket = {
key: string
packet: string
icon: typeof ShieldCheck
tone: 'steady' | 'warn' | 'locked'
}
type OwnerResponseNextActionFocusItem = {
key: string
focus: string
@@ -375,6 +382,15 @@ const awooopReadOnlyLandingReadinessItems: AwoooPReadOnlyLandingReadinessItem[]
{ key: 'productionHandoffPending', item: 'L6', icon: Clock3, tone: 'locked' },
]
const awooopCrossSessionHandoffPackets: AwoooPCrossSessionHandoffPacket[] = [
{ key: 'branchAndPrAnchor', packet: 'H1', icon: GitBranch, tone: 'steady' },
{ key: 'progressSemantics', packet: 'H2', icon: Radar, tone: 'warn' },
{ key: 'requiredGuardCommands', packet: 'H3', icon: ShieldCheck, tone: 'steady' },
{ key: 'forbiddenRuntimeActions', packet: 'H4', icon: Lock, tone: 'locked' },
{ key: 'awooopReadOnlyInputs', packet: 'H5', icon: FileText, tone: 'steady' },
{ key: 'nextCoordinationGate', packet: 'H6', icon: ClipboardCheck, tone: 'warn' },
]
const ownerResponseNextActionFocusItems: OwnerResponseNextActionFocusItem[] = [
{ key: 'giteaOwnerAttestation', focus: 'S4.9', icon: ClipboardCheck, tone: 'warn' },
{ key: 'githubTargetOwnerDecision', focus: 'S4.10', icon: GitBranch, tone: 'warn' },
@@ -973,6 +989,39 @@ function AwoooPReadOnlyLandingReadinessCard({ item }: { item: AwoooPReadOnlyLand
)
}
function AwoooPCrossSessionHandoffPacketCard({ item }: { item: AwoooPCrossSessionHandoffPacket }) {
const t = useTranslations('iwooos.awooopCrossSessionHandoff')
const Icon = item.icon
const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const }
return (
<div style={{ ...band, minHeight: 204, padding: 16, ...textWrap }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 9 }}>
<Icon size={18} color={toneColors[item.tone]} />
<span style={{ fontSize: 11, color: '#87867f' }}>{t('packetLabel')}</span>
</div>
<span style={{ fontSize: 11, color: toneColors[item.tone] }}>{item.packet}</span>
</div>
<h2 style={{ fontSize: 14, margin: '12px 0 6px', color: '#141413' }}>
{t(`items.${item.key}.title` as never)}
</h2>
<p style={{ fontSize: 12, lineHeight: 1.55, color: '#6f6d66', margin: 0, ...textWrap }}>
{t(`items.${item.key}.body` as never)}
</p>
<div style={{ marginTop: 10, display: 'grid', gap: 5 }}>
<div style={{ fontSize: 11, color: '#87867f' }}>{t('handoffLabel')}</div>
<div style={{ fontSize: 11, color: toneColors[item.tone], lineHeight: 1.45, ...textWrap }}>
{t(`items.${item.key}.handoff` as never)}
</div>
<div style={{ fontSize: 11, color: '#87867f', marginTop: 4 }}>{t('guardLabel')}</div>
<div style={{ fontSize: 11, color: '#6f6d66', lineHeight: 1.45, ...textWrap }}>
{t(`items.${item.key}.guard` as never)}
</div>
</div>
</div>
)
}
function OwnerResponseNextActionFocusCard({ item }: { item: OwnerResponseNextActionFocusItem }) {
const t = useTranslations('iwooos.ownerResponseNextActionFocus')
const Icon = item.icon
@@ -2296,6 +2345,26 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
</div>
</section>
<section style={{ marginBottom: 14 }}>
<div style={{ marginBottom: 14 }}>
<h2 style={{ fontSize: 16, margin: 0 }}>{t('awooopCrossSessionHandoff.title')}</h2>
<p style={{ fontSize: 12, color: '#6f6d66', margin: '6px 0 0', lineHeight: 1.55 }}>
{t('awooopCrossSessionHandoff.subtitle')}
</p>
</div>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',
gap: 12,
}}
>
{awooopCrossSessionHandoffPackets.map(item => (
<AwoooPCrossSessionHandoffPacketCard key={item.key} item={item} />
))}
</div>
</section>
<section style={{ marginBottom: 14 }}>
<div style={{ marginBottom: 14 }}>
<h2 style={{ fontSize: 16, margin: 0 }}>{t('progressAcceleration.title')}</h2>