PackHorizon · 架构事实复核

MAF 不是整个平台,当前也不是纯固定流程

最准确的说法:PackHorizon 自己造了业务规则、规划器、计划、数据与质检;MAF 提供模型客户端、Agent、FunctionTool、Workflow 与 Checkpoint。当前规划会动态选 Skill 和生成 DAG,但生产执行尚未使用 MAF 原生 Skill 按需发现,Tool 授权也主要由 Skill 元数据确定。

只读审计 · 当前分支与本地运行态 · 未修改项目代码
Installed MAF
Core 1.11.0已确认包含 SkillsProvider 与 load_skill
Business Paths
2 类 · 3 路径新包装完整;旧包装完整 / 部分升级
Active Catalog
9 Skills · 8 Tools当前三条路径均放行全部 9 个 Skill
Runtime Evidence
0 Runs暂无 Intake / Plan / Run / Report 真实记录
Section 01

你的四个判断,逐条纠正

不是简单的“对或错”:当前实现同时存在 MAF 原生底座、自建业务层,以及几处只搭了接口但没有进入生产主链的能力。

“MAF 负责整个平台运行”

不对

MAF 只进入 AI 生成域:模型客户端、Agent 工具循环、FunctionTool、Workflow 和 Checkpoint。网站、鉴权、项目、数据库、支付、积分、Celery、报告存储都由 PackHorizon 自己负责。

官方:Agents / Harness / Workflows;项目:FastAPI + React + PostgreSQL + Celery

“现在只有新包装、旧包装升级两个流程”

部分对

产品类型确实只有两个,但运行口径是三条路径:新包装完整、旧包装完整升级、旧包装部分升级。并且本地生效配置里“新包装完整”的 Planning Policy 为空,当前会在规划入口被拒绝。

ProjectPath.all_paths() + live agent_contract_project_types

“Skill 和 Tool 都已经注册在 MAF”

部分对

Tool 在执行时会被包装成 MAF FunctionTool;但注册表、启停、权限与审计是项目自建。MAF 原生 SkillsProvider 已有辅助代码,生产 Task Agent 却仍把选中 Skill 正文直接拼进 instructions,没有 context_providers,也不会自行 load_skill。

agent_producer.py:167-172;skills/library.py:112-123

“没有自动规划,现在仍是固定流程”

一半对

自建 Model Planner 会动态选择 Skill 并生成 DAG,所以技术上不是固定步骤;但 Planner 不选择 Tool,Tool 由 Skill metadata 确定性补齐。完整路径又因一类交付物通常只有一个 Skill,实际自由度很小,业务效果接近受约束的模板流。

DraftTask 无 tool 字段;compile_draft 将 allowedTools 置空
Section 02

哪些是 MAF 自带,哪些是我们自己造

“使用了 MAF”不等于“这些概念都是 MAF 的”。项目大量价值来自自建的业务治理层。

能力归属当前项目怎么用状态判断
Agent / ChatClientMAF 原生Planner 用 MAF ChatClient 做结构化输出;业务 Task 用 MAF Agent 执行。主链在用
FunctionToolMAF 原生权限自建项目把 ToolBroker 授权后的工具包装成 FunctionTool;越权、审计、Manifest 与启停由项目负责。混合实现
Agent SkillsMAF 原生安装包支持 SkillsProvider、FileSkillsSource、load_skill、read_skill_resource。项目也写了 provider helper。生产未接线
HarnessMAF 原生仓库有 build_harness / build_shared_harness 适配器,但产品域没有调用者;当前 Intake 直接调 ChatClient。适配存在 · 主链未用
Workflow / StepMAF 原生编译器自建PlanWorkflow 把自建 PlanSpec 编译成 MAF FunctionalWorkflow,使用 @workflow、@step、并行与恢复。主链在用
Checkpoint / ResumeMAF 原生持久化接线自建FileCheckpointStorage 保存步骤结果;项目负责目录、Run 状态、Resume API 与幂等 outbox。代码已接
Business Contract / PolicyPackHorizon 自建限定业务路径、可用 Skill、必需交付物、图片数量和终局报告,不是 MAF 的概念。领域治理层
Planner / Plan / Frozen PlanPackHorizon 自建模型起草 DAG、Validator 校验、指纹与哈希冻结;只借用 MAF ChatClient,不是 MAF Harness 的内置计划。核心自建
Reviewer / Final Gate / ReportPackHorizon 自建结构校验、独立评审、图片防伪、六方向装配、发布闸与报告表均由项目实现。核心自建
Section 03

