Agent Skillsmonotykamary/pi-fabric › fabric-workflow

fabric-workflow

GitHub

执行动态Python工作流,支持代码定义阶段、并行处理及结构化验证。适用于大规模审计、数据迁移或并行研究任务,通过fan-out/pipeline模式实现自动化分析。

skillsets/python/fabric-workflow/SKILL.md monotykamary/pi-fabric

Trigger Scenarios

大型审计任务 数据迁移 并行研究 显式的工作流请求

Install

npx skills add monotykamary/pi-fabric --skill fabric-workflow -g -y
More Options

Non-standard path

npx skills add https://github.com/monotykamary/pi-fabric/tree/main/skillsets/python/fabric-workflow -g -y

Use without installing

npx skills use monotykamary/pi-fabric@fabric-workflow

指定 Agent (Claude Code)

npx skills add monotykamary/pi-fabric --skill fabric-workflow -a claude-code -g -y

安装 repo 全部 skill

npx skills add monotykamary/pi-fabric --all -g -y

预览 repo 内 skill

npx skills add monotykamary/pi-fabric --list

SKILL.md

Frontmatter
{
    "name": "fabric-workflow",
    "description": "Runs a dynamic Pi Fabric workflow with code-held phases, fan-out, pipelines, structured agents, and best-effort verification. Use for large audits, migrations, parallel research, or explicit workflow requests.",
    "disable-model-invocation": true
}

Fabric Dynamic Workflow — Python

Use one Python fabric_exec with top-level payloads.task. Keep phases in code and label the outer display and every agent. Python uses host agents.run plus bounded asyncio.gather, not guest workflow/callback helpers. Child structured output is in the native result dictionary's value; a returned failed status is not success.

import asyncio
import json

async def ask(task, name, options=None):
    request = {"task": task, "name": name, "tools": ["read", "grep", "find", "ls"]}
    if options:
        request.update(options)
    result = await agents.run(request)
    if result["status"] != "completed":
        raise RuntimeError(result.get("error") or result["status"])
    return result["value"] if result.get("value") is not None else result["text"]

inventory = await ask("Discover at most 32 bounded work items for this objective:\n" + π.task, "inventory", {
    "schema": {"type": "object", "properties": {"items": {"type": "array", "maxItems": 32, "items": {"type": "string"}}}, "required": ["items"], "additionalProperties": False}
})
items = []
for item in inventory["items"]:
    item = item.strip()
    if item and item not in items:
        items.append(item)
if not items:
    return {"status": "success", "coverage": {"requested": 0, "completed": 0}, "failures": [], "result": "No bounded work items were found."}

async def analyze(item):
    try:
        finding = await ask("Analyze this bounded item with evidence: " + item + "\nObjective:\n" + π.task, ("analyze " + item)[:50])
        return {"item": item, "status": "completed", "finding": finding}
    except Exception as error:
        return {"item": item, "status": "failed", "error": str(error)}

outcomes = []
for offset in range(0, len(items), 8):
    batch = items[offset:offset + 8]
    settled = await asyncio.gather(*[analyze(item) for item in batch])
    outcomes.extend(settled)
    if all(item["status"] == "failed" for item in settled):
        outcomes.extend([{"item": item, "status": "not_started", "error": "not started after an all-failed batch"} for item in items[offset + len(batch):]])
        break
completed = [item for item in outcomes if item["status"] == "completed"]
failures = [item for item in outcomes if item["status"] != "completed"]
coverage = {"requested": len(items), "completed": len(completed)}
if not completed:
    return {"status": "failed", "coverage": coverage, "failures": failures, "result": None}
try:
    result = await ask("Adversarially verify only these completed findings; drop unsupported claims and do not infer anything about failed items.\nObjective:\n" + π.task + "\nFindings:\n" + json.dumps(completed), "verify synthesis")
    return {"status": "partial" if failures else "success", "coverage": coverage, "failures": failures, "result": result}
except Exception as error:
    return {"status": "partial", "coverage": coverage, "failures": failures, "result": None, "verificationError": str(error), "fallback": completed}

Adapt tools to the request. Partition path ownership or use worktree=True before concurrent editing. Keep intermediate data guest-local; successful verification returns compact output. partial is usable: never automatically rerun the whole workflow or successful items. Retry only missing coverage. Stop new work after an all-failed batch. Reserve agent capacity for discovery and verification; usage/budget checks are observational under concurrency. Python has no top-level tokenBudget callback-helper budget. Use agents.spawn and agents.steer only when a long-running worker benefits from redirection between turns.

Version History

  • 88c505b Current 2026-09-08 19:27

Same Skill Collection

skills/fabric-advisor/SKILL.md
skills/fabric-ambient/SKILL.md
skills/fabric-council/SKILL.md
skills/fabric-exec/SKILL.md
skills/fabric-fusion/SKILL.md
skills/fabric-guide/SKILL.md
skills/fabric-rlm/SKILL.md
skills/fabric-schema/SKILL.md
skills/fabric-spec/SKILL.md
skills/fabric-supervisor/SKILL.md
skills/fabric-swarm/SKILL.md
skills/fabric-workflow/SKILL.md
skillsets/python/fabric-advisor/SKILL.md
skillsets/python/fabric-ambient/SKILL.md
skillsets/python/fabric-council/SKILL.md
skillsets/python/fabric-exec/SKILL.md
skillsets/python/fabric-fusion/SKILL.md
skillsets/python/fabric-guide/SKILL.md
skillsets/python/fabric-rlm/SKILL.md
skillsets/python/fabric-schema/SKILL.md
skillsets/python/fabric-spec/SKILL.md
skillsets/python/fabric-supervisor/SKILL.md
skillsets/python/fabric-swarm/SKILL.md
skillsets/typescript/fabric-advisor/SKILL.md
skillsets/typescript/fabric-ambient/SKILL.md
skillsets/typescript/fabric-council/SKILL.md
skillsets/typescript/fabric-exec/SKILL.md
skillsets/typescript/fabric-fusion/SKILL.md
skillsets/typescript/fabric-guide/SKILL.md
skillsets/typescript/fabric-rlm/SKILL.md
skillsets/typescript/fabric-schema/SKILL.md
skillsets/typescript/fabric-spec/SKILL.md
skillsets/typescript/fabric-supervisor/SKILL.md
skillsets/typescript/fabric-swarm/SKILL.md
skillsets/typescript/fabric-workflow/SKILL.md

Metadata

Files
0
Version
88c505b
Hash
ab50c35d
Indexed
2026-09-08 19:27

Home - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-09-08 19:51
浙ICP备14020137号-1 $Map of visitor$