@xdxer/dingtalk-agent 0.1.5-beta.11 → 0.1.5-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../src/promotion.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync,\n renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentStage, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\nimport {\n applyMulticaDeployment, planMulticaDeployment, statusMulticaDeployment,\n type MulticaDeploymentOptions, type MulticaDeploymentPlan,\n type MulticaDeploymentReceipt,\n} from './multica-deploy.js'\n\nexport const PROMOTION_POLICY_SCHEMA = 'dingtalk-agent/promotion-policy@1'\nexport const PROMOTION_PLAN_SCHEMA = 'dingtalk-agent/promotion-plan@1'\nexport const PROMOTION_RECEIPT_SCHEMA = 'dingtalk-agent/promotion-receipt@1'\nexport const OBSERVATION_SCHEMA = 'dingtalk-agent/observation@1'\nexport const EVAL_CANDIDATE_SCHEMA = 'dingtalk-agent/eval-candidate@1'\n\nconst PROMOTION_ROOT = '.dingtalk-agent/development-workspace-evidence/promotions'\nconst CANDIDATE_ROOT = '.dingtalk-agent/eval-candidates'\nconst HASH = /^[a-f0-9]{64}$/\nconst SAFE_ID = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\nconst STAGE_RANK: Record<DevelopmentStage, number> = { dev: 0, test: 1, staging: 2, prod: 3 }\nconst SURFACES = new Set(['response', 'filesystem', 'workspace', 'artifact'])\n\nexport interface PromotionRoute {\n id: string\n fromWorkspace: string\n toWorkspace: string\n suite: string\n minimumRuns: number\n requiredCases: string[]\n requiredSurfaces: Array<'response' | 'filesystem' | 'workspace' | 'artifact'>\n requireBehaviorGate: boolean\n}\n\nexport interface PromotionPolicy {\n $schema: 'dingtalk-agent/promotion-policy@1'\n routes: PromotionRoute[]\n}\n\ninterface EvalGateEvidence {\n runId: string\n evidencePath: string\n evidenceHash: string\n planHash: string\n suiteHash: string\n reportHash: string\n suiteId: string\n model: string\n runs: number\n configurations: string[]\n caseIds: string[]\n requiredSurfaces: string[]\n loadGate: boolean\n hardGate: boolean\n falseCompletionGate: boolean\n behaviorGate: boolean\n}\n\nexport interface PromotionPlan {\n $schema: 'dingtalk-agent/promotion-plan@1'\n planId: string\n routeId: string\n policyPath: string\n policyHash: string\n source: {\n workspace: string\n stage: DevelopmentStage\n sourceHash: string\n desiredHash: string\n observedHash: string\n definitionHash: string\n skills: Array<{ name: string; hash: string }>\n }\n eval: EvalGateEvidence\n target: {\n workspace: string\n stage: DevelopmentStage\n desiredHash: string\n deploymentHash: string\n deploymentPlanId: string\n }\n deployment: MulticaDeploymentPlan\n blocking: string[]\n requiresPlanId: true\n requiresExplicitYes: true\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface PromotionReceipt {\n $schema: 'dingtalk-agent/promotion-receipt@1'\n promotionId: string\n receiptId: string\n planId: string\n routeId: string\n policyHash: string\n status: 'promoted' | 'verifying' | 'failed'\n passed: boolean\n idempotent: boolean\n source: PromotionPlan['source']\n eval: EvalGateEvidence\n target: PromotionPlan['target'] & {\n deploymentReceiptId: string\n deploymentOperationId: string\n deploymentReceiptPath: string\n deploymentReceiptHash: string\n observedHash: string\n }\n linkHash: string\n failures: string[]\n evidencePath: string\n remoteRead: boolean\n remoteWrite: boolean\n localWrite: true\n triggerWrite: false\n sideEffect: 'multica-read-write' | 'multica-read' | 'none'\n dingtalkSideEffect: false\n}\n\nexport interface PromotionStatus {\n $schema: 'dingtalk-agent/promotion-status@1'\n available: boolean\n promotionId: string\n status: 'promoted' | 'verifying' | 'failed' | 'missing'\n passed: boolean\n integrity: boolean\n receipt: PromotionReceipt | null\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface ObservationInput {\n $schema: 'dingtalk-agent/observation@1'\n observedAt: string\n observedHash: string\n category: 'behavior' | 'safety' | 'reliability' | 'quality'\n risk: 'low' | 'medium' | 'high' | 'critical'\n capability: string\n outcome: 'pass' | 'fail' | 'mixed' | 'unknown'\n summary: string\n expected: string\n actual: string\n sourceRefs: string[]\n redacted: true\n}\n\nexport interface EvalCandidate {\n $schema: 'dingtalk-agent/eval-candidate@1'\n candidateId: string\n status: 'proposed'\n eligibleForSuite: false\n reviewRequired: true\n published: false\n promotion: {\n promotionId: string\n receiptId: string\n receiptHash: string\n linkHash: string\n }\n source: PromotionReceipt['source']\n eval: {\n runId: string\n evidenceHash: string\n suiteId: string\n }\n target: {\n workspace: string\n deploymentReceiptId: string\n deploymentHash: string\n observedHash: string\n }\n observation: ObservationInput\n observationHash: string\n candidateHash: string\n evidencePath: string\n remoteRead: false\n remoteWrite: false\n localWrite: true\n triggerWrite: false\n sideEffect: 'local-eval-candidate'\n dingtalkSideEffect: false\n}\n\nexport interface EvalCandidatePlan {\n $schema: 'dingtalk-agent/eval-candidate-plan@1'\n candidateId: string\n promotionId: string\n observedHash: string\n observationHash: string\n candidatePath: string\n writeBudget: { local: 1 }\n reviewRequired: true\n eligibleForSuite: false\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface EvalCandidateResult {\n $schema: 'dingtalk-agent/eval-candidate-result@1'\n applied: boolean\n idempotent: boolean\n candidate: EvalCandidate\n remoteRead: false\n remoteWrite: false\n localWrite: boolean\n triggerWrite: false\n sideEffect: false | 'local-eval-candidate'\n dingtalkSideEffect: false\n}\n\nexport function planPromotion(\n start: string,\n policyRef: string,\n routeId: string,\n options: { env?: NodeJS.ProcessEnv; cliVersion?: string } = {},\n): PromotionPlan {\n const info = inspectAgentProject(start, options.cliVersion || '')\n const { policy, policyPath, policyHash } = loadPolicy(info.root, policyRef)\n const route = policy.routes.find((item) => item.id === routeId)\n if (!route) throw new Error(`Promotion route 不存在: ${routeId}`)\n const source = showDevelopmentWorkspace(info.root, route.fromWorkspace, options.cliVersion || '')\n const target = showDevelopmentWorkspace(info.root, route.toWorkspace, options.cliVersion || '')\n const blocking: string[] = []\n if (source.legacy || source.provider.kind !== 'opencode') blocking.push('source.provider-not-opencode')\n if (target.legacy || target.provider.kind !== 'multica') blocking.push('target.provider-not-multica')\n if (target.stage === 'prod') blocking.push('target.prod-requires-separate-live-gate')\n if (STAGE_RANK[target.stage] < STAGE_RANK[source.stage]) blocking.push('target.stage-downgrade')\n if (source.sourceHash !== target.sourceHash) blocking.push('project.source-hash-mismatch')\n\n let evalEvidence: EvalGateEvidence | null = null\n try { evalEvidence = loadEvalGate(info.root, source, route) }\n catch (error) { blocking.push(`eval.${errorCategory(error)}`) }\n\n let deployment: MulticaDeploymentPlan\n try {\n deployment = planMulticaDeployment(info.root, target.name, {\n env: options.env, cliVersion: options.cliVersion,\n })\n blocking.push(...deployment.blocking.map((item) => `deployment.${item}`))\n } catch (error) {\n blocking.push(`deployment.${errorCategory(error)}`)\n deployment = emptyDeploymentPlan(target)\n }\n\n const sourceSkills = deployment.expected.skills.map((item) => ({ name: item.name, hash: item.hash }))\n const sourceBinding: PromotionPlan['source'] = {\n workspace: source.name,\n stage: source.stage,\n sourceHash: source.sourceHash,\n desiredHash: source.desiredHash,\n observedHash: source.observedHash,\n definitionHash: deployment.expected.definitionHash || emptyHash(),\n skills: sourceSkills,\n }\n const targetBinding: PromotionPlan['target'] = {\n workspace: target.name,\n stage: target.stage,\n desiredHash: target.desiredHash,\n deploymentHash: deployment.deploymentHash || emptyHash(),\n deploymentPlanId: deployment.planId,\n }\n const resolvedEval = evalEvidence || emptyEvalEvidence(route)\n const uniqueBlocking = [...new Set(blocking)].sort()\n const planId = `promotion_plan_${digest(stableStringify({\n routeId, policyHash, source: sourceBinding, eval: resolvedEval,\n target: targetBinding, deploymentPlanId: deployment.planId, blocking: uniqueBlocking,\n })).slice(0, 24)}`\n return {\n $schema: PROMOTION_PLAN_SCHEMA,\n planId,\n routeId,\n policyPath,\n policyHash,\n source: sourceBinding,\n eval: resolvedEval,\n target: targetBinding,\n deployment,\n blocking: uniqueBlocking,\n requiresPlanId: true,\n requiresExplicitYes: true,\n remoteRead: false,\n remoteWrite: false,\n localWrite: false,\n triggerWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function applyPromotion(\n start: string,\n policyRef: string,\n routeId: string,\n options: MulticaDeploymentOptions = {},\n): PromotionReceipt {\n if (!options.yes || !options.planId) {\n throw new Error('promote 会调用 Multica deploy;必须显式传当前 --plan-id 和 --yes')\n }\n const info = inspectAgentProject(start, options.cliVersion || '')\n const plan = planPromotion(info.root, policyRef, routeId, {\n env: options.env, cliVersion: options.cliVersion,\n })\n if (plan.planId !== options.planId) {\n throw new Error(`promotion plan 已失效;期望当前 planId ${plan.planId}`)\n }\n if (plan.blocking.length) throw new Error(`promotion 前置条件不完整: ${plan.blocking.join(', ')}`)\n const deployment = applyMulticaDeployment(info.root, plan.target.workspace, {\n ...options,\n planId: plan.deployment.planId,\n yes: true,\n })\n const deploymentReceiptPath = safeProjectPath(info.root, deployment.evidencePath, true)\n const deploymentReceiptHash = sha256(readFileSync(deploymentReceiptPath))\n const promoted = deployment.status === 'ready' && deployment.passed && deployment.providerReady &&\n deployment.deploymentHash === plan.target.deploymentHash && Boolean(deployment.observedHash)\n const status: PromotionReceipt['status'] = promoted ? 'promoted'\n : ['verifying', 'reconciling'].includes(deployment.status) ? 'verifying' : 'failed'\n const target = {\n ...plan.target,\n deploymentReceiptId: deployment.receiptId,\n deploymentOperationId: deployment.operationId,\n deploymentReceiptPath: deployment.evidencePath,\n deploymentReceiptHash,\n observedHash: deployment.observedHash,\n }\n const linkHash = promotionLinkHash(plan.source, plan.eval, target)\n const promotionId = `promotion_${digest(stableStringify({\n routeId, planId: plan.planId, deploymentReceiptId: deployment.receiptId, linkHash,\n })).slice(0, 24)}`\n const receiptId = `promotion_receipt_${digest(stableStringify({ promotionId, status, linkHash })).slice(0, 24)}`\n const receipt: PromotionReceipt = {\n $schema: PROMOTION_RECEIPT_SCHEMA,\n promotionId,\n receiptId,\n planId: plan.planId,\n routeId,\n policyHash: plan.policyHash,\n status,\n passed: promoted,\n idempotent: deployment.idempotent,\n source: plan.source,\n eval: plan.eval,\n target,\n linkHash,\n failures: promoted ? [] : [...deployment.failures],\n evidencePath: promotionReceiptPath(receiptId),\n remoteRead: deployment.remoteRead,\n remoteWrite: deployment.remoteWrite,\n localWrite: true,\n triggerWrite: false,\n sideEffect: deployment.sideEffect,\n dingtalkSideEffect: false,\n }\n persistPromotion(info.root, receipt)\n return receipt\n}\n\nexport function statusPromotion(start: string, promotionId = ''): PromotionStatus {\n const info = inspectAgentProject(start)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) return {\n $schema: 'dingtalk-agent/promotion-status@1', available: false,\n promotionId: '', status: 'missing', passed: false, integrity: true, receipt: null,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n verifyPromotionDependencies(info.root, loaded.receipt, loaded.receiptHash)\n return {\n $schema: 'dingtalk-agent/promotion-status@1', available: true,\n promotionId: loaded.receipt.promotionId,\n status: loaded.receipt.status,\n passed: loaded.receipt.passed,\n integrity: true,\n receipt: loaded.receipt,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function listPromotions(start: string): Record<string, unknown> {\n const info = inspectAgentProject(start)\n const directory = safeProjectPath(info.root, join(PROMOTION_ROOT, 'bindings'), false)\n const promotions: Array<Record<string, unknown>> = []\n if (existsSync(directory)) {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .filter((item) => item.isFile() && item.name.endsWith('.json'))\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const promotionId = entry.name.slice(0, -5)\n const status = statusPromotion(info.root, promotionId)\n if (!status.receipt) continue\n promotions.push({\n promotionId, receiptId: status.receipt.receiptId, routeId: status.receipt.routeId,\n status: status.receipt.status, passed: status.receipt.passed,\n sourceHash: status.receipt.source.sourceHash,\n evalEvidenceHash: status.receipt.eval.evidenceHash,\n deploymentHash: status.receipt.target.deploymentHash,\n observedHash: status.receipt.target.observedHash,\n })\n }\n }\n return {\n $schema: 'dingtalk-agent/promotion-list@1', promotions,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function planObservation(\n start: string, promotionId: string, inputRef: string,\n): EvalCandidatePlan {\n const info = inspectAgentProject(start)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) throw new Error(`Promotion 不存在: ${promotionId}`)\n verifyPromotionDependencies(info.root, loaded.receipt, loaded.receiptHash)\n if (!loaded.receipt.passed || loaded.receipt.status !== 'promoted') {\n throw new Error('只有已 promoted 且完整性通过的 Receipt 可以生成 Eval candidate')\n }\n const observation = loadObservation(info.root, inputRef)\n if (observation.observedHash !== loaded.receipt.target.observedHash) {\n throw new Error('Observation observedHash 与 Promotion 远端 observedHash 不一致')\n }\n const observationHash = digest(stableStringify(observation))\n const candidateId = `eval_candidate_${digest(stableStringify({\n promotionId, receiptHash: loaded.receiptHash, observationHash,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/eval-candidate-plan@1',\n candidateId,\n promotionId,\n observedHash: observation.observedHash,\n observationHash,\n candidatePath: candidatePath(candidateId),\n writeBudget: { local: 1 },\n reviewRequired: true,\n eligibleForSuite: false,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function applyObservation(\n start: string,\n promotionId: string,\n inputRef: string,\n options: { yes?: boolean } = {},\n): EvalCandidateResult {\n if (!options.yes) throw new Error('observe 会写入本地 Eval candidate;必须显式传 --yes')\n const info = inspectAgentProject(start)\n const plan = planObservation(info.root, promotionId, inputRef)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) throw new Error(`Promotion 不存在: ${promotionId}`)\n const observation = loadObservation(info.root, inputRef)\n const candidateBase = {\n $schema: EVAL_CANDIDATE_SCHEMA as EvalCandidate['$schema'],\n candidateId: plan.candidateId,\n status: 'proposed' as const,\n eligibleForSuite: false as const,\n reviewRequired: true as const,\n published: false as const,\n promotion: {\n promotionId,\n receiptId: loaded.receipt.receiptId,\n receiptHash: loaded.receiptHash,\n linkHash: loaded.receipt.linkHash,\n },\n source: loaded.receipt.source,\n eval: {\n runId: loaded.receipt.eval.runId,\n evidenceHash: loaded.receipt.eval.evidenceHash,\n suiteId: loaded.receipt.eval.suiteId,\n },\n target: {\n workspace: loaded.receipt.target.workspace,\n deploymentReceiptId: loaded.receipt.target.deploymentReceiptId,\n deploymentHash: loaded.receipt.target.deploymentHash,\n observedHash: loaded.receipt.target.observedHash,\n },\n observation,\n observationHash: plan.observationHash,\n evidencePath: plan.candidatePath,\n remoteRead: false as const,\n remoteWrite: false as const,\n localWrite: true as const,\n triggerWrite: false as const,\n sideEffect: 'local-eval-candidate' as const,\n dingtalkSideEffect: false as const,\n }\n const candidateHash = digest(stableStringify(candidateBase))\n const candidate: EvalCandidate = { ...candidateBase, candidateHash }\n const path = safeProjectPath(info.root, plan.candidatePath, false)\n if (existsSync(path)) {\n const previous = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(previous) !== stableStringify(candidate)) {\n throw new Error('Eval candidate ID 已存在但内容不一致')\n }\n return {\n $schema: 'dingtalk-agent/eval-candidate-result@1', applied: false, idempotent: true,\n candidate, remoteRead: false, remoteWrite: false, localWrite: false,\n triggerWrite: false, sideEffect: false, dingtalkSideEffect: false,\n }\n }\n atomicJson(path, candidate)\n const readback = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(readback) !== stableStringify(candidate)) {\n throw new Error('Eval candidate 写后回读不一致')\n }\n return {\n $schema: 'dingtalk-agent/eval-candidate-result@1', applied: true, idempotent: false,\n candidate, remoteRead: false, remoteWrite: false, localWrite: true,\n triggerWrite: false, sideEffect: 'local-eval-candidate', dingtalkSideEffect: false,\n }\n}\n\nfunction loadEvalGate(\n root: string, source: DevelopmentWorkspaceView, route: PromotionRoute,\n): EvalGateEvidence {\n if (!source.state || source.state.status !== 'ready') throw new Error('source-not-ready')\n const binding = source.state.binding\n for (const key of [\n 'managedPath', 'sourceHash', 'evalRunId', 'evalEvidencePath', 'evalPlanHash',\n 'evalSuiteHash', 'evalReportHash', 'evalSuiteId', 'evalModel', 'evalSourceHash',\n 'evalDesiredHash', 'evalObservedHash',\n ]) if (!binding[key]) throw new Error(`binding-${key}-missing`)\n if (binding.sourceHash !== source.sourceHash || binding.evalSourceHash !== source.sourceHash ||\n binding.evalDesiredHash !== source.desiredHash || source.state.desiredHash !== source.desiredHash) {\n throw new Error('source-hash-drift')\n }\n const managed = safeProjectPath(root, binding.managedPath, true)\n const actualObservedHash = hashTree(managed)\n if (actualObservedHash !== source.observedHash || actualObservedHash !== binding.evalObservedHash ||\n source.state.observedHash !== actualObservedHash) throw new Error('observed-hash-drift')\n const policySuitePath = safeProjectPath(root, route.suite, true)\n const policySuite = readJson(policySuitePath, 'Promotion policy suite')\n const policySuiteHash = digest(stableStringify(policySuite))\n if (policySuiteHash !== binding.evalSuiteHash) throw new Error('designated-suite-drift')\n const evidenceRoot = safeProjectPath(root, binding.evalEvidencePath, true)\n if (!lstatSync(evidenceRoot).isDirectory() || lstatSync(evidenceRoot).isSymbolicLink()) {\n throw new Error('evidence-root-invalid')\n }\n const planPath = safeProjectPath(root, join(binding.evalEvidencePath, 'plan.json'), true)\n const suitePath = safeProjectPath(root, join(binding.evalEvidencePath, 'suite.json'), true)\n const reportPath = safeProjectPath(root, join(binding.evalEvidencePath, 'report.json'), true)\n if (sha256(readFileSync(planPath)) !== binding.evalPlanHash ||\n sha256(readFileSync(reportPath)) !== binding.evalReportHash) throw new Error('evidence-byte-drift')\n const plan = readJson(planPath, 'OpenCode Eval plan')\n const suite = readJson(suitePath, 'OpenCode Eval suite')\n const report = readJson(reportPath, 'OpenCode Eval report')\n if (digest(stableStringify(suite)) !== binding.evalSuiteHash ||\n stableStringify(suite) !== stableStringify(policySuite)) throw new Error('suite-evidence-drift')\n if (plan.$schema !== 'dingtalk-agent/opencode-eval-plan@1' ||\n report.$schema !== 'dingtalk-agent/opencode-eval-report@1' ||\n report.runId !== binding.evalRunId || report.evidencePath !== binding.evalEvidencePath ||\n plan.suite !== suite.id || suite.id !== binding.evalSuiteId ||\n report.engine?.model !== source.provider.model || report.engine?.model !== binding.evalModel) {\n throw new Error('evidence-binding-mismatch')\n }\n const runs = Number(plan.runsPerConfiguration)\n const configurations = stringList(plan.configurations, 'Eval plan configurations')\n const planCases = Array.isArray(plan.cases) ? plan.cases : []\n const planCaseIds = planCases.map((item) => String(item?.id || ''))\n if (!Number.isInteger(runs) || runs < route.minimumRuns || runs > 10 ||\n configurations.length !== 2 || new Set(configurations).size !== configurations.length) {\n throw new Error('runs-or-configurations')\n }\n if (!route.requiredCases.every((id) => planCaseIds.includes(id))) throw new Error('required-case-missing')\n if (report.passed !== true || report.summary?.loadGate !== true ||\n report.summary?.hardGate !== true || report.summary?.falseCompletionGate !== true ||\n report.summary?.behaviorScoresValid !== true ||\n (route.requireBehaviorGate && report.summary?.behaviorGate !== true)) {\n throw new Error('hard-gate-failed')\n }\n for (const configuration of configurations) {\n const gate = report.summary?.configurationLoadGates?.[configuration]\n if (!gate?.passed || gate.passedRuns !== runs || gate.totalRuns !== runs) {\n throw new Error('configuration-load-gate-failed')\n }\n }\n const results = Array.isArray(report.results) ? report.results : []\n const expectedResults = planCaseIds.length * configurations.length * runs\n if (results.length !== expectedResults || results.some((item) =>\n !item.hardGatePassed || !item.safetyPassed || item.falseCompletion)) {\n throw new Error('result-hard-gate-failed')\n }\n for (const caseId of route.requiredCases) {\n for (const configuration of configurations) {\n const selected = results.filter((item) => item.id === caseId && item.configuration === configuration)\n if (selected.length !== runs) throw new Error('required-case-result-count')\n for (const surface of route.requiredSurfaces) {\n if (!selected.every((item) => item.surfaceResults?.[surface]?.declared === true &&\n item.surfaceResults?.[surface]?.passed === true)) throw new Error(`surface-${surface}-failed`)\n }\n }\n }\n const evidenceHash = digest(stableStringify({\n runId: binding.evalRunId,\n evidencePath: binding.evalEvidencePath,\n planHash: binding.evalPlanHash,\n suiteHash: binding.evalSuiteHash,\n reportHash: binding.evalReportHash,\n sourceHash: binding.evalSourceHash,\n desiredHash: binding.evalDesiredHash,\n observedHash: binding.evalObservedHash,\n }))\n return {\n runId: binding.evalRunId,\n evidencePath: binding.evalEvidencePath,\n evidenceHash,\n planHash: binding.evalPlanHash,\n suiteHash: binding.evalSuiteHash,\n reportHash: binding.evalReportHash,\n suiteId: binding.evalSuiteId,\n model: binding.evalModel,\n runs,\n configurations,\n caseIds: [...route.requiredCases],\n requiredSurfaces: [...route.requiredSurfaces],\n loadGate: true,\n hardGate: true,\n falseCompletionGate: true,\n behaviorGate: report.summary.behaviorGate === true,\n }\n}\n\nfunction loadPolicy(\n root: string, ref: string,\n): { policy: PromotionPolicy; policyPath: string; policyHash: string } {\n const path = safeProjectPath(root, ref, true)\n if (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile()) {\n throw new Error('Promotion policy 必须是 Project 内真实文件')\n }\n const input = readJson(path, 'Promotion policy')\n exactKeys(input, ['$schema', 'routes'], 'Promotion policy')\n if (input.$schema !== PROMOTION_POLICY_SCHEMA || !Array.isArray(input.routes) ||\n input.routes.length < 1 || input.routes.length > 32) throw new Error('Promotion policy schema/routes 非法')\n const ids = new Set<string>()\n const routes = input.routes.map((value, index) => {\n const item = objectValue(value, `Promotion route ${index}`)\n exactKeys(item, [\n 'id', 'fromWorkspace', 'toWorkspace', 'suite', 'minimumRuns',\n 'requiredCases', 'requiredSurfaces', 'requireBehaviorGate',\n ], `Promotion route ${index}`)\n const id = safeId(item.id, 'Promotion route id')\n if (ids.has(id)) throw new Error(`Promotion route 重复: ${id}`)\n ids.add(id)\n const requiredCases = uniqueSafeIds(item.requiredCases, 'Promotion requiredCases', 30)\n const requiredSurfaces = stringList(item.requiredSurfaces, 'Promotion requiredSurfaces')\n if (!requiredSurfaces.length || requiredSurfaces.some((surface) => !SURFACES.has(surface)) ||\n new Set(requiredSurfaces).size !== requiredSurfaces.length) throw new Error('Promotion requiredSurfaces 非法')\n if (!Number.isInteger(item.minimumRuns) || item.minimumRuns < 1 || item.minimumRuns > 10 ||\n typeof item.requireBehaviorGate !== 'boolean') throw new Error('Promotion route gate 配置非法')\n const suite = stringField(item.suite, 'Promotion suite')\n safeProjectPath(root, suite, true)\n return {\n id,\n fromWorkspace: safeId(item.fromWorkspace, 'Promotion fromWorkspace'),\n toWorkspace: safeId(item.toWorkspace, 'Promotion toWorkspace'),\n suite,\n minimumRuns: item.minimumRuns,\n requiredCases,\n requiredSurfaces: requiredSurfaces as PromotionRoute['requiredSurfaces'],\n requireBehaviorGate: item.requireBehaviorGate,\n }\n })\n const policy: PromotionPolicy = { $schema: PROMOTION_POLICY_SCHEMA, routes }\n return {\n policy,\n policyPath: relative(realpathSync(root), path),\n policyHash: digest(stableStringify(policy)),\n }\n}\n\nfunction loadObservation(root: string, ref: string): ObservationInput {\n const path = safeProjectPath(root, ref, true)\n if (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile()) {\n throw new Error('Observation input 必须是 Project 内真实文件')\n }\n const input = readJson(path, 'Observation input')\n exactKeys(input, [\n '$schema', 'observedAt', 'observedHash', 'category', 'risk', 'capability',\n 'outcome', 'summary', 'expected', 'actual', 'sourceRefs', 'redacted',\n ], 'Observation input')\n if (input.$schema !== OBSERVATION_SCHEMA || input.redacted !== true ||\n !['behavior', 'safety', 'reliability', 'quality'].includes(String(input.category)) ||\n !['low', 'medium', 'high', 'critical'].includes(String(input.risk)) ||\n !['pass', 'fail', 'mixed', 'unknown'].includes(String(input.outcome))) {\n throw new Error('Observation schema/category/risk/outcome/redacted 非法')\n }\n const observedAt = stringField(input.observedAt, 'Observation observedAt')\n if (Number.isNaN(Date.parse(observedAt)) || new Date(observedAt).toISOString() !== observedAt) {\n throw new Error('Observation observedAt 必须是规范 ISO 时间')\n }\n const observedHash = hashField(input.observedHash, 'Observation observedHash')\n const capability = boundedString(input.capability, 'Observation capability', 100)\n const summary = boundedString(input.summary, 'Observation summary', 500)\n const expected = boundedString(input.expected, 'Observation expected', 1000)\n const actual = boundedString(input.actual, 'Observation actual', 1000)\n const sourceRefs = stringList(input.sourceRefs, 'Observation sourceRefs')\n if (sourceRefs.length > 10 || sourceRefs.some((item) => item.length > 200)) {\n throw new Error('Observation sourceRefs 超出预算')\n }\n assertRedactedObservation([capability, summary, expected, actual, ...sourceRefs])\n return {\n $schema: OBSERVATION_SCHEMA,\n observedAt,\n observedHash,\n category: input.category as ObservationInput['category'],\n risk: input.risk as ObservationInput['risk'],\n capability,\n outcome: input.outcome as ObservationInput['outcome'],\n summary,\n expected,\n actual,\n sourceRefs,\n redacted: true,\n }\n}\n\nfunction persistPromotion(root: string, receipt: PromotionReceipt): void {\n const receiptPath = safeProjectPath(root, receipt.evidencePath, false)\n atomicJson(receiptPath, receipt)\n const receiptHash = sha256(readFileSync(receiptPath))\n const pointer = {\n $schema: 'dingtalk-agent/promotion-pointer@1',\n promotionId: receipt.promotionId,\n receiptId: receipt.receiptId,\n receiptPath: receipt.evidencePath,\n receiptHash,\n }\n atomicJson(safeProjectPath(root, promotionBindingPath(receipt.promotionId), false), pointer)\n atomicJson(safeProjectPath(root, join(PROMOTION_ROOT, 'latest.json'), false), pointer)\n}\n\nfunction loadPromotion(\n root: string, promotionId = '',\n): { receipt: PromotionReceipt; receiptHash: string } | null {\n const pointerPath = safeProjectPath(root, promotionId\n ? promotionBindingPath(safeResourceId(promotionId, 'promotionId'))\n : join(PROMOTION_ROOT, 'latest.json'), false)\n if (!existsSync(pointerPath)) return null\n const pointer = readJson(pointerPath, 'Promotion pointer')\n exactKeys(pointer, ['$schema', 'promotionId', 'receiptId', 'receiptPath', 'receiptHash'], 'Promotion pointer')\n if (pointer.$schema !== 'dingtalk-agent/promotion-pointer@1') throw new Error('Promotion pointer schema 非法')\n const expectedPromotionId = safeResourceId(pointer.promotionId, 'pointer promotionId')\n if (promotionId && expectedPromotionId !== promotionId) throw new Error('Promotion pointer ID 不一致')\n const receiptPath = safeProjectPath(root, stringField(pointer.receiptPath, 'pointer receiptPath'), true)\n const receiptHash = sha256(readFileSync(receiptPath))\n if (receiptHash !== hashField(pointer.receiptHash, 'pointer receiptHash')) {\n throw new Error('Promotion Receipt hash 不一致')\n }\n const receipt = readJson(receiptPath, 'Promotion Receipt') as unknown as PromotionReceipt\n if (receipt.$schema !== PROMOTION_RECEIPT_SCHEMA || receipt.promotionId !== expectedPromotionId ||\n receipt.receiptId !== pointer.receiptId || receipt.evidencePath !== pointer.receiptPath) {\n throw new Error('Promotion Receipt 绑定不一致')\n }\n return { receipt, receiptHash }\n}\n\nfunction verifyPromotionDependencies(root: string, receipt: PromotionReceipt, receiptHash: string): void {\n if (receipt.linkHash !== promotionLinkHash(receipt.source, receipt.eval, receipt.target)) {\n throw new Error('Promotion source/eval/target link hash 不一致')\n }\n const evalPlan = safeProjectPath(root, join(receipt.eval.evidencePath, 'plan.json'), true)\n const evalSuite = safeProjectPath(root, join(receipt.eval.evidencePath, 'suite.json'), true)\n const evalReport = safeProjectPath(root, join(receipt.eval.evidencePath, 'report.json'), true)\n if (sha256(readFileSync(evalPlan)) !== receipt.eval.planHash ||\n digest(stableStringify(readJson(evalSuite, 'Promotion Eval suite'))) !== receipt.eval.suiteHash ||\n sha256(readFileSync(evalReport)) !== receipt.eval.reportHash) {\n throw new Error('Promotion Eval plan/suite/report 发生漂移')\n }\n const deploymentStatus = statusMulticaDeployment(root, receipt.target.workspace, {\n operationId: receipt.target.deploymentOperationId,\n })\n if (!deploymentStatus.receipt || deploymentStatus.receipt.receiptId !== receipt.target.deploymentReceiptId ||\n deploymentStatus.receipt.evidencePath !== receipt.target.deploymentReceiptPath ||\n sha256(readFileSync(safeProjectPath(root, receipt.target.deploymentReceiptPath, true))) !==\n receipt.target.deploymentReceiptHash ||\n deploymentStatus.receipt.deploymentHash !== receipt.target.deploymentHash ||\n deploymentStatus.receipt.observedHash !== receipt.target.observedHash) {\n throw new Error('Promotion 绑定的 Multica deployment Receipt 不一致')\n }\n if (!HASH.test(receiptHash)) throw new Error('Promotion Receipt hash 非法')\n}\n\nfunction promotionLinkHash(\n source: PromotionPlan['source'], evalEvidence: EvalGateEvidence,\n target: PromotionReceipt['target'] | (PromotionPlan['target'] & Record<string, unknown>),\n): string {\n return digest(stableStringify({\n source: {\n workspace: source.workspace, stage: source.stage, sourceHash: source.sourceHash,\n desiredHash: source.desiredHash, observedHash: source.observedHash,\n definitionHash: source.definitionHash, skills: source.skills,\n },\n eval: {\n runId: evalEvidence.runId, evidenceHash: evalEvidence.evidenceHash,\n suiteId: evalEvidence.suiteId, suiteHash: evalEvidence.suiteHash,\n reportHash: evalEvidence.reportHash,\n },\n target: {\n workspace: target.workspace, stage: target.stage,\n deploymentHash: target.deploymentHash,\n deploymentReceiptId: 'deploymentReceiptId' in target ? target.deploymentReceiptId : '',\n deploymentReceiptHash: 'deploymentReceiptHash' in target ? target.deploymentReceiptHash : '',\n observedHash: 'observedHash' in target ? target.observedHash : '',\n },\n }))\n}\n\nfunction emptyDeploymentPlan(target: DevelopmentWorkspaceView): MulticaDeploymentPlan {\n return {\n $schema: 'dingtalk-agent/multica-deployment-plan@1',\n planId: 'multica_deploy_plan_unavailable', action: 'apply', workspace: target.name,\n provider: 'multica', profile: '', inspectionId: '', desiredHash: target.desiredHash,\n deploymentHash: emptyHash(), expected: {\n workspaceId: '', runtimeId: '', agentId: '', agentName: '', skills: [],\n definitionHash: emptyHash(), instructionsHash: emptyHash(),\n }, rebindRuntime: false,\n operations: [], writeBudget: { forward: 0, rollback: 0 }, blocking: ['unavailable'],\n requiresPlanId: true, requiresExplicitYes: true, remoteRead: false, remoteWrite: false,\n triggerWrite: false, sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nfunction emptyEvalEvidence(route: PromotionRoute): EvalGateEvidence {\n return {\n runId: '', evidencePath: '', evidenceHash: emptyHash(), planHash: emptyHash(),\n suiteHash: emptyHash(), reportHash: emptyHash(), suiteId: '', model: '', runs: 0,\n configurations: [], caseIds: [...route.requiredCases],\n requiredSurfaces: [...route.requiredSurfaces], loadGate: false, hardGate: false,\n falseCompletionGate: false, behaviorGate: false,\n }\n}\n\nfunction hashTree(root: string): string {\n if (!lstatSync(root).isDirectory() || lstatSync(root).isSymbolicLink()) {\n throw new Error('Managed Workspace 必须是普通目录')\n }\n const base = realpathSync(root)\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const path = join(directory, entry.name)\n const ref = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Managed Workspace 不允许符号链接: ${ref}`)\n if (entry.isDirectory()) visit(path, ref)\n else if (entry.isFile()) entries.push({ path: ref, hash: sha256(readFileSync(path)) })\n else throw new Error(`Managed Workspace 包含特殊文件: ${ref}`)\n }\n }\n visit(base)\n return digest(stableStringify(entries))\n}\n\nfunction assertRedactedObservation(values: string[]): void {\n const text = values.join('\\n')\n const forbidden = [\n /(?:client[_-]?secret|access[_-]?token|refresh[_-]?token|password|credentials?|authorization|bearer)/iu,\n /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/iu,\n /(?:https?:\\/\\/|dingtalk:\\/\\/)/iu,\n /(?:^|\\D)(?:\\+?86[- ]?)?1[3-9]\\d{9}(?:\\D|$)/u,\n /\\b[A-Za-z0-9_-]{40,}\\b/u,\n ]\n if (forbidden.some((pattern) => pattern.test(text))) {\n throw new Error('Observation 包含凭据、PII、URL 或未脱敏长标识')\n }\n}\n\nfunction promotionReceiptPath(receiptId: string): string {\n return join(PROMOTION_ROOT, 'receipts', `${safeResourceId(receiptId, 'receiptId')}.json`)\n}\n\nfunction promotionBindingPath(promotionId: string): string {\n return join(PROMOTION_ROOT, 'bindings', `${safeResourceId(promotionId, 'promotionId')}.json`)\n}\n\nfunction candidatePath(candidateId: string): string {\n return join(CANDIDATE_ROOT, `${safeResourceId(candidateId, 'candidateId')}.json`)\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Promotion 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Promotion 路径不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) throw new Error(`Promotion 路径不能是符号链接: ${ref}`)\n if (realpathSync(candidate) !== candidate && !isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Promotion 真实路径越界: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Promotion 父目录越界: ${ref}`)\n }\n return candidate\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}-${randomUUID().slice(0, 8)}`\n writeFileSync(temp, `${JSON.stringify(value, null, 2)}\\n`, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction readJson(path: string, label: string): Record<string, any> {\n try {\n const value = JSON.parse(readFileSync(path, 'utf8'))\n return objectValue(value, label)\n } catch (error) {\n throw new Error(`${label} 不是合法 JSON object: ${(error as Error).message}`)\n }\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: string[], label: string): void {\n const expected = [...keys].sort()\n const actual = Object.keys(value).sort()\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`${label} 字段不精确: ${actual.join(',')}`)\n }\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, any> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${label} 必须是 object`)\n return value as Record<string, any>\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} 必须是非空字符串`)\n return value.trim()\n}\n\nfunction boundedString(value: unknown, label: string, max: number): string {\n const item = stringField(value, label)\n if (item.length > max) throw new Error(`${label} 超过 ${max} 字符预算`)\n return item\n}\n\nfunction stringList(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || !item.trim())) {\n throw new Error(`${label} 必须是非空字符串数组`)\n }\n return value.map((item) => item.trim())\n}\n\nfunction uniqueSafeIds(value: unknown, label: string, max: number): string[] {\n const items = stringList(value, label).map((item) => safeId(item, label))\n if (!items.length || items.length > max || new Set(items).size !== items.length) {\n throw new Error(`${label} 数量或唯一性非法`)\n }\n return items\n}\n\nfunction safeId(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!SAFE_ID.test(item)) throw new Error(`${label} 不是安全 ID: ${item}`)\n return item\n}\n\nfunction safeResourceId(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(item)) throw new Error(`${label} 不是安全资源 ID`)\n return item\n}\n\nfunction hashField(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!HASH.test(item)) throw new Error(`${label} 不是 SHA-256`)\n return item\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction emptyHash(): string {\n return '0'.repeat(64)\n}\n\nfunction errorCategory(error: unknown): string {\n return String((error as Error)?.message || error).replace(/[^a-zA-Z0-9._-]+/g, '-').slice(0, 120)\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}
1
+ {"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../src/promotion.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync,\n renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentStage, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\nimport {\n applyMulticaDeployment, planMulticaDeployment, statusMulticaDeployment,\n type MulticaDeploymentOptions, type MulticaDeploymentPlan,\n type MulticaDeploymentReceipt,\n} from './multica-deploy.js'\n\nexport const PROMOTION_POLICY_SCHEMA = 'dingtalk-agent/promotion-policy@1'\nexport const PROMOTION_PLAN_SCHEMA = 'dingtalk-agent/promotion-plan@1'\nexport const PROMOTION_RECEIPT_SCHEMA = 'dingtalk-agent/promotion-receipt@1'\nexport const OBSERVATION_SCHEMA = 'dingtalk-agent/observation@1'\nexport const EVAL_CANDIDATE_SCHEMA = 'dingtalk-agent/eval-candidate@1'\n\nconst PROMOTION_ROOT = '.dingtalk-agent/development-workspace-evidence/promotions'\nconst CANDIDATE_ROOT = '.dingtalk-agent/eval-candidates'\nconst HASH = /^[a-f0-9]{64}$/\nconst SAFE_ID = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\nconst STAGE_RANK: Record<DevelopmentStage, number> = { dev: 0, test: 1, staging: 2, prod: 3 }\nconst SURFACES = new Set(['response', 'filesystem', 'workspace', 'artifact'])\n\nexport interface PromotionRoute {\n id: string\n fromWorkspace: string\n toWorkspace: string\n suite: string\n minimumRuns: number\n requiredCases: string[]\n requiredSurfaces: Array<'response' | 'filesystem' | 'workspace' | 'artifact'>\n requireBehaviorGate: boolean\n}\n\nexport interface PromotionPolicy {\n $schema: 'dingtalk-agent/promotion-policy@1'\n routes: PromotionRoute[]\n}\n\ninterface EvalGateEvidence {\n runId: string\n evidencePath: string\n evidenceHash: string\n planHash: string\n suiteHash: string\n reportHash: string\n suiteId: string\n model: string\n runs: number\n configurations: string[]\n caseIds: string[]\n requiredSurfaces: string[]\n loadGate: boolean\n hardGate: boolean\n falseCompletionGate: boolean\n behaviorGate: boolean\n}\n\nexport interface PromotionPlan {\n $schema: 'dingtalk-agent/promotion-plan@1'\n planId: string\n routeId: string\n policyPath: string\n policyHash: string\n source: {\n workspace: string\n stage: DevelopmentStage\n sourceHash: string\n desiredHash: string\n observedHash: string\n definitionHash: string\n skills: Array<{ name: string; hash: string }>\n }\n eval: EvalGateEvidence\n target: {\n workspace: string\n stage: DevelopmentStage\n desiredHash: string\n deploymentHash: string\n deploymentPlanId: string\n }\n deployment: MulticaDeploymentPlan\n blocking: string[]\n requiresPlanId: true\n requiresExplicitYes: true\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface PromotionReceipt {\n $schema: 'dingtalk-agent/promotion-receipt@1'\n promotionId: string\n receiptId: string\n planId: string\n routeId: string\n policyHash: string\n status: 'promoted' | 'verifying' | 'failed'\n passed: boolean\n idempotent: boolean\n source: PromotionPlan['source']\n eval: EvalGateEvidence\n target: PromotionPlan['target'] & {\n deploymentReceiptId: string\n deploymentOperationId: string\n deploymentReceiptPath: string\n deploymentReceiptHash: string\n observedHash: string\n }\n linkHash: string\n failures: string[]\n evidencePath: string\n remoteRead: boolean\n remoteWrite: boolean\n localWrite: true\n triggerWrite: false\n sideEffect: 'multica-read-write' | 'multica-read' | 'none'\n dingtalkSideEffect: false\n}\n\nexport interface PromotionStatus {\n $schema: 'dingtalk-agent/promotion-status@1'\n available: boolean\n promotionId: string\n status: 'promoted' | 'verifying' | 'failed' | 'missing'\n passed: boolean\n integrity: boolean\n receipt: PromotionReceipt | null\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface ObservationInput {\n $schema: 'dingtalk-agent/observation@1'\n observedAt: string\n observedHash: string\n category: 'behavior' | 'safety' | 'reliability' | 'quality'\n risk: 'low' | 'medium' | 'high' | 'critical'\n capability: string\n outcome: 'pass' | 'fail' | 'mixed' | 'unknown'\n summary: string\n expected: string\n actual: string\n sourceRefs: string[]\n redacted: true\n}\n\nexport interface EvalCandidate {\n $schema: 'dingtalk-agent/eval-candidate@1'\n candidateId: string\n status: 'proposed'\n eligibleForSuite: false\n reviewRequired: true\n published: false\n promotion: {\n promotionId: string\n receiptId: string\n receiptHash: string\n linkHash: string\n }\n source: PromotionReceipt['source']\n eval: {\n runId: string\n evidenceHash: string\n suiteId: string\n }\n target: {\n workspace: string\n deploymentReceiptId: string\n deploymentHash: string\n observedHash: string\n }\n observation: ObservationInput\n observationHash: string\n candidateHash: string\n evidencePath: string\n remoteRead: false\n remoteWrite: false\n localWrite: true\n triggerWrite: false\n sideEffect: 'local-eval-candidate'\n dingtalkSideEffect: false\n}\n\nexport interface EvalCandidatePlan {\n $schema: 'dingtalk-agent/eval-candidate-plan@1'\n candidateId: string\n promotionId: string\n observedHash: string\n observationHash: string\n candidatePath: string\n writeBudget: { local: 1 }\n reviewRequired: true\n eligibleForSuite: false\n remoteRead: false\n remoteWrite: false\n localWrite: false\n triggerWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface EvalCandidateResult {\n $schema: 'dingtalk-agent/eval-candidate-result@1'\n applied: boolean\n idempotent: boolean\n candidate: EvalCandidate\n remoteRead: false\n remoteWrite: false\n localWrite: boolean\n triggerWrite: false\n sideEffect: false | 'local-eval-candidate'\n dingtalkSideEffect: false\n}\n\nexport function planPromotion(\n start: string,\n policyRef: string,\n routeId: string,\n options: { env?: NodeJS.ProcessEnv; cliVersion?: string } = {},\n): PromotionPlan {\n const info = inspectAgentProject(start, options.cliVersion || '')\n const { policy, policyPath, policyHash } = loadPolicy(info.root, policyRef)\n const route = policy.routes.find((item) => item.id === routeId)\n if (!route) throw new Error(`Promotion route 不存在: ${routeId}`)\n const source = showDevelopmentWorkspace(info.root, route.fromWorkspace, options.cliVersion || '')\n const target = showDevelopmentWorkspace(info.root, route.toWorkspace, options.cliVersion || '')\n const blocking: string[] = []\n if (source.legacy || source.provider.kind !== 'opencode') blocking.push('source.provider-not-opencode')\n if (target.legacy || target.provider.kind !== 'multica') blocking.push('target.provider-not-multica')\n if (target.stage === 'prod') blocking.push('target.prod-requires-separate-live-gate')\n if (STAGE_RANK[target.stage] < STAGE_RANK[source.stage]) blocking.push('target.stage-downgrade')\n if (source.sourceHash !== target.sourceHash) blocking.push('project.source-hash-mismatch')\n\n let evalEvidence: EvalGateEvidence | null = null\n try { evalEvidence = loadEvalGate(info.root, source, route) }\n catch (error) { blocking.push(`eval.${errorCategory(error)}`) }\n\n let deployment: MulticaDeploymentPlan\n try {\n deployment = planMulticaDeployment(info.root, target.name, {\n env: options.env, cliVersion: options.cliVersion,\n })\n blocking.push(...deployment.blocking.map((item) => `deployment.${item}`))\n } catch (error) {\n blocking.push(`deployment.${errorCategory(error)}`)\n deployment = emptyDeploymentPlan(target)\n }\n\n const sourceSkills = deployment.expected.skills.map((item) => ({ name: item.name, hash: item.hash }))\n const sourceBinding: PromotionPlan['source'] = {\n workspace: source.name,\n stage: source.stage,\n sourceHash: source.sourceHash,\n desiredHash: source.desiredHash,\n observedHash: source.observedHash,\n definitionHash: deployment.expected.definitionHash || emptyHash(),\n skills: sourceSkills,\n }\n const targetBinding: PromotionPlan['target'] = {\n workspace: target.name,\n stage: target.stage,\n desiredHash: target.desiredHash,\n deploymentHash: deployment.deploymentHash || emptyHash(),\n deploymentPlanId: deployment.planId,\n }\n const resolvedEval = evalEvidence || emptyEvalEvidence(route)\n const uniqueBlocking = [...new Set(blocking)].sort()\n const planId = `promotion_plan_${digest(stableStringify({\n routeId, policyHash, source: sourceBinding, eval: resolvedEval,\n target: targetBinding, deploymentPlanId: deployment.planId, blocking: uniqueBlocking,\n })).slice(0, 24)}`\n return {\n $schema: PROMOTION_PLAN_SCHEMA,\n planId,\n routeId,\n policyPath,\n policyHash,\n source: sourceBinding,\n eval: resolvedEval,\n target: targetBinding,\n deployment,\n blocking: uniqueBlocking,\n requiresPlanId: true,\n requiresExplicitYes: true,\n remoteRead: false,\n remoteWrite: false,\n localWrite: false,\n triggerWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function applyPromotion(\n start: string,\n policyRef: string,\n routeId: string,\n options: MulticaDeploymentOptions = {},\n): PromotionReceipt {\n if (!options.yes || !options.planId) {\n throw new Error('promote 会调用 Multica deploy;必须显式传当前 --plan-id 和 --yes')\n }\n const info = inspectAgentProject(start, options.cliVersion || '')\n const plan = planPromotion(info.root, policyRef, routeId, {\n env: options.env, cliVersion: options.cliVersion,\n })\n if (plan.planId !== options.planId) {\n throw new Error(`promotion plan 已失效;期望当前 planId ${plan.planId}`)\n }\n if (plan.blocking.length) throw new Error(`promotion 前置条件不完整: ${plan.blocking.join(', ')}`)\n const deployment = applyMulticaDeployment(info.root, plan.target.workspace, {\n ...options,\n planId: plan.deployment.planId,\n yes: true,\n })\n const deploymentReceiptPath = safeProjectPath(info.root, deployment.evidencePath, true)\n const deploymentReceiptHash = sha256(readFileSync(deploymentReceiptPath))\n const promoted = deployment.status === 'ready' && deployment.passed && deployment.providerReady &&\n deployment.deploymentHash === plan.target.deploymentHash && Boolean(deployment.observedHash)\n const status: PromotionReceipt['status'] = promoted ? 'promoted'\n : ['verifying', 'reconciling'].includes(deployment.status) ? 'verifying' : 'failed'\n const target = {\n ...plan.target,\n deploymentReceiptId: deployment.receiptId,\n deploymentOperationId: deployment.operationId,\n deploymentReceiptPath: deployment.evidencePath,\n deploymentReceiptHash,\n observedHash: deployment.observedHash,\n }\n const linkHash = promotionLinkHash(plan.source, plan.eval, target)\n const promotionId = `promotion_${digest(stableStringify({\n routeId, planId: plan.planId, deploymentReceiptId: deployment.receiptId, linkHash,\n })).slice(0, 24)}`\n const receiptId = `promotion_receipt_${digest(stableStringify({ promotionId, status, linkHash })).slice(0, 24)}`\n const receipt: PromotionReceipt = {\n $schema: PROMOTION_RECEIPT_SCHEMA,\n promotionId,\n receiptId,\n planId: plan.planId,\n routeId,\n policyHash: plan.policyHash,\n status,\n passed: promoted,\n idempotent: deployment.idempotent,\n source: plan.source,\n eval: plan.eval,\n target,\n linkHash,\n failures: promoted ? [] : [...deployment.failures],\n evidencePath: promotionReceiptPath(receiptId),\n remoteRead: deployment.remoteRead,\n remoteWrite: deployment.remoteWrite,\n localWrite: true,\n triggerWrite: false,\n sideEffect: deployment.sideEffect,\n dingtalkSideEffect: false,\n }\n persistPromotion(info.root, receipt)\n return receipt\n}\n\nexport function statusPromotion(start: string, promotionId = ''): PromotionStatus {\n const info = inspectAgentProject(start)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) return {\n $schema: 'dingtalk-agent/promotion-status@1', available: false,\n promotionId: '', status: 'missing', passed: false, integrity: true, receipt: null,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n verifyPromotionDependencies(info.root, loaded.receipt, loaded.receiptHash)\n return {\n $schema: 'dingtalk-agent/promotion-status@1', available: true,\n promotionId: loaded.receipt.promotionId,\n status: loaded.receipt.status,\n passed: loaded.receipt.passed,\n integrity: true,\n receipt: loaded.receipt,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function listPromotions(start: string): Record<string, unknown> {\n const info = inspectAgentProject(start)\n const directory = safeProjectPath(info.root, join(PROMOTION_ROOT, 'bindings'), false)\n const promotions: Array<Record<string, unknown>> = []\n if (existsSync(directory)) {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .filter((item) => item.isFile() && item.name.endsWith('.json'))\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const promotionId = entry.name.slice(0, -5)\n const status = statusPromotion(info.root, promotionId)\n if (!status.receipt) continue\n promotions.push({\n promotionId, receiptId: status.receipt.receiptId, routeId: status.receipt.routeId,\n status: status.receipt.status, passed: status.receipt.passed,\n sourceHash: status.receipt.source.sourceHash,\n evalEvidenceHash: status.receipt.eval.evidenceHash,\n deploymentHash: status.receipt.target.deploymentHash,\n observedHash: status.receipt.target.observedHash,\n })\n }\n }\n return {\n $schema: 'dingtalk-agent/promotion-list@1', promotions,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function planObservation(\n start: string, promotionId: string, inputRef: string,\n): EvalCandidatePlan {\n const info = inspectAgentProject(start)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) throw new Error(`Promotion 不存在: ${promotionId}`)\n verifyPromotionDependencies(info.root, loaded.receipt, loaded.receiptHash)\n if (!loaded.receipt.passed || loaded.receipt.status !== 'promoted') {\n throw new Error('只有已 promoted 且完整性通过的 Receipt 可以生成 Eval candidate')\n }\n const observation = loadObservation(info.root, inputRef)\n if (observation.observedHash !== loaded.receipt.target.observedHash) {\n throw new Error('Observation observedHash 与 Promotion 远端 observedHash 不一致')\n }\n const observationHash = digest(stableStringify(observation))\n const candidateId = `eval_candidate_${digest(stableStringify({\n promotionId, receiptHash: loaded.receiptHash, observationHash,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/eval-candidate-plan@1',\n candidateId,\n promotionId,\n observedHash: observation.observedHash,\n observationHash,\n candidatePath: candidatePath(candidateId),\n writeBudget: { local: 1 },\n reviewRequired: true,\n eligibleForSuite: false,\n remoteRead: false, remoteWrite: false, localWrite: false, triggerWrite: false,\n sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nexport function applyObservation(\n start: string,\n promotionId: string,\n inputRef: string,\n options: { yes?: boolean } = {},\n): EvalCandidateResult {\n if (!options.yes) throw new Error('observe 会写入本地 Eval candidate;必须显式传 --yes')\n const info = inspectAgentProject(start)\n const plan = planObservation(info.root, promotionId, inputRef)\n const loaded = loadPromotion(info.root, promotionId)\n if (!loaded) throw new Error(`Promotion 不存在: ${promotionId}`)\n const observation = loadObservation(info.root, inputRef)\n const candidateBase = {\n $schema: EVAL_CANDIDATE_SCHEMA as EvalCandidate['$schema'],\n candidateId: plan.candidateId,\n status: 'proposed' as const,\n eligibleForSuite: false as const,\n reviewRequired: true as const,\n published: false as const,\n promotion: {\n promotionId,\n receiptId: loaded.receipt.receiptId,\n receiptHash: loaded.receiptHash,\n linkHash: loaded.receipt.linkHash,\n },\n source: loaded.receipt.source,\n eval: {\n runId: loaded.receipt.eval.runId,\n evidenceHash: loaded.receipt.eval.evidenceHash,\n suiteId: loaded.receipt.eval.suiteId,\n },\n target: {\n workspace: loaded.receipt.target.workspace,\n deploymentReceiptId: loaded.receipt.target.deploymentReceiptId,\n deploymentHash: loaded.receipt.target.deploymentHash,\n observedHash: loaded.receipt.target.observedHash,\n },\n observation,\n observationHash: plan.observationHash,\n evidencePath: plan.candidatePath,\n remoteRead: false as const,\n remoteWrite: false as const,\n localWrite: true as const,\n triggerWrite: false as const,\n sideEffect: 'local-eval-candidate' as const,\n dingtalkSideEffect: false as const,\n }\n const candidateHash = digest(stableStringify(candidateBase))\n const candidate: EvalCandidate = { ...candidateBase, candidateHash }\n const path = safeProjectPath(info.root, plan.candidatePath, false)\n if (existsSync(path)) {\n const previous = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(previous) !== stableStringify(candidate)) {\n throw new Error('Eval candidate ID 已存在但内容不一致')\n }\n return {\n $schema: 'dingtalk-agent/eval-candidate-result@1', applied: false, idempotent: true,\n candidate, remoteRead: false, remoteWrite: false, localWrite: false,\n triggerWrite: false, sideEffect: false, dingtalkSideEffect: false,\n }\n }\n atomicJson(path, candidate)\n const readback = JSON.parse(readFileSync(path, 'utf8'))\n if (stableStringify(readback) !== stableStringify(candidate)) {\n throw new Error('Eval candidate 写后回读不一致')\n }\n return {\n $schema: 'dingtalk-agent/eval-candidate-result@1', applied: true, idempotent: false,\n candidate, remoteRead: false, remoteWrite: false, localWrite: true,\n triggerWrite: false, sideEffect: 'local-eval-candidate', dingtalkSideEffect: false,\n }\n}\n\nfunction loadEvalGate(\n root: string, source: DevelopmentWorkspaceView, route: PromotionRoute,\n): EvalGateEvidence {\n if (!source.state || source.state.status !== 'ready') throw new Error('source-not-ready')\n const binding = source.state.binding\n for (const key of [\n 'managedPath', 'sourceHash', 'evalRunId', 'evalEvidencePath', 'evalPlanHash',\n 'evalSuiteHash', 'evalReportHash', 'evalSuiteId', 'evalModel', 'evalSourceHash',\n 'evalDesiredHash', 'evalObservedHash',\n ]) if (!binding[key]) throw new Error(`binding-${key}-missing`)\n if (binding.sourceHash !== source.sourceHash || binding.evalSourceHash !== source.sourceHash ||\n binding.evalDesiredHash !== source.desiredHash || source.state.desiredHash !== source.desiredHash) {\n throw new Error('source-hash-drift')\n }\n const managed = safeProjectPath(root, binding.managedPath, true)\n const actualObservedHash = hashTree(managed)\n if (actualObservedHash !== source.observedHash || actualObservedHash !== binding.evalObservedHash ||\n source.state.observedHash !== actualObservedHash) throw new Error('observed-hash-drift')\n const policySuitePath = safeProjectPath(root, route.suite, true)\n const policySuite = readJson(policySuitePath, 'Promotion policy suite')\n const policySuiteHash = digest(stableStringify(policySuite))\n if (policySuiteHash !== binding.evalSuiteHash) throw new Error('designated-suite-drift')\n const evidenceRoot = safeProjectPath(root, binding.evalEvidencePath, true)\n if (!lstatSync(evidenceRoot).isDirectory() || lstatSync(evidenceRoot).isSymbolicLink()) {\n throw new Error('evidence-root-invalid')\n }\n const planPath = safeProjectPath(root, join(binding.evalEvidencePath, 'plan.json'), true)\n const suitePath = safeProjectPath(root, join(binding.evalEvidencePath, 'suite.json'), true)\n const reportPath = safeProjectPath(root, join(binding.evalEvidencePath, 'report.json'), true)\n if (sha256(readFileSync(planPath)) !== binding.evalPlanHash ||\n sha256(readFileSync(reportPath)) !== binding.evalReportHash) throw new Error('evidence-byte-drift')\n const plan = readJson(planPath, 'OpenCode Eval plan')\n const suite = readJson(suitePath, 'OpenCode Eval suite')\n const report = readJson(reportPath, 'OpenCode Eval report')\n if (digest(stableStringify(suite)) !== binding.evalSuiteHash ||\n stableStringify(suite) !== stableStringify(policySuite)) throw new Error('suite-evidence-drift')\n if (plan.$schema !== 'dingtalk-agent/opencode-eval-plan@1' ||\n report.$schema !== 'dingtalk-agent/opencode-eval-report@1' ||\n report.runId !== binding.evalRunId || report.evidencePath !== binding.evalEvidencePath ||\n plan.suite !== suite.id || suite.id !== binding.evalSuiteId ||\n report.engine?.model !== source.provider.model || report.engine?.model !== binding.evalModel) {\n throw new Error('evidence-binding-mismatch')\n }\n const runs = Number(plan.runsPerConfiguration)\n const configurations = stringList(plan.configurations, 'Eval plan configurations')\n const planCases = Array.isArray(plan.cases) ? plan.cases : []\n const planCaseIds = planCases.map((item) => String(item?.id || ''))\n if (!Number.isInteger(runs) || runs < route.minimumRuns || runs > 10 ||\n configurations.length !== 2 || new Set(configurations).size !== configurations.length) {\n throw new Error('runs-or-configurations')\n }\n if (!route.requiredCases.every((id) => planCaseIds.includes(id))) throw new Error('required-case-missing')\n if (report.passed !== true || report.summary?.loadGate !== true ||\n report.summary?.hardGate !== true || report.summary?.falseCompletionGate !== true ||\n report.summary?.behaviorScoresValid !== true ||\n (route.requireBehaviorGate && report.summary?.behaviorGate !== true)) {\n throw new Error('hard-gate-failed')\n }\n for (const configuration of configurations) {\n const gate = report.summary?.configurationLoadGates?.[configuration]\n if (!gate?.passed || gate.passedRuns !== runs || gate.totalRuns !== runs) {\n throw new Error('configuration-load-gate-failed')\n }\n }\n const results = Array.isArray(report.results) ? report.results : []\n const expectedResults = planCaseIds.length * configurations.length * runs\n if (results.length !== expectedResults || results.some((item) =>\n !item.hardGatePassed || !item.safetyPassed || item.falseCompletion)) {\n throw new Error('result-hard-gate-failed')\n }\n for (const caseId of route.requiredCases) {\n for (const configuration of configurations) {\n const selected = results.filter((item) => item.id === caseId && item.configuration === configuration)\n if (selected.length !== runs) throw new Error('required-case-result-count')\n for (const surface of route.requiredSurfaces) {\n if (!selected.every((item) => item.surfaceResults?.[surface]?.declared === true &&\n item.surfaceResults?.[surface]?.passed === true)) throw new Error(`surface-${surface}-failed`)\n }\n }\n }\n const evidenceHash = digest(stableStringify({\n runId: binding.evalRunId,\n evidencePath: binding.evalEvidencePath,\n planHash: binding.evalPlanHash,\n suiteHash: binding.evalSuiteHash,\n reportHash: binding.evalReportHash,\n sourceHash: binding.evalSourceHash,\n desiredHash: binding.evalDesiredHash,\n observedHash: binding.evalObservedHash,\n }))\n return {\n runId: binding.evalRunId,\n evidencePath: binding.evalEvidencePath,\n evidenceHash,\n planHash: binding.evalPlanHash,\n suiteHash: binding.evalSuiteHash,\n reportHash: binding.evalReportHash,\n suiteId: binding.evalSuiteId,\n model: binding.evalModel,\n runs,\n configurations,\n caseIds: [...route.requiredCases],\n requiredSurfaces: [...route.requiredSurfaces],\n loadGate: true,\n hardGate: true,\n falseCompletionGate: true,\n behaviorGate: report.summary.behaviorGate === true,\n }\n}\n\nfunction loadPolicy(\n root: string, ref: string,\n): { policy: PromotionPolicy; policyPath: string; policyHash: string } {\n const path = safeProjectPath(root, ref, true)\n if (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile()) {\n throw new Error('Promotion policy 必须是 Project 内真实文件')\n }\n const input = readJson(path, 'Promotion policy')\n exactKeys(input, ['$schema', 'routes'], 'Promotion policy')\n if (input.$schema !== PROMOTION_POLICY_SCHEMA || !Array.isArray(input.routes) ||\n input.routes.length < 1 || input.routes.length > 32) throw new Error('Promotion policy schema/routes 非法')\n const ids = new Set<string>()\n const routes = input.routes.map((value, index) => {\n const item = objectValue(value, `Promotion route ${index}`)\n exactKeys(item, [\n 'id', 'fromWorkspace', 'toWorkspace', 'suite', 'minimumRuns',\n 'requiredCases', 'requiredSurfaces', 'requireBehaviorGate',\n ], `Promotion route ${index}`)\n const id = safeId(item.id, 'Promotion route id')\n if (ids.has(id)) throw new Error(`Promotion route 重复: ${id}`)\n ids.add(id)\n const requiredCases = uniqueSafeIds(item.requiredCases, 'Promotion requiredCases', 30)\n const requiredSurfaces = stringList(item.requiredSurfaces, 'Promotion requiredSurfaces')\n if (!requiredSurfaces.length || requiredSurfaces.some((surface) => !SURFACES.has(surface)) ||\n new Set(requiredSurfaces).size !== requiredSurfaces.length) throw new Error('Promotion requiredSurfaces 非法')\n if (!Number.isInteger(item.minimumRuns) || item.minimumRuns < 1 || item.minimumRuns > 10 ||\n typeof item.requireBehaviorGate !== 'boolean') throw new Error('Promotion route gate 配置非法')\n const suite = stringField(item.suite, 'Promotion suite')\n safeProjectPath(root, suite, true)\n return {\n id,\n fromWorkspace: safeId(item.fromWorkspace, 'Promotion fromWorkspace'),\n toWorkspace: safeId(item.toWorkspace, 'Promotion toWorkspace'),\n suite,\n minimumRuns: item.minimumRuns,\n requiredCases,\n requiredSurfaces: requiredSurfaces as PromotionRoute['requiredSurfaces'],\n requireBehaviorGate: item.requireBehaviorGate,\n }\n })\n const policy: PromotionPolicy = { $schema: PROMOTION_POLICY_SCHEMA, routes }\n return {\n policy,\n policyPath: relative(realpathSync(root), path),\n policyHash: digest(stableStringify(policy)),\n }\n}\n\nfunction loadObservation(root: string, ref: string): ObservationInput {\n const path = safeProjectPath(root, ref, true)\n if (lstatSync(path).isSymbolicLink() || !lstatSync(path).isFile()) {\n throw new Error('Observation input 必须是 Project 内真实文件')\n }\n const input = readJson(path, 'Observation input')\n exactKeys(input, [\n '$schema', 'observedAt', 'observedHash', 'category', 'risk', 'capability',\n 'outcome', 'summary', 'expected', 'actual', 'sourceRefs', 'redacted',\n ], 'Observation input')\n if (input.$schema !== OBSERVATION_SCHEMA || input.redacted !== true ||\n !['behavior', 'safety', 'reliability', 'quality'].includes(String(input.category)) ||\n !['low', 'medium', 'high', 'critical'].includes(String(input.risk)) ||\n !['pass', 'fail', 'mixed', 'unknown'].includes(String(input.outcome))) {\n throw new Error('Observation schema/category/risk/outcome/redacted 非法')\n }\n const observedAt = stringField(input.observedAt, 'Observation observedAt')\n if (Number.isNaN(Date.parse(observedAt)) || new Date(observedAt).toISOString() !== observedAt) {\n throw new Error('Observation observedAt 必须是规范 ISO 时间')\n }\n const observedHash = hashField(input.observedHash, 'Observation observedHash')\n const capability = boundedString(input.capability, 'Observation capability', 100)\n const summary = boundedString(input.summary, 'Observation summary', 500)\n const expected = boundedString(input.expected, 'Observation expected', 1000)\n const actual = boundedString(input.actual, 'Observation actual', 1000)\n const sourceRefs = stringList(input.sourceRefs, 'Observation sourceRefs')\n if (sourceRefs.length > 10 || sourceRefs.some((item) => item.length > 200)) {\n throw new Error('Observation sourceRefs 超出预算')\n }\n assertRedactedObservation([capability, summary, expected, actual, ...sourceRefs])\n return {\n $schema: OBSERVATION_SCHEMA,\n observedAt,\n observedHash,\n category: input.category as ObservationInput['category'],\n risk: input.risk as ObservationInput['risk'],\n capability,\n outcome: input.outcome as ObservationInput['outcome'],\n summary,\n expected,\n actual,\n sourceRefs,\n redacted: true,\n }\n}\n\nfunction persistPromotion(root: string, receipt: PromotionReceipt): void {\n const receiptPath = safeProjectPath(root, receipt.evidencePath, false)\n atomicJson(receiptPath, receipt)\n const receiptHash = sha256(readFileSync(receiptPath))\n const pointer = {\n $schema: 'dingtalk-agent/promotion-pointer@1',\n promotionId: receipt.promotionId,\n receiptId: receipt.receiptId,\n receiptPath: receipt.evidencePath,\n receiptHash,\n }\n atomicJson(safeProjectPath(root, promotionBindingPath(receipt.promotionId), false), pointer)\n atomicJson(safeProjectPath(root, join(PROMOTION_ROOT, 'latest.json'), false), pointer)\n}\n\nfunction loadPromotion(\n root: string, promotionId = '',\n): { receipt: PromotionReceipt; receiptHash: string } | null {\n const pointerPath = safeProjectPath(root, promotionId\n ? promotionBindingPath(safeResourceId(promotionId, 'promotionId'))\n : join(PROMOTION_ROOT, 'latest.json'), false)\n if (!existsSync(pointerPath)) return null\n const pointer = readJson(pointerPath, 'Promotion pointer')\n exactKeys(pointer, ['$schema', 'promotionId', 'receiptId', 'receiptPath', 'receiptHash'], 'Promotion pointer')\n if (pointer.$schema !== 'dingtalk-agent/promotion-pointer@1') throw new Error('Promotion pointer schema 非法')\n const expectedPromotionId = safeResourceId(pointer.promotionId, 'pointer promotionId')\n if (promotionId && expectedPromotionId !== promotionId) throw new Error('Promotion pointer ID 不一致')\n const receiptPath = safeProjectPath(root, stringField(pointer.receiptPath, 'pointer receiptPath'), true)\n const receiptHash = sha256(readFileSync(receiptPath))\n if (receiptHash !== hashField(pointer.receiptHash, 'pointer receiptHash')) {\n throw new Error('Promotion Receipt hash 不一致')\n }\n const receipt = readJson(receiptPath, 'Promotion Receipt') as unknown as PromotionReceipt\n if (receipt.$schema !== PROMOTION_RECEIPT_SCHEMA || receipt.promotionId !== expectedPromotionId ||\n receipt.receiptId !== pointer.receiptId || receipt.evidencePath !== pointer.receiptPath) {\n throw new Error('Promotion Receipt 绑定不一致')\n }\n return { receipt, receiptHash }\n}\n\nfunction verifyPromotionDependencies(root: string, receipt: PromotionReceipt, receiptHash: string): void {\n if (receipt.linkHash !== promotionLinkHash(receipt.source, receipt.eval, receipt.target)) {\n throw new Error('Promotion source/eval/target link hash 不一致')\n }\n const evalPlan = safeProjectPath(root, join(receipt.eval.evidencePath, 'plan.json'), true)\n const evalSuite = safeProjectPath(root, join(receipt.eval.evidencePath, 'suite.json'), true)\n const evalReport = safeProjectPath(root, join(receipt.eval.evidencePath, 'report.json'), true)\n if (sha256(readFileSync(evalPlan)) !== receipt.eval.planHash ||\n digest(stableStringify(readJson(evalSuite, 'Promotion Eval suite'))) !== receipt.eval.suiteHash ||\n sha256(readFileSync(evalReport)) !== receipt.eval.reportHash) {\n throw new Error('Promotion Eval plan/suite/report 发生漂移')\n }\n const deploymentStatus = statusMulticaDeployment(root, receipt.target.workspace, {\n operationId: receipt.target.deploymentOperationId,\n })\n if (!deploymentStatus.receipt || deploymentStatus.receipt.receiptId !== receipt.target.deploymentReceiptId ||\n deploymentStatus.receipt.evidencePath !== receipt.target.deploymentReceiptPath ||\n sha256(readFileSync(safeProjectPath(root, receipt.target.deploymentReceiptPath, true))) !==\n receipt.target.deploymentReceiptHash ||\n deploymentStatus.receipt.deploymentHash !== receipt.target.deploymentHash ||\n deploymentStatus.receipt.observedHash !== receipt.target.observedHash) {\n throw new Error('Promotion 绑定的 Multica deployment Receipt 不一致')\n }\n if (!HASH.test(receiptHash)) throw new Error('Promotion Receipt hash 非法')\n}\n\nfunction promotionLinkHash(\n source: PromotionPlan['source'], evalEvidence: EvalGateEvidence,\n target: PromotionReceipt['target'] | (PromotionPlan['target'] & Record<string, unknown>),\n): string {\n return digest(stableStringify({\n source: {\n workspace: source.workspace, stage: source.stage, sourceHash: source.sourceHash,\n desiredHash: source.desiredHash, observedHash: source.observedHash,\n definitionHash: source.definitionHash, skills: source.skills,\n },\n eval: {\n runId: evalEvidence.runId, evidenceHash: evalEvidence.evidenceHash,\n suiteId: evalEvidence.suiteId, suiteHash: evalEvidence.suiteHash,\n reportHash: evalEvidence.reportHash,\n },\n target: {\n workspace: target.workspace, stage: target.stage,\n deploymentHash: target.deploymentHash,\n deploymentReceiptId: 'deploymentReceiptId' in target ? target.deploymentReceiptId : '',\n deploymentReceiptHash: 'deploymentReceiptHash' in target ? target.deploymentReceiptHash : '',\n observedHash: 'observedHash' in target ? target.observedHash : '',\n },\n }))\n}\n\nfunction emptyDeploymentPlan(target: DevelopmentWorkspaceView): MulticaDeploymentPlan {\n return {\n $schema: 'dingtalk-agent/multica-deployment-plan@1',\n planId: 'multica_deploy_plan_unavailable', action: 'apply', workspace: target.name,\n provider: 'multica', profile: '', inspectionId: '', desiredHash: target.desiredHash,\n deploymentHash: emptyHash(), predicateRegistry: null, expected: {\n workspaceId: '', runtimeId: '', agentId: '', agentName: '', skills: [],\n definitionHash: emptyHash(), instructionsHash: emptyHash(),\n }, rebindRuntime: false,\n operations: [], writeBudget: { forward: 0, rollback: 0 }, blocking: ['unavailable'],\n requiresPlanId: true, requiresExplicitYes: true, remoteRead: false, remoteWrite: false,\n triggerWrite: false, sideEffect: false, dingtalkSideEffect: false,\n }\n}\n\nfunction emptyEvalEvidence(route: PromotionRoute): EvalGateEvidence {\n return {\n runId: '', evidencePath: '', evidenceHash: emptyHash(), planHash: emptyHash(),\n suiteHash: emptyHash(), reportHash: emptyHash(), suiteId: '', model: '', runs: 0,\n configurations: [], caseIds: [...route.requiredCases],\n requiredSurfaces: [...route.requiredSurfaces], loadGate: false, hardGate: false,\n falseCompletionGate: false, behaviorGate: false,\n }\n}\n\nfunction hashTree(root: string): string {\n if (!lstatSync(root).isDirectory() || lstatSync(root).isSymbolicLink()) {\n throw new Error('Managed Workspace 必须是普通目录')\n }\n const base = realpathSync(root)\n const entries: Array<{ path: string; hash: string }> = []\n const visit = (directory: string, prefix = ''): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))) {\n const path = join(directory, entry.name)\n const ref = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isSymbolicLink()) throw new Error(`Managed Workspace 不允许符号链接: ${ref}`)\n if (entry.isDirectory()) visit(path, ref)\n else if (entry.isFile()) entries.push({ path: ref, hash: sha256(readFileSync(path)) })\n else throw new Error(`Managed Workspace 包含特殊文件: ${ref}`)\n }\n }\n visit(base)\n return digest(stableStringify(entries))\n}\n\nfunction assertRedactedObservation(values: string[]): void {\n const text = values.join('\\n')\n const forbidden = [\n /(?:client[_-]?secret|access[_-]?token|refresh[_-]?token|password|credentials?|authorization|bearer)/iu,\n /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/iu,\n /(?:https?:\\/\\/|dingtalk:\\/\\/)/iu,\n /(?:^|\\D)(?:\\+?86[- ]?)?1[3-9]\\d{9}(?:\\D|$)/u,\n /\\b[A-Za-z0-9_-]{40,}\\b/u,\n ]\n if (forbidden.some((pattern) => pattern.test(text))) {\n throw new Error('Observation 包含凭据、PII、URL 或未脱敏长标识')\n }\n}\n\nfunction promotionReceiptPath(receiptId: string): string {\n return join(PROMOTION_ROOT, 'receipts', `${safeResourceId(receiptId, 'receiptId')}.json`)\n}\n\nfunction promotionBindingPath(promotionId: string): string {\n return join(PROMOTION_ROOT, 'bindings', `${safeResourceId(promotionId, 'promotionId')}.json`)\n}\n\nfunction candidatePath(candidateId: string): string {\n return join(CANDIDATE_ROOT, `${safeResourceId(candidateId, 'candidateId')}.json`)\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Promotion 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Promotion 路径不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) throw new Error(`Promotion 路径不能是符号链接: ${ref}`)\n if (realpathSync(candidate) !== candidate && !isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Promotion 真实路径越界: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Promotion 父目录越界: ${ref}`)\n }\n return candidate\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}-${randomUUID().slice(0, 8)}`\n writeFileSync(temp, `${JSON.stringify(value, null, 2)}\\n`, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction readJson(path: string, label: string): Record<string, any> {\n try {\n const value = JSON.parse(readFileSync(path, 'utf8'))\n return objectValue(value, label)\n } catch (error) {\n throw new Error(`${label} 不是合法 JSON object: ${(error as Error).message}`)\n }\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: string[], label: string): void {\n const expected = [...keys].sort()\n const actual = Object.keys(value).sort()\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`${label} 字段不精确: ${actual.join(',')}`)\n }\n}\n\nfunction objectValue(value: unknown, label: string): Record<string, any> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${label} 必须是 object`)\n return value as Record<string, any>\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} 必须是非空字符串`)\n return value.trim()\n}\n\nfunction boundedString(value: unknown, label: string, max: number): string {\n const item = stringField(value, label)\n if (item.length > max) throw new Error(`${label} 超过 ${max} 字符预算`)\n return item\n}\n\nfunction stringList(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || !item.trim())) {\n throw new Error(`${label} 必须是非空字符串数组`)\n }\n return value.map((item) => item.trim())\n}\n\nfunction uniqueSafeIds(value: unknown, label: string, max: number): string[] {\n const items = stringList(value, label).map((item) => safeId(item, label))\n if (!items.length || items.length > max || new Set(items).size !== items.length) {\n throw new Error(`${label} 数量或唯一性非法`)\n }\n return items\n}\n\nfunction safeId(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!SAFE_ID.test(item)) throw new Error(`${label} 不是安全 ID: ${item}`)\n return item\n}\n\nfunction safeResourceId(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(item)) throw new Error(`${label} 不是安全资源 ID`)\n return item\n}\n\nfunction hashField(value: unknown, label: string): string {\n const item = stringField(value, label)\n if (!HASH.test(item)) throw new Error(`${label} 不是 SHA-256`)\n return item\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction emptyHash(): string {\n return '0'.repeat(64)\n}\n\nfunction errorCategory(error: unknown): string {\n return String((error as Error)?.message || error).replace(/[^a-zA-Z0-9._-]+/g, '-').slice(0, 120)\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}
@@ -10,6 +10,7 @@
10
10
  * Pure: no network, no side effects — safe to run in CI and fully testable.
11
11
  */
12
12
  import { PREDICATE_ID, inspectAgentProject, multicaAgentIdSource, } from './development-workspace.js';
13
+ import { PREDICATE_REGISTRY_PATH, predicateRegistryOwner } from './predicate-registry.js';
13
14
  /**
14
15
  * completion 的 predicate 引用形态(issue #24):`predicate:<id>` 指向 manifest
15
16
  * `predicates` 注册表里唯一的判据。声明侧与运行路径(autopilot description 里的
@@ -267,11 +268,28 @@ function envVar(ref) {
267
268
  // "env:MULTICA_FDE_AGENT_ID" -> "$MULTICA_FDE_AGENT_ID"
268
269
  return ref.startsWith('env:') ? `$${ref.slice(4)}` : ref;
269
270
  }
270
- function multicaApplyCommand(schedule, profile, agentRef, completionPredicate = '') {
271
+ /**
272
+ * 运行拍读注册表投影的指令(issue #46)。
273
+ *
274
+ * 光有 id marker 不构成「运行时读同一份注册表」:那一拍看到的只是一串 id,判据正文不在
275
+ * 它手里。deploy 已把规范化投影作为受管 supporting file 随技能交付,所以唤醒提示词要
276
+ * 明确指出**读哪个文件、解析不出来怎么办**——解析不到判据就没有判据,那一拍不得使用
277
+ * 完成措辞(Basic Behavior 的完成闸门执行这条)。marker 行是机器可读的,好让回读对账
278
+ * 「运行侧到底有没有被告知去哪读」。
279
+ */
280
+ export function predicateRegistryInstruction(registryRef) {
281
+ return `[dta-predicate-registry] ${registryRef}\n` +
282
+ '完成判定前先读上面这份随技能交付的注册表投影,按标记的 id 取出判据正文再逐条核对;' +
283
+ '文件缺失、hash 与内容不一致、或该 id 不在投影里,一律不得使用完成措辞——' +
284
+ '判据解析不到就是没有判据,请改报阻塞并说明缺口。';
285
+ }
286
+ function multicaApplyCommand(schedule, profile, agentRef, completionPredicate = '', registryRef = '') {
271
287
  // 声明与运行路径引用同一 predicate ID:description(唤醒提示词)尾部携带机器可读
272
288
  // 标记,Agent/运维在 autopilot 侧看到的判据 ID 与 manifest 注册表一字不差。
273
289
  const description = (schedule.wake || schedule.name) + (completionPredicate
274
- ? `\n[dta-completion-predicate] ${completionPredicate}` : '');
290
+ ? `\n[dta-completion-predicate] ${completionPredicate}` +
291
+ (registryRef ? `\n${predicateRegistryInstruction(registryRef)}` : '')
292
+ : '');
275
293
  const parts = [
276
294
  'python3 "$MULTICA_EXT" autopilot-create',
277
295
  `--profile ${profile}`,
@@ -314,14 +332,20 @@ export function buildSchedulePlan(info, workspaceName) {
314
332
  }
315
333
  const agentRef = source.kind === 'declared' ? envVar(source.ref) : source.agentId;
316
334
  const agentIdSource = source.kind === 'declared' ? 'declared-env' : 'deploy-state';
335
+ // 投影的交付位置:deploy 把注册表注入这个 Skill 的 supporting file(同一条归属规则),
336
+ // 唤醒提示词据此告诉运行拍去哪读。注册表没声明 = 没有投影可读,不写这一行。
337
+ const registryOwner = info.project.predicates === undefined
338
+ ? '' : predicateRegistryOwner(info.project.skills);
339
+ const registryRef = registryOwner ? `${registryOwner}/${PREDICATE_REGISTRY_PATH}` : '';
317
340
  const schedules = declared.map((schedule) => {
318
341
  const predicateId = completionPredicateId(schedule.completion);
319
342
  const registered = predicateId && info.project.predicates?.[predicateId] ? predicateId : '';
320
343
  return {
321
344
  ...schedule,
322
- applyCommand: multicaApplyCommand(schedule, profile, agentRef, registered),
345
+ applyCommand: multicaApplyCommand(schedule, profile, agentRef, registered, registryRef),
323
346
  metered: isMetered(schedule.mode),
324
347
  ...(registered ? { completionPredicate: registered } : {}),
348
+ ...(registered && registryRef ? { predicateRegistryRef: registryRef } : {}),
325
349
  };
326
350
  });
327
351
  return {