skills-experimental/exit-plan-mode-scanner-stateful-classifier/SKILL.md
# ExitPlanMode Scanner Stateful Classifier Pattern ## Source Claude Code: `utils/ultraplan/ccrSession.ts` (ExitPlanModeScanner) ## Pattern Stateful classifier for CCR event stream - ingest SDKMessage[] batches + precedence order + rescan after rejection. ## Code Example ```typescript export type ScanResult = | { kind: 'approved'; plan: string } | { kind: 'teleport'; plan: string } | { kind: 'rejected'; id: string } | { kind: 'pending' } | { kind: 'terminated'; subtype: string } |
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/exit-plan-mode-scanner-stateful-classifierInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Claude Code: utils/ultraplan/ccrSession.ts (ExitPlanModeScanner)
Stateful classifier for CCR event stream - ingest SDKMessage[] batches + precedence order + rescan after rejection.
export type ScanResult =
| { kind: 'approved'; plan: string }
| { kind: 'teleport'; plan: string }
| { kind: 'rejected'; id: string }
| { kind: 'pending' }
| { kind: 'terminated'; subtype: string }
| { kind: 'unchanged' }
export type UltraplanPhase = 'running' | 'needs_input' | 'plan_ready'
export class ExitPlanModeScanner {
private exitPlanCalls: string[] = []
private results = new Map<string, ToolResultBlockParam>()
private rejectedIds = new Set<string>()
private terminated: { subtype: string } | null = null
private rescanAfterRejection = false
everSeenPending = false
get rejectCount(): number {
return this.rejectedIds.size
}
get hasPendingPlan(): boolean {
const id = this.exitPlanCalls.findLast(c => !this.rejectedIds.has(c))
return id !== undefined && !this.results.has(id)
}
ingest(newEvents: SDKMessage[]): ScanResult {
// Parse events: assistant→tool_use, user→tool_result, result→terminated
for (const m of newEvents) {
if (m.type === 'assistant') {
for (const block of m.message.content) {
if (block.type === 'tool_use' && block.name === EXIT_PLAN_MODE_V2_TOOL_NAME) {
this.exitPlanCalls.push(block.id)
}
}
} else if (m.type === 'user') {
for (const block of content) {
if (block.type === 'tool_result') {
this.results.set(block.tool_use_id, block)
}
}
} else if (m.type === 'result' && m.subtype !== 'success') {
this.terminated = { subtype: m.subtype }
}
}
// Skip-scan when nothing changed
const shouldScan = newEvents.length > 0 || this.rescanAfterRejection
this.rescanAfterRejection = false
// Scan backwards: newest non-rejected first
// Precedence: approved > terminated > rejected > pending > unchanged
if (shouldScan) {
for (let i = this.exitPlanCalls.length - 1; i >= 0; i--) {
const id = this.exitPlanCalls[i]!
if (this.rejectedIds.has(id)) continue
const tr = this.results.get(id)
if (!tr) {
found = { kind: 'pending' }
} else if (tr.is_error === true) {
const teleportPlan = extractTeleportPlan(tr.content)
found = teleportPlan !== null
? { kind: 'teleport', plan: teleportPlan }
: { kind: 'rejected', id }
} else {
found = { kind: 'approved', plan: extractApprovedPlan(tr.content) }
}
break
}
}
// Bookkeeping
if (found?.kind === 'rejected') {
this.rejectedIds.add(found.id)
this.rescanAfterRejection = true // Rejection moves target
}
if (this.terminated) return { kind: 'terminated', subtype: this.terminated.subtype }
if (found?.kind === 'approved' || found?.kind === 'teleport') return found
if (found?.kind === 'rejected') return found
if (found?.kind === 'pending') {
this.everSeenPending = true
return found
}
return { kind: 'unchanged' }
}
}
business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings