跳到正文
cccskills
免费在 GitHub 公开中文介绍

workflow-authoring

设计由多个智能体分工完成的调查、审查和迁移流程,安排不同信息来源的核查与独立验证,并在整合结果时保留证据引用、未解决问题和检查范围。

原文查看原文说明

Use when authoring a non-trivial Workflow for research, review, migration, or other multi-agent work, especially when the task needs multiple evidence sources, verification, or synthesis.

实测评分 未实测

查看安装方法

适用场景

  • 设计使用多种信息来源的调查
  • 分别审查实现与测试
  • 由独立评估者比较候选方案
  • 整合结果并保留未解决问题

中文介绍

功能

此技能帮助设计Workflow,让多个智能体分工完成调查、审查、迁移等工作。它安排不同角色检查实现、测试、设计记录等不同信息来源,组织从核查证据到整合结果的完整流程。也涵盖寻找反证来验证主张,以及依据明确标准评估多个候选方案的步骤。

适用场景

适合仅凭单一来源难以作出判断的调查,或需要从多个角度审查变更的情况。流程不会仅因完成一定次数的调查就结束,而会持续记录证据是否充分、哪些问题尚未解决,因此也适合制作明确说明检查范围的报告。

使用示例

  • “设计一个Workflow,分别检查实现和测试,再由其他成员独立验证重要主张。”
  • “制定流程,从不同角度评估候选方案,整合时保留证据和未解决问题。”

注意事项

必须根据环境公开的Workflow API和ToolSpec选择一个受支持的配置,不得混用V1、V2等调用方式。仅凭引用信息可能无法取得完整结果,因此流程设计需要明确披露未经核实的内容及省略的检查范围。

本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。

文档检查

AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。

安全性发送数据、删除文件、执行命令等是否有说明
B部分不足建议子智能体将成果写入文件,但未说明覆盖文件前的确认要求。
安装难易度所需工具和 API 密钥是否少且有说明
B部分不足要求选择匹配Workflow API和ToolSpec的配置,但未提供运行环境的安装步骤。

不计入评分。 由 AI(OpenAI Codex)于 2026年10月24日 评估。仅供参考,安装前请同时查看原文。

如果您认为评估有误,请申请复核

请写明哪一项有误以及原因。无需登录。我们会对照 SKILL.md 重新评估,并在此处更新结果。

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

包含的文件(1)

  • SKILL.md29.5 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Workflow Authoring

Load this reference exactly once per parent session before the first non-trivial Workflow. After a successful load, reuse that result for later Workflow authoring. Do not call read_skill again after validation errors or for retries and resumes. Select exactly one profile section from the active Workflow guidance. Never mix symbols across profiles, and never use a call that the active ToolSpec does not advertise.

Shared research contract

A fixed batch count never proves completion. Scale the number and diversity of children to the request, then stop on evidence state or an explicit caller or runtime boundary.

For a review of a change the user has already identified, first take stock inline of which files it touches and how large it is, then size the workflow to that list: a small change gets a few focused children plus one verify vote, not the full research shape.

Discovery pointers are not inspected evidence when the relevant body is readable. Require each research child to open every implementation or test body it cites before submit_result when readable; search and grep output only locate candidates. Back every assigned claim with inspected evidence or name it as unresolved. Ask research children for complete:boolean, evidence:string[], and unresolved:string[]. Handle the V2 spill marker below before checking for missing data. For inline results, treat a profile-specific unsuccessful result envelope, missing or wrong-typed data, complete !== true, or nonempty unresolved as incomplete.

Never use data from an unsuccessful envelope as evidence or a gap disposition. Critic unavailability is a synthesis note, never a research gap. Preserve compact evidence, provenance refs, and every unresolved item in synthesis. Synthesize from compact result.data, not from uninspected summaries. Disclose omitted scope.

Use independent verification when a claim has materially different failure modes. Repeating the same prompt is not independent coverage.

