/** * 活动包清单 —— 统一报价 A2 · 替代选型(**案例活动 · loop**)。 * * 业务素材:docs/MVP示例工作流.html §1.6。 * `▶需拍板`(签字交出)→ manualActivation + 放行;`✋客户改需求` → userEventListener; * `⏱时限过半` → 时间监听(**时限必配**)。 */ import type { ActivityManifest, DmnModel } from '@contracts'; import { ALTERNATIVE_SKILLS } from './skills.ts'; import { ALTERNATIVE_CASE } from './views/report.ts'; import { activityIdSchema } from '@contracts'; import { CMMN_XML, NARRATIVE } from './case-model.ts'; const DOMAIN = 'quote_alternative'; const ACTIVITY_ID = activityIdSchema.parse('quote-alternative'); /** 替代等级 —— 把「装得下的判断」从 LLM 手里拿走 */ export const GRADE_DMN: DmnModel = { drd: [{ decision: 'alt-grade', requires: [], inputs: ['pinCompatible', 'packageSame', 'paramDelta'] }], tables: [ { id: 'alt-grade', label: '替代等级判定', hitPolicy: 'FIRST', inputs: [ { name: 'pinCompatible', expression: 'pinCompatible' }, { name: 'packageSame', expression: 'packageSame' }, { name: 'paramDelta', expression: 'paramDelta' }, ], outputs: [{ name: 'grade' }, { name: 'effort' }], rules: [ { id: 'g-p2p', when: ['true', 'true', '<= 0.05'], then: ['P2P', '核确免改动'] }, { id: 'g-func', when: ['-', '-', '<= 0.20'], then: ['功能兼容', '评外围电路与 layout'] }, { id: 'g-other', when: ['-', '-', '-'], then: ['其他', '须验证'] }, ], }, ], }; export const manifest: ActivityManifest = { identity: { activityId: ACTIVITY_ID, name: 'A2 · 替代选型', packageVersion: '0.1.2', category: '统一报价', paradigm: 'loop', sdkVersion: '0.1.0-m5', checksum: 'dev-checksum-quote-alternative', }, contract: { activityId: ACTIVITY_ID, version: '0.1.0', input: { data: { type: 'object', required: ['originalPn'], properties: { originalPn: { type: 'string' }, chipType: { type: 'string' }, params: { type: 'object' }, scenario: { type: 'string' }, }, }, messageAllowed: true, }, output: { mandatory: [ { name: 'benchmark', payload: { type: 'object', required: ['rows'], properties: { rows: { type: 'array' } } }, description: '替代对标表(已签字)', }, ], selective: [], }, requiredDeliverables: [{ key: 'benchmark-table', label: '替代对标表(FAE 签字)' }], acceptanceCriteria: [ { key: 'candidates', label: '2~3 颗分级候选经确认', level: 'L2', predicate: 'candidatesConfirmed >= 2' }, { key: 'diff-clear', label: '差异项与风险逐项写清', level: 'L2', predicate: 'undocumentedDiff = 0' }, { key: 'source-traceable', label: '每项数据来源可溯(以原厂官网规格书为准)', level: 'L3' }, { key: 'fae-sign', label: 'FAE 签字放行', level: 'L5' }, ], prohibitions: [ { key: 'no-unclear-diff', statement: '差异没核清的不放行' }, { key: 'no-banned', statement: '客户技术画像禁用清单里的型号不得作候选' }, ], authorization: { discretion: [{ key: 'widen-search', statement: '候选不足 2~3 颗时可放宽参数或换角度重新撒网' }], preauthorizedActions: [], humanCallBudget: 6, }, resources: { tools: [{ name: 'crm.history-price-read' }], skills: ALTERNATIVE_SKILLS.map((s) => s.id), models: ['quote-extractor'], roles: ['FAE'], budget: { steps: 100, tokens: 260_000, activeMinutes: 360, humanCalls: 6 }, }, }, declarations: { models: ['quote-extractor'], tools: [{ name: 'crm.history-price-read' }], ledger: [ { domain: DOMAIN, object: 'shortlist', label: '初筛清单', fields: [ { name: 'original_pn', type: 'text', primaryKey: true, masked: false, label: '原型号' }, { name: 'candidate_pn', type: 'text', primaryKey: true, masked: false, label: '候选型号' }, { name: 'brand', type: 'text', primaryKey: false, masked: false, label: '品牌' }, { name: 'lifecycle', type: 'text', primaryKey: false, masked: false, label: '生命周期' }, ], }, { domain: DOMAIN, object: 'benchmark', label: '替代对标表', fields: [ { name: 'original_pn', type: 'text', primaryKey: true, masked: false }, { name: 'candidate_pn', type: 'text', primaryKey: true, masked: false }, { name: 'grade', type: 'text', primaryKey: false, masked: false, label: '替代等级' }, { name: 'param_diff', type: 'text', primaryKey: false, masked: false, label: '参数差异项' }, { name: 'risk', type: 'text', primaryKey: false, masked: false, label: '差异风险' }, { name: 'verify_advice', type: 'text', primaryKey: false, masked: false, label: '验证建议' }, { name: 'signed_by', type: 'text', primaryKey: false, masked: false, label: 'FAE 签字' }, ], }, ], listeners: [ { // ⏱ 时限过半:向 BD 与 PM 同步进度与风险 origin: 'static', eventType: 'time', keyFilter: { kind: 'half-deadline' }, semantic: 'observe', deadline: 'P2D', escalation: ['nudge'], }, { // ✋ 客户改需求:应用条件/参数变更 → 回初选核险与圈选复核 origin: 'static', eventType: 'human', keyFilter: { kind: 'requirement-change' }, semantic: 'observe', deadline: 'P5D', escalation: ['nudge', 'reroute'], }, ], harness: { memoryWindow: 30, stallAfter: 'P1D', nudge: [{ after: 'PT12H', action: 'nudge' }], retry: { times: 2, backoff: 'PT5M' }, }, }, assets: { businessModel: { paradigm: 'loop', cmmnXml: CMMN_XML, narrative: NARRATIVE, dmn: GRADE_DMN, }, skills: ALTERNATIVE_SKILLS, viewTemplates: [{ name: 'case-overview', html: ALTERNATIVE_CASE }], cardSchemas: {}, distillHooks: [ { on: 'milestone', milestone: 'M_candidates', prompt: '归纳本轮撒网的有效角度与无效角度。' }, { on: 'terminal', prompt: '归纳替代经验:哪些参数差异实际造成了问题、哪些品牌的替代关系可复用。' }, ], }, samples: [ { name: 'EOL 料替代', input: { originalPn: 'TL072CDR', chipType: '运放', scenario: '车规' }, expect: { ports: ['benchmark'] }, }, ], entry: { file: 'index.js', checksum: 'dev-entry-quote-alternative' }, };