从用户提交需求到报告:真实主链

橙色是项目自建,蓝色是 MAF 原生,绿色表示“自建业务逻辑运行在 MAF 原语之上”。

PRODUCT + DOMAIN 1 · 项目与需求会话创建 Project,用户多轮描述需求FastAPI / React / Postgres · 自建 2 · Intake 与 Requirement Card自建字段抽取与必填规则,调用 MAF ChatClient当前未使用 MAF Harness 3 · Contract / Policy 过滤按 kind + scope 取 Skill 白名单与交付约束Business Contract · 完全自建 PLANNING 4 · Model Planner 生成 DAG模型动态选 Skill、任务依赖、输入绑定自建 Planner + MAF ChatClient 5 · Tool Resolver + ValidatorTool 按 Skill metadata 确定性补齐校验 DAG、交付物、图片数与越权 6 · Frozen Plan / Run / Outbox冻结模型、Skill、Tool、上下文与哈希Celery 调度与数据库状态 · 自建 EXECUTION + DELIVERY 7 · MAF Functional Workflow@workflow / @step / asyncio.gatherFileCheckpointStorage / ResumePlanWorkflow 编译器由项目自建 8 · MAF Agent + FunctionTool每个 Task 建一个 Agent,获得授权 Tool当前 Skill 正文直接注入 instructions未走 SkillsProvider 按需发现 9 · Reviewer / Final Gate / ReportSchema、Skill Gate、LLM Reviewer、终局闸报告、六方向、图片、发布状态落库质量与交付层 · 自建 PackHorizon 自建 MAF 原生 混合接线
规划不是 MAF 自动给的
项目自己写 Planner Prompt、PlanDraft、Validator 和 Frozen Plan,只借 MAF ChatClient 调模型。
Workflow 才是真 MAF 执行层
自建的动态 Plan 被编译进 MAF Functional Workflow,获得 Step、并行和 Checkpoint。
Skill 目前仍是预选注入
Planner 先选一个 Skill;执行器把该 Skill 正文放进 Agent instructions,不是 Agent 自己发现并加载。
Section 04

到底是动态流程,还是固定流程

答案是“动态编排、强约束、低选择空间”。这三个词缺一个都会产生误解。

动态的部分

  • 模型从 Contract 裁剪后的 Catalog 里选择 Skill。
  • 模型生成 Task 数量、依赖、并行组、输入绑定和验收标准。
  • Validator 不通过会把问题回喂模型,最多再规划两轮。
  • 部分升级按用户 targetDeliverables 选择所需能力。
  • MAF Agent 可在已授权工具中自主调用非强制 Tool。

固定或确定性的部分

  • 只有 2 个 kind、3 条合法 ProjectPath。
  • 完整流程必须满足 Policy 的交付物、终局报告和图片数量。
  • 当前每种关键 output_kind 基本只有 1 个 canonical Skill。
  • 必需 Tool 不由 Planner 选择,而由 Skill metadata 自动授权并预执行。
  • source-intake、质量校验、Final Gate 与发布条件由代码固定。
结论

不能说“完全固定流程”,因为 DAG 确实由模型生成;也不能说“MAF 在自由规划整个平台”,因为 Planner 是项目自建,而且完整路径的 Skill、依赖和交付约束几乎把结果收敛成一条稳定主链。更准确:自建 Planner 在自建规则框内,生成一张由 MAF 执行的动态任务图。