Keep these reusable patterns when they fit the request:

  • Multi-angle sweep: split initial researchers across genuinely different evidence surfaces, such as implementation, tests, design records, and operational traces; different role names do not increase coverage when they use the same search plan.
  • Adversarial verification: give a skeptic a concrete falsification target for each material claim; retain only claims that survive inspected counterevidence, and mark an unavailable or invalid verdict unresolved.
  • Judge panel: for an open solution space, generate candidates from different angles, score them against explicit criteria with independent judges, and synthesize the winner with useful runner-up ideas by provenance ref. A failed or invalid judge is not an affirmative vote.

V2 spilled child results

Schema-valid submit_result custom data above 4096 canonical UTF-8 bytes (excluding notes) is accepted and stored in full. Exactly 4096 bytes stays inline. An oversize result arrives with dataSpilledForSize: true, submittedPayloadBytes, submittedPayloadChars, and ref, with no inline data. Size facts describe the full canonical submission, including non-null notes; they are not the custom-only spill measurement.

Scripts MUST carry dataSpilledForSize, both size facts, and ref through to their returned results. Preserve the envelope, or copy those fields explicitly as in the V2 examples below. Never collapse a result to data ?? null. You MUST NOT treat a spilled result as empty or failed, or repeat completed work merely because inline data is absent. Continue to respect the envelope's actual status and errors. Submission completion does not prove that uninspected evidence is complete; preserve existing unresolved gaps.

No script-side or parent-side API currently returns the full value. The full submission is retained under its ref in durable session storage and exposed through the MSP subagent view. Repeating a result observation or passing the ref to another child supplies no lossless fetch; ref context is bounded.

Ask children to keep custom data under 4096 canonical bytes. When file tools are available, write large artifacts (test modules, reports) to files and return paths plus a compact summary. Otherwise split the work or ask for a compact schema. Report a spilled submission as complete but large, include its ref and size facts, say where the full submission is retained, and disclose that its contents remain uninspected by this Workflow. Do not claim a file was written unless the child actually returned that artifact path.

Two convergence rules

Open-ended discovery and a known evidence gap are different jobs. Do not apply one loop rule to both.

Example: open discovery

Maintain seen and dryRounds in deterministic Workflow state. In each round, ask complementary finders for items not already in seen. Add every reported item to seen before judging it:

  • deduplicate against all seen items, including rejected findings;
  • If a round adds any fresh item, reset the dry count to zero;
  • if it adds none, increment the dry count; and
  • After two consecutive dry rounds, stop discovery.

A caller limit, capacity boundary, or runtime budget may stop it earlier; that stop is partial unless all requested scope is covered.

Example: explicit gap follow-up

Track the lineage of each concrete unresolved gap.

  • Dispatch exactly one focused follow-up for that gap lineage.
  • After that attempt, carry the narrowed, reworded, or still-unresolved descendant unchanged into synthesis.
  • Do not make its new wording look like a new gap and dispatch it again.

Example: verification and omitted scope

For a claim involving behavior, abuse resistance, and a reported failure:

  • use separate correctness, security, and reproduction lenses;
  • give each verifier a distinct falsification target;
  • State omitted scope for top-N, sampling, no-retry, capacity, caller limit, and runtime budget boundaries; and
  • never describe a bounded sample as exhaustive.

Workflow API V1