Section 05

当前运行态:代码已接,不等于闭环已验

这里是本地运行中的真实数据库与容器状态,不是迁移文档目标。

原生 Skill

安装的 MAF 1.11.0 确实导出 SkillsProvider / FileSkillsSource / load_skill / read_skill_resource;仓库也有 build_skills_provider。

生产接线

生产 Agent 没有传 context_providers;build_skills_provider 没有生产调用者。当前依然是 skill_bodies[name] 直接加入 instructions。

Contract 范围

三条路径当前都允许全部 9 个 Skill,并未按“新包装 / 升级”收窄 Skill 白名单。

Tool 范围

9 个 Skill 中只有 packaging-intelligence 声明 4 个必需 Tool,image-brief 声明 image-generation;其余 Skill 没有 Tool 契约。

真实 Run

当前本地库 Intake、Card、Plan、Run、Step、Report、Image 均为 0;没有证据证明一单真实业务已从需求跑到报告。

图片安全闸

PHMAF_ALLOW_REAL_IMAGE=0,需要真实出图的完整流程当前会 fail-closed。

Section 06

要贴近 MAF 官方 Skill 发现模式,应该怎么接

不推翻 Contract / Plan / Planner;它们仍有价值。要改的是“Skill 如何进入 Planner 与 Task Agent”。

Contract 只决定可见边界

按 kind + scope 过滤可发现 Skill;不要把完整 Skill 正文塞给 Planner。Contract 是最大允许集,不是固定执行顺序。

用冻结快照构建 SkillsSource

把 DB 中激活且被 Contract 允许的版本转换成 InlineSkill,或实现 DB-backed SkillsSource;不能直接读取全局磁盘最新版本。

Planner 改成真正的 MAF Agent

给 Planner Agent 注入 context_providers=[SkillsProvider];它先看摘要,再调用 load_skill / read_skill_resource,最后输出结构化 Plan。

Frozen Plan 锁定发现结果

保存被选 Skill 的版本、hash、资源清单,以及每个 Task 可发现的 Skill 集;确保管理员后续改配置不影响旧 Run。

Task Agent 也按需加载

执行时只暴露 Frozen Plan 允许的 Skill 摘要,由 Task Agent 调 load_skill;删除当前把整份 SKILL.md 拼进 instructions 的路径。

Tool 采用三层授权

Contract 给最大范围,Skill 声明 required / optional,Plan 冻结最终子集;强副作用 Tool 由 Workflow 确定性调用,低风险 optional Tool 交给 Agent 判断。

先修运行配置再谈验收

补齐新包装 Policy、核对三路径 Skill 白名单、明确每个 Tool 的消费者,避免“注册了但永远拿不到授权”。

用真实 Run 验证,而不是只看路由

分别跑新包装、完整升级、部分升级;回读 Plan、skills loaded、tool invocations、checkpoint、Gate 和 Report。真实出图需单独授权。

Evidence

证据来源

官方语义、当前源码、运行容器与数据库分别核对;没有用上一份报告代替事实源。

OFFICIAL · Agent Skills
OFFICIAL · Agent Harnesses
OFFICIAL · MAF Workflows
OFFICIAL · Tools Overview
CODE · backend/app/agent_engine/skills/library.py:61-123
CODE · backend/app/agent_engine/workflow/agent_producer.py:116-172
CODE · backend/app/agent_engine/plan/model_planner.py:38-100,171-241
CODE · backend/app/agent_engine/plan/skill_tool_resolver.py:23-108
CODE · backend/app/domains/agent_runtime/services.py:345-555,636-708
CODE · backend/app/domains/agent_runtime/execution.py:118-245
CODE · backend/app/agent_engine/workflow/engine.py:238-412
RUNTIME · 45 Agent routes · MAF core 1.11.0 · backend/worker healthy · DB counts and active contract read back live