The API is available as bare globals - agent, parallel, pipeline, phase, log, args, budget - and through the legacy host object. Use the V1 globals or their host aliases described by the active ToolSpec. Read caller input from host.args, the only advertised caller-input spelling. For example, fan out independent research with host.parallel( and use host.agent for the critic, one gap follow-up, and final synthesis:

export default async function workflow(host) {
  const evidenceSchema = {
    type: "object",
    required: ["complete", "evidence", "unresolved"],
    properties: {
      complete: { type: "boolean" },
      evidence: { type: "array", items: { type: "string" } },
      unresolved: { type: "array", items: { type: "string" } },
    },
  };
  const compact = (result, scope, missing = `${scope}: missing complete evidence result`) => {
    const failed = result === null || result.error_kind;
    const data = !failed && result.data && typeof result.data === "object" ? result.data : null;
    const evidence = !failed && Array.isArray(data?.evidence) ? data.evidence.filter(Boolean) : [];
    const declared = !failed && Array.isArray(data?.unresolved) ? data.unresolved.filter(Boolean) : [];
    const complete = data?.complete === true && evidence.length > 0 && declared.length === 0;
    return {
      scope,
      ref: result?.ref ?? null,
      complete,
      evidence,
      unresolved: complete ? [] : (declared.length ? declared : [missing]),
    };
  };

  const reports = await host.parallel([
    { input: "Inspect the implementation body; return complete/evidence/unresolved.", schema: evidenceSchema },
    { input: "Inspect the tests; return complete/evidence/unresolved.", schema: evidenceSchema },
  ]);
  const compactReports = reports.map((result, index) => compact(result, `primary-${index}`));
  const synthesisNotes = [];
  const critic = await host.agent({
    input: `Find concrete gaps in this compact evidence: ${JSON.stringify(compactReports)}.`,
    schema: evidenceSchema,
  });
  const criticData = critic !== null && !critic.error_kind && critic.data && typeof critic.data === "object" ? critic.data : null;
  const criticEvidence = Array.isArray(criticData?.evidence) ? criticData.evidence.filter(Boolean) : [];
  const criticUnresolved = Array.isArray(criticData?.unresolved) ? criticData.unresolved.filter(Boolean) : [];
  const criticHasUsableDisposition = (criticData?.complete === true && criticEvidence.length > 0 && criticUnresolved.length === 0)
    || criticUnresolved.length > 0;
  const compactCritic = criticHasUsableDisposition
    ? compact(critic, "critic")
    : (synthesisNotes.push("completeness critic unavailable"), { scope: "critic", ref: critic?.ref ?? null, complete: true, evidence: [], unresolved: [] });
  const open = [...compactReports, compactCritic].flatMap((report) => report.unresolved);
  const firstGap = open[0];
  const followup = firstGap ? await host.agent({
    input: `Resolve this exact gap once, or return it unchanged: ${firstGap}`,
    schema: evidenceSchema,
  }) : null;
  const followupReport = firstGap ? compact(followup, firstGap, firstGap) : null;
  const all = followupReport ? [...compactReports, compactCritic, followupReport] : [...compactReports, compactCritic];
  const unresolved = firstGap ? [...open.slice(1), ...followupReport.unresolved] : open;
  const evidence = all.flatMap((report) => report.evidence.map((value) => ({ source: report.scope, ref: report.ref, value })));
  const refs = [...new Set(all.map((report) => report.ref).filter(Boolean))];
  const synthesis = await host.agent({
    input: `Synthesize only this compact evidence: ${JSON.stringify({ evidence, refs, unresolved, notes: synthesisNotes })}`,
    schema: evidenceSchema,
  });
  const synthesisFailed = synthesis === null || synthesis.error_kind;
  const synthesisData = !synthesisFailed && synthesis.data && typeof synthesis.data === "object" ? synthesis.data : null;
  const synthesisUnresolved = Array.isArray(synthesisData?.unresolved) ? synthesisData.unresolved.filter(Boolean) : [];
  const synthesisComplete = synthesisData?.complete === true
    && Array.isArray(synthesisData.evidence)
    && synthesisData.evidence.length > 0
    && synthesisUnresolved.length === 0;
  if (!synthesisComplete) synthesisNotes.push("synthesis unavailable or incomplete");
  return { status: unresolved.length || synthesisUnresolved.length || synthesisNotes.length > 0 ? "partial" : "complete", ref: synthesis?.ref ?? null, unresolved: [...unresolved, ...synthesisUnresolved], notes: synthesisNotes };
}

Wrap the shared discovery and gap-lineage state machine around these calls when the request needs it. Use compact structured results and refs; follow the V1 ToolSpec for schemas, budgets, isolation, failures, and return shape.

Diagnostic Workflow API V2

Keep each V2 input within 4096 UTF-8 bytes, including task text and refs. Deferred commands also obey their whole-command size limit. The refs below request bounded prior-result context; inspect needed bodies and return complete: false with unresolved gaps if required evidence is unavailable. Refs do not carry lossless result.data or parent-local gap state. Include known unresolved items and synthesis notes as essential compact context.

The diagnostic script surface is exactly Agent, Phase, Pipeline, ParallelGroup, WorkflowCommandError, log, args, and budget. This profile is fresh-run and terminal-only. Use deferred work inside the diagnostic containers for parallelism, then read immutable results:

const evidenceSchema = {
  type: "object",
  required: ["complete", "evidence", "unresolved"],
  properties: {
    complete: { type: "boolean" },
    evidence: { type: "array", items: { type: "string" } },
    unresolved: { type: "array", items: { type: "string" } },
  },
};
const synthesisNotes = [];
const spilledResults = [];
const recordSpill = (result, scope) => {
  if (result?.dataSpilledForSize !== true) return false;
  spilledResults.push({
    scope, ref: result.ref, status: result.status, ok: result.ok, error: result.error,
    dataSpilledForSize: result.dataSpilledForSize,
    submittedPayloadBytes: result.submittedPayloadBytes,
    submittedPayloadChars: result.submittedPayloadChars,
  });
  synthesisNotes.push(`${scope}: large submission retained at ${result.ref} in session storage / MSP subagent view; contents uninspected.`);
  return result.status === "completed" && result.ok === true && result.error == null;
};
const group = await ParallelGroup.start({
  members: [
    Agent.defer.start({ input: "Inspect the implementation body; return complete/evidence/unresolved.", schema: evidenceSchema }),
    Agent.defer.start({ input: "Inspect the tests; return complete/evidence/unresolved.", schema: evidenceSchema }),
  ],
});
const reports = await group.result();
const fromAttemptOutcome = (outcome, scope) => {
  if (outcome?.kind !== "attempt" || !outcome.result?.ref) {
    return { scope, ref: null, complete: false, evidence: [], unresolved: [`${scope}: no completed attempt result`] };
  }
  const result = outcome.result;
  const ref = outcome.result.ref;
  if (recordSpill(result, scope)) {
    return { scope, ref: result.ref, complete: false, evidence: [], unresolved: [] };
  }
  const data = result?.data && typeof result.data === "object" ? result.data : null;
  const terminalOk = result.status === "completed" && result.ok === true && result.error == null && data !== null;
  const evidence = terminalOk && Array.isArray(data.evidence) ? data.evidence.filter(Boolean) : [];
  const declared = terminalOk && Array.isArray(data.unresolved) ? data.unresolved.filter(Boolean) : [];
  const complete = terminalOk && data.complete === true && evidence.length > 0 && declared.length === 0;
  return {
    scope,
    ref,
    complete,
    evidence: terminalOk ? evidence : [],
    unresolved: complete ? [] : (declared.length ? declared : [`${scope}: no completed attempt result`]),
  };
};
const compactReports = reports.map((outcome, index) => fromAttemptOutcome(outcome, `parallel-${index}`));
const pipeline = await Pipeline.start({
  items: reports,
  stages: [{
    title: "Check",
    run: ({ item, index }) => {
      if (item?.kind !== "attempt" || !item.result?.ref) {
        return { complete: false, evidence: [], unresolved: [`parallel-${index}: missing result ref`] };
      }
      return Agent.defer.start({ input: `Verify the evidence behind ${item.result.ref}; return complete/evidence/unresolved.`, schema: evidenceSchema });
    },
  }],
});
const checked = await pipeline.result();
const checkedReports = checked.map((item, index) => {
  if (item?.kind !== "completed" || !item.output?.ref) {
    return { scope: `pipeline-${index}`, ref: null, complete: false, evidence: [], unresolved: [`pipeline-${index}: not completed`] };
  }
  if (recordSpill(item.output, `pipeline-${index}`)) {
    return { scope: `pipeline-${index}`, ref: item.output.ref, complete: false, evidence: [], unresolved: [] };
  }
  const data = item.output.data && typeof item.output.data === "object" ? item.output.data : null;
  const outputOk = item.output.status === "completed" && item.output.ok === true && item.output.error == null && data !== null;
  const evidence = outputOk && Array.isArray(data.evidence) ? data.evidence.filter(Boolean) : [];
  const declared = outputOk && Array.isArray(data.unresolved) ? data.unresolved.filter(Boolean) : [];
  const complete = outputOk && data.complete === true && evidence.length > 0 && declared.length === 0;
  return {
    scope: `pipeline-${index}`,
    ref: item.output.ref,
    complete,
    evidence: outputOk ? evidence : [],
    unresolved: complete ? [] : (declared.length ? declared : [`pipeline-${index}: missing structured output`]),
  };
});
const unresolved = [...compactReports, ...checkedReports].flatMap((report) => report.unresolved);
const refs = [...compactReports, ...checkedReports].map((report) => report.ref).filter(Boolean);
const evidence = [...compactReports, ...checkedReports].flatMap((report) => report.evidence.map((value) => ({ source: report.scope, ref: report.ref, value })));
const critic = await Agent.start({ input: `Inspect relevant bodies and find concrete gaps in reports ${refs.join(" ")}. Known unresolved items: ${JSON.stringify(unresolved)}. Return complete/evidence/unresolved; set complete:false and name unresolved gaps when evidence is unavailable.`, schema: evidenceSchema });
const gaps = await critic.latestAttempt.result();
const criticSpilled = recordSpill(gaps, "critic");
const criticData = gaps?.data && typeof gaps.data === "object" ? gaps.data : null;
const criticTerminalOk = gaps?.status === "completed"
  && gaps?.ok === true
  && gaps?.error == null
  && criticData !== null;
const criticGaps = criticTerminalOk && Array.isArray(criticData.unresolved) ? criticData.unresolved.filter(Boolean) : [];
if (criticTerminalOk && Array.isArray(criticData.evidence)) {
  evidence.push(...criticData.evidence.filter(Boolean).map((value) => ({ source: "critic", ref: gaps.ref, value })));
}
const criticComplete = criticTerminalOk
  && criticData?.complete === true
  && Array.isArray(criticData.evidence)
  && criticData.evidence.length > 0
  && Array.isArray(criticData.unresolved)
  && criticData.unresolved.length === 0;
if (!criticComplete && criticGaps.length === 0 && !criticSpilled) {
  synthesisNotes.push("completeness critic unavailable");
}
const open = [...unresolved, ...criticGaps];
const firstGap = open[0];
let gapResult = null;
let gapDescendants = [];
if (firstGap) {
  const resolver = await Agent.start({ input: `Resolve this exact gap once, or return it unchanged: ${firstGap}`, schema: evidenceSchema });
  gapResult = await resolver.latestAttempt.result();
  recordSpill(gapResult, firstGap);
  const gapData = gapResult?.data && typeof gapResult.data === "object" ? gapResult.data : null;
  const gapTerminalOk = gapResult?.status === "completed"
    && gapResult?.ok === true
    && gapResult?.error == null
    && gapData !== null;
  const reportedDescendants = gapTerminalOk && Array.isArray(gapData.unresolved) ? gapData.unresolved.filter(Boolean) : [];
  if (gapTerminalOk && Array.isArray(gapData.evidence)) {
    evidence.push(...gapData.evidence.filter(Boolean).map((value) => ({ source: firstGap, ref: gapResult.ref, value })));
  }
  const gapComplete = gapTerminalOk
    && gapData?.complete === true
    && Array.isArray(gapData.evidence)
    && gapData.evidence.length > 0
    && reportedDescendants.length === 0;
  if (!gapComplete) gapDescendants = reportedDescendants.length > 0 ? reportedDescendants : [firstGap];
}
const finalUnresolved = firstGap ? [...open.slice(1), ...gapDescendants] : open;
const synthesisRefs = [...refs, gaps?.ref, gapResult?.ref].filter(Boolean);
const synthesisAgent = await Agent.start({
  input: `Synthesize reports ${synthesisRefs.join(" ")} using inspected bodies only. Preserve this known state: ${JSON.stringify({ unresolved: finalUnresolved, notes: synthesisNotes })}. Keep unavailable-critic notes separate from research gaps. Inspect relevant bodies as needed; preserve unresolved items and omitted scope. Set complete:false when needed evidence is unavailable.`,
  schema: evidenceSchema,
});
const synthesis = await synthesisAgent.latestAttempt.result();
const synthesisSpilled = recordSpill(synthesis, "synthesis");
const synthesisData = synthesis?.data && typeof synthesis.data === "object" ? synthesis.data : null;
const synthesisTerminalOk = synthesis?.status === "completed"
  && synthesis?.ok === true
  && synthesis?.error == null
  && synthesisData !== null;
const synthesisGaps = synthesisTerminalOk && Array.isArray(synthesisData.unresolved) ? synthesisData.unresolved.filter(Boolean) : [];
const synthesisComplete = synthesisTerminalOk
  && synthesisData?.complete === true
  && Array.isArray(synthesisData.evidence)
  && synthesisData.evidence.length > 0
  && synthesisGaps.length === 0;
if (!synthesisComplete && !synthesisSpilled) synthesisNotes.push("synthesis unavailable or incomplete");
return { status: finalUnresolved.length || synthesisGaps.length || synthesisNotes.length > 0 ? "partial" : "complete", ref: synthesis?.ref ?? null, reports: synthesisRefs, spilledResults, unresolved: [...finalUnresolved, ...synthesisGaps], notes: synthesisNotes };

Wrap the shared discovery and gap-lineage state machine around these calls when needed. Do not invent durable control or recovery methods in this profile.

Live Workflow API V2

Budget the complete caller-supplied input or message string to at most 4096 UTF-8 bytes before runtime-added prior-result context. This applies to Agent.start, agent.followup, and agent.send. Count task text, JSON syntax, evidence, refs, and unresolved items together; JavaScript string.length is not a UTF-8 byte count.

Build critic and synthesis handoffs as a short task and accessible result.ref tokens plus only essential compact context. The runtime adds bounded context for those refs; children must inspect needed bodies and return complete: false with unresolved gaps when required evidence is unavailable. Refs do not carry lossless result.data or parent-local gap state. Include known unresolved items and synthesis notes as essential compact context. Keep every unresolved item unchanged in workflow state and in the final outcome. If essential context will not fit, split work within the remaining budget or disclose the omitted scope; do not truncate JSON or silently drop gap lists.

The live Workflow API V2 surface in this activation slice is the Agent and AgentAttempt path. Start each independent worker, then observe the exact attempt. Use a follow-up only for an explicit gap lineage that has not already received one:

const evidenceSchema = {
  type: "object",
  required: ["complete", "evidence", "unresolved"],
  properties: {
    complete: { type: "boolean" },
    evidence: { type: "array", items: { type: "string" } },
    unresolved: { type: "array", items: { type: "string" } },
  },
};
const synthesisNotes = [];
const spilledResults = [];
const recordSpill = (result, scope) => {
  if (result?.dataSpilledForSize !== true) return false;
  spilledResults.push({
    scope, ref: result.ref, status: result.status, ok: result.ok, error: result.error,
    dataSpilledForSize: result.dataSpilledForSize,
    submittedPayloadBytes: result.submittedPayloadBytes,
    submittedPayloadChars: result.submittedPayloadChars,
  });
  synthesisNotes.push(`${scope}: large submission retained at ${result.ref} in session storage / MSP subagent view; contents uninspected.`);
  return result.status === "completed" && result.ok === true && result.error == null;
};
const agent = await Agent.start({ input: "Inspect the implementation body; return complete/evidence/unresolved.", schema: evidenceSchema });
const tests = await Agent.start({ input: "Inspect the tests; return complete/evidence/unresolved.", schema: evidenceSchema });
const workers = [agent, tests];
const reports = await Promise.all([
  agent.latestAttempt.result(),
  tests.latestAttempt.result(),
]);
const compact = (result, scope) => {
  if (recordSpill(result, scope)) {
    return { scope, ref: result.ref, complete: false, evidence: [], unresolved: [] };
  }
  const data = result?.data && typeof result.data === "object" ? result.data : null;
  const terminalOk = result.status === "completed" && result.ok === true && result.error == null && data !== null;
  const evidence = terminalOk && Array.isArray(data.evidence) ? data.evidence.filter(Boolean) : [];
  const declared = terminalOk && Array.isArray(data.unresolved) ? data.unresolved.filter(Boolean) : [];
  const complete = terminalOk && data.complete === true && evidence.length > 0 && declared.length === 0;
  return {
    scope,
    ref: result?.ref ?? null,
    complete,
    evidence: terminalOk ? evidence : [],
    unresolved: complete ? [] : (declared.length ? declared : [`${scope}: missing complete evidence result`]),
  };
};
const compactReports = reports.map((result, index) => compact(result, `primary-${index}`));
const primaryRefs = compactReports.map((report) => report.ref).filter(Boolean);
const evidence = compactReports.flatMap((report) => report.evidence.map((value) => ({ source: report.scope, ref: report.ref, value })));
const primaryGaps = compactReports.flatMap((report) => report.unresolved);
const critic = await Agent.start({
  input: `Inspect relevant bodies and find concrete gaps in reports ${primaryRefs.join(" ")}. Known unresolved items: ${JSON.stringify(primaryGaps)}. Return complete/evidence/unresolved; set complete:false and name unresolved gaps when evidence is unavailable.`,
  schema: evidenceSchema,
});
const criticResult = await critic.latestAttempt.result();
const criticSpilled = recordSpill(criticResult, "critic");
const criticData = criticResult?.data && typeof criticResult.data === "object" ? criticResult.data : null;
const criticTerminalOk = criticResult?.status === "completed"
  && criticResult?.ok === true
  && criticResult?.error == null
  && criticData !== null;
const criticGaps = criticTerminalOk && Array.isArray(criticData.unresolved) ? criticData.unresolved.filter(Boolean) : [];
if (criticTerminalOk && Array.isArray(criticData.evidence)) {
  evidence.push(...criticData.evidence.filter(Boolean).map((value) => ({ source: "critic", ref: criticResult.ref, value })));
}
const criticComplete = criticTerminalOk
  && criticData?.complete === true
  && Array.isArray(criticData.evidence)
  && criticData.evidence.length > 0
  && criticGaps.length === 0;
if (!criticComplete && criticGaps.length === 0 && !criticSpilled) {
  synthesisNotes.push("completeness critic unavailable");
}
const open = [...primaryGaps, ...criticGaps];
const gapOwner = compactReports.findIndex((report) => report.unresolved.length > 0);
const firstGap = gapOwner >= 0 ? compactReports[gapOwner].unresolved[0] : (criticGaps[0] ?? null);
const gapAgent = gapOwner >= 0 ? workers[gapOwner] : critic;
const gapDescendants = [];
let followupRef = null;
if (firstGap) {
  const followupAttempt = await gapAgent.followup({ input: `Resolve this exact gap once, or return it unchanged: ${firstGap}` });
  const followupResult = await followupAttempt.result();
  recordSpill(followupResult, firstGap);
  followupRef = followupResult?.ref ?? null;
  const data = followupResult?.data && typeof followupResult.data === "object" ? followupResult.data : null;
  const followupTerminalOk = followupResult?.status === "completed"
    && followupResult?.ok === true
    && followupResult?.error == null
    && data !== null;
  const reportedDescendants = followupTerminalOk && Array.isArray(data.unresolved) ? data.unresolved.filter(Boolean) : [];
  if (followupTerminalOk && Array.isArray(data.evidence)) {
    evidence.push(...data.evidence.filter(Boolean).map((value) => ({ source: firstGap, ref: followupResult.ref, value })));
  }
  const descendants = reportedDescendants.length > 0 ? reportedDescendants : [firstGap];
  const followupComplete = followupTerminalOk
    && data?.complete === true
    && Array.isArray(data.evidence)
    && data.evidence.length > 0
    && reportedDescendants.length === 0;
  if (!followupComplete) gapDescendants.push(...descendants);
}
const unresolved = firstGap ? [...open.slice(1), ...gapDescendants] : open;
const synthesisRefs = [...primaryRefs, criticResult?.ref, followupRef].filter(Boolean);
const synthesis = await Agent.start({
  input: `Synthesize reports ${synthesisRefs.join(" ")} using inspected bodies only. Preserve this known state: ${JSON.stringify({ unresolved, notes: synthesisNotes })}. Keep unavailable-critic notes separate from research gaps. Inspect relevant bodies as needed; preserve unresolved items and omitted scope. Set complete:false when needed evidence is unavailable.`,
  schema: evidenceSchema,
});
const final = await synthesis.latestAttempt.result();
const finalSpilled = recordSpill(final, "synthesis");
const finalData = final?.data && typeof final.data === "object" ? final.data : null;
const finalTerminalOk = final?.status === "completed"
  && final?.ok === true
  && final?.error == null
  && finalData !== null;
const finalUnresolved = finalTerminalOk && Array.isArray(finalData.unresolved) ? finalData.unresolved.filter(Boolean) : [];
const finalOk = finalTerminalOk
  && finalData?.complete === true
  && Array.isArray(finalData.evidence)
  && finalData.evidence.length > 0
  && Array.isArray(finalData.unresolved)
  && finalData.unresolved.length === 0;
if (!finalOk && !finalSpilled) synthesisNotes.push("synthesis unavailable or incomplete");
return { status: unresolved.length || finalUnresolved.length || synthesisNotes.length > 0 || !finalOk ? "partial" : "complete", ref: final?.ref ?? null, spilledResults, unresolved: [...unresolved, ...finalUnresolved], notes: synthesisNotes };

Check dataSpilledForSize first. For inline results, read structured child data from result.data, including data.unresolved; the top-level result object is only the envelope. To stop a whole launched run from the parent conversation, call work_stop with work_id set to the workId from the launch result when that tool is available. interrupt() stops only one live child attempt: check agent.latestAttempt.getStatus() and call agent.latestAttempt.interrupt() before awaiting agent.latestAttempt.result(). After result() resolves, the attempt is terminal.

For later-owner recovery, invoke the Workflow tool with the returned scriptPath and resumeFromRunId; do not add those fields to the script API. Wrap the shared discovery and gap-lineage state machine around the Agent calls, and preserve unresolved descendants unchanged at the final boundary.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

3d-object

免费有简介

使用three.js创建立体模型,在交互式查看器中从各个角度检查形状和材质,并以OBJ + MTL或GLB格式保存,供其他三维制作软件使用。

  • 创建立体模型并从各个角度检查
  • 制作可在Blender中继续编辑的模型
  • 检查模型轮廓和材质效果
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

action-items

免费有简介

在个人任务清单中记录待办事项、承诺、期限、下一步、待回复对象和阻碍原因,更新进度与依赖关系,合并重复项并归档已结束的任务。

  • 记录有期限的任务与承诺
  • 整理待回复事项及阻碍原因
  • 前置任务完成后更新依赖关系
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

agents

免费

Coordinate a task from a verifiable goal through completion. Handle work directly or split independent tasks across separate agent sessions, track progress, verify results, and arrange pull request merging when included in the goal.

中文简介正在准备中。当前显示英语简介。

  • Split independent tasks across agents
  • Check progress across ongoing tasks
  • Resume a previously started project
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

animated-video

免费有简介

将动画制作成可播放、暂停和定位时间的HTML页面,通过时间轴调整场景时长与速度,并为横屏或竖屏视频导出做好准备。

  • 制作产品操作演示动画
  • 用文字和图形解释内容
  • 制作竖屏动画
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

apple_healthkit

免费有简介

按指定时段查看已同步到Apple Health的步数、心率、睡眠和锻炼记录,了解日常变化,并检查同步状态及记录缺失情况。

  • 查看步数与心率变化
  • 检查睡眠阶段、时长及夜间醒来情况
  • 回顾运动时长、距离与消耗热量
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

artifact_document

免费有简介

创建和编辑Word文档及模板,提取或整理内容、替换图片,并处理修订和批注。使用规范的标题与列表结构,交付前检查所有页面的显示效果。

  • 创建结构规范的Word文档
  • 整理现有文档的内容
  • 替换文档中的图片和文字
asgeirtj/system_prompts_leaks7万2026年10月23日 更新

查看 asgeirtj 的全部技能

报告此技能的问题