Agent 面试指南

你的 Agent Hook 是如何设计的?

这题的重点是区分 EventBus 和 Hook。一个记录事实,一个改变控制流。混在一起,系统会很快变成不可 replay 的 monkey patch。

SCOPE本章边界

本章讲 Hook / Plugin Extension 如何进入控制流。它是我在可扩展 runtime 里的设计抽象,不等同于所有 SDK 的现成概念;落地时可映射到 middleware、callbacks、guardrails 或 graph node。

30 SEC面试开口版

我把 hook 设计成进入控制流的 typed phase,而不是 EventBus 订阅。EventBus 发布已经发生的事实,比如 tool started、permission requested、run ended;HookKernel 处理会改变行为的扩展点,比如 patch provider request、阻断工具调用、裁剪工具结果、取消 compact。每个 phase 都要声明 reducer:多个 hook 的结果怎么合并,谁能短路,失败是 fail open 还是 fail closed。

理解与记忆 · 术语、解析、关联知识点
专业术语EventBus:发布已经发生事实的事件总线。
HookKernel:执行会影响后续控制流的 typed hook 内核。
Hook Phase:明确生命周期节点,例如 tool.call.before、model.request.before。
Reducer:多个 hook 返回值的合并规则。
Fail Open / Fail Closed:hook 失败时继续执行或阻断执行。
Audit Event:记录 hook 决策、patch、失败和耗时的审计事件。
为什么这样回答30 秒版先抢最关键边界:观察和控制分离。Hook 不是“插件想插哪插哪”,而是 runtime 给出的受控相位、返回类型、合并规则和失败策略。
小白解析EventBus 像摄像头,记录“刚才发生了什么”;Hook 像门禁,会决定“接下来能不能进门、要不要改路线”。摄像头不能决定门开不开,门禁也不能偷偷改账本。
关联知识点Guga docs/agent-hook 把 EventBus、HookKernel、CapabilityRegistry 分开;OpenAI Guardrails 展示输入、工具、输出不同阶段的拦截;MCP 工具安全强调工具调用前后的校验、审计和用户确认。

1 MIN一分钟口语版

Hook 最怕做成一堆 listener 随便改 runtime state,那样 replay、并发和安全都会崩。我会设计一个 HookKernel,每个扩展点都是明确的 phase,比如 model.request.before、tool.call.before、tool.result.before、context.compact.before。Hook 不能直接拿可变 core state,只能返回 typed result,比如 patch、decision、annotation、contribution。多个 hook 的结果怎么合并要写成 contract:是 transformChain、firstDenyWins、patchChain,还是 collectContributions。危险工具的 mandatory gate 超时要 fail closed,普通观测类 hook 可以 fail open。所有影响行为的 hook 都落 audit,replay 时默认复用当时的 decision,而不是重新跑不确定逻辑。

理解与记忆 · 术语、解析、关联知识点
专业术语Typed Result:hook 只能返回 patch、decision、annotation、contribution 等类型化结果。
transformChain:多个 transform hook 按稳定顺序串行修改快照。
firstDenyWins:第一个拒绝决策短路后续 gate。
patchChain:多个 patch 合并到同一对象,但要做冲突检测。
Deterministic Replay:回放时复用已记录决策,避免插件环境变化导致不同结果。
Plugin Permission:插件声明能进入哪些 phase、访问哪些资源。
为什么这样回答1 分钟版要把 Hook 的真实生产风险讲出来:顺序、并发、权限、超时、审计、replay。这样回答能让面试官相信你不会把扩展性做成 monkey patch。
小白解析插件不能像一群人同时抢方向盘。系统要规定:谁能在什么路口提建议,建议是什么格式,如果两个人冲突谁说了算,出事时能查到是谁改了方向。
关联知识点Guga agent-hook 推荐首批 phase:session.start、resources.discover、model.request.before、tool.call.before、tool.result.before、run.end;replay 默认不重跑非确定性 hook;dangerous gate 超时应 fail closed。

FLOW工具 Hook 管线

CALL模型提出 tool call,进入 tool.call.before。
PATCHtransform args 后重新 schema validation。
GATEpermission / sandbox / lock / tool.execute.before。
RUN执行工具,保留原始 execution record。
RESULTtool.result.before 脱敏、截断、artifact 化后回流模型。

工具 Hook 进入真实执行链路

你的 Agent Hook 是如何设计的? Mermaid diagram 1

COMPARE别人怎么设计

Pi agent

Pi 的 hook 很像 typed lifecycle:context、before_provider_request、tool_call、tool_result、resources_discover 等事件有不同 reducer 语义。它的启发是 hook 不是名字,而是 phase + result type。

Claude Code / Blade

它们把工具 hook 放在执行 pipeline 内部,PreToolUse 在权限和执行前进入链路。这个位置很关键,因为工具 hook 会影响真实副作用,不能做成旁路监听。

OpenCode

OpenCode 的 Bus 更适合广播 session/message/permission/pty 等事实给 UI 或 SSE。它提醒我:Bus 可以做 observability,但不适合表达 mutation order。

Hermes

Hermes 区分 Gateway Hooks 和 Plugin callbacks,pre_tool_call 可以 block,而且 first block wins。它证明了 decision hook 和 telemetry hook 应该分开。

GUGA我是怎么设计的

  1. EventBus 和 HookKernel 分工EventBus 发布事实,HookKernel 改变后续行为。判断标准很简单:如果返回值会影响 runtime,就不能放 EventBus。
  2. 每个 phase 有 reducerobserveAll、transformChain、firstDenyWins、patchChain、collectContributions、firstCancelWins。顺序是 contract,不是实现细节。
  3. Hook 只能返回 typed result返回 decision、patch、contribution、annotation;不能拿到可变 ConversationState 或 ToolRegistry 直接改。
  4. 稳定排序按 phase、priority、loadTier、pluginLoadIndex、hookRegisterIndex 排序。trace 里能解释为什么 A 在 B 前面。
  5. 审计和 replay所有改变行为的 hook 都落 hook.audit。replay 默认复用记录过的 decision/patch,不重跑非 deterministic hook。

PHASES第一批 Hook phase

PhaseEffectReducer作用
session.startobserveobserveAll插件初始化、trace、缓存预热。
resources.discovercontributecollectContributions贡献 skills、context files、MCP servers。
model.request.beforetransformtransformChainpatch provider request 或 context item。
tool.call.beforetransform / gatetransformChain + firstDenyWinspatch args、阻断风险调用。
tool.result.beforetransformpatchChain截断、脱敏、artifact 化。
context.compact.beforegate / transformfirstCancelWins / patchChain取消、定制或标注 compact。

PROBLEM我遇到的问题和优化

问题

  • 如果用 EventBus 做 hook,多个 listener 的顺序、合并、短路、失败策略都说不清。
  • 允许插件原地改 core state,会让 replay、reload、session fork 都不可信。
  • hook 超时或失败,如果全局 fail open,会把安全策略静默绕过。
  • 并发工具执行时,如果结果按完成顺序写回 conversation,模型输入不可复现。

优化

  • preflight hook 顺序执行,execution 可并发,conversation result 按原始 tool call 顺序写回。
  • dangerous tool 的 mandatory gate hook 超时要 fail closed。
  • HookContext 只暴露 facade,并提供 assertFresh,防止 reload 后旧 context 操作新 session。
  • args patch 后必须重新 schema validation,避免 hook 把合法调用改成非法调用。

REVISIONHook MVP 的硬边界

第一版 Hook 我只开放少量 typed phase:model.request.beforetool.call.beforetool.result.beforerun.end。Hook 返回 typed result,不拿 mutable runtime,不直接写 core state。需要改工具参数时,patch 后重新进入 schema、permission、sandbox 和 audit。这样 Hook 是受控策略扩展,不是任意 middleware。

这是我在可扩展 runtime 里的设计,不是所有 SDK 的现成能力;如果用 OpenAI / LangGraph,需要用 middleware、callbacks、guardrails 或 graph node 去模拟类似边界。

INTERVIEW两个 subagent 高强度追问整合版

面试官:EventBus 和 Hook 最大区别是什么?第二层追问:为什么不能把 EventBus listener 做得强一点,让它也能改状态?

我:EventBus 只发布已经发生的事实,比如 tool started、permission requested、run ended;Hook 会改变后续控制流,比如阻断工具、patch 参数、裁剪结果、取消 compact。如果 listener 也能改状态,顺序、失败、重试、replay 都说不清。判断标准很简单:返回值会影响 runtime,就必须进 HookKernel;只观察事实,才走 EventBus。

理解与记忆 · 背后工程点

背后工程点:观察和决策要分离,否则系统不可回放。
专业术语:
EventBus 是事实广播;
HookKernel 是控制流扩展内核;
Listener 是事件监听器;
Control Flow 是系统后续执行路径;
Replay Semantics 是回放语义。
为什么这样回答:先守住核心定义,后面关于 reducer、审计、失败策略才有基础。
小白解析:摄像头可以记录谁进门,但不能偷偷改变门禁规则。
关联知识点:Guga agent-hook 明确不建议把 EventBus 升级成万能 hook;OpenCode bus 更适合 UI/SSE 观测。

面试官:一个 Hook phase 应该怎么建模?第二层追问:最小字段有哪些?

我会把 phase 建成 contract:phase name、effect type、input snapshot、allowed patches、result type、reducer、timeout、failure policy、audit requirement 和 replay policy。注册的 hook 还要有 hookId、pluginId、priority、loadTier、permissions、deterministic flag。这样每个扩展点都知道能看什么、能改什么、多个结果怎么合并、失败后怎么处理。

理解与记忆 · 背后工程点

背后工程点:phase 是可测试契约,不是随意字符串。
专业术语:
Phase Contract 是 hook 相位契约;
Effect Type 是 observe、gate、transform 等效果类型;
Input Snapshot 是只读输入快照;
Allowed Patch 是允许修改的字段范围;
Deterministic Flag 是是否可确定性重跑。
为什么这样回答:面试官想听“怎么落到代码”。字段能把 hook 的顺序、权限和回放讲清楚。
小白解析:每个插座要标明电压、用途、谁能用,不能谁想插什么就插什么。
关联知识点:Guga M1 HookKernel 计划支持 phase、hook 排序、audit event 和 reducer;Pi/Hermes 也区分 gateway hooks 和插件 callback。

面试官:firstDenyWins、transformChain、collectContributions 分别适合什么?第二层追问:两个 hook 一个 allow 一个 deny 怎么解释?

安全 gate 用 firstDenyWins,因为任何一个 mandatory 安全 hook 拒绝,高风险动作就不能继续。参数或请求修改用 transformChain,让后一个 hook 看到前一个 patch 后的快照;资源发现用 collectContributions,收集候选后再由 registry 去重和冲突处理。allow 和 deny 冲突时,deny 胜出,并在 audit 里记录哪个 hook、哪个插件、基于什么规则拒绝。

理解与记忆 · 背后工程点

背后工程点:reducer 是冲突治理,不是实现细节。
专业术语:
firstDenyWins 是首个拒绝短路;
transformChain 是串行变换链;
collectContributions 是收集候选贡献;
Mandatory Gate 是强制安全闸门;
Audit 是审计记录。
为什么这样回答:hook 的难点是多个插件互相影响。讲 reducer 能显示你能让冲突可解释。
小白解析:安检场景里,只要一个安检员发现危险品,就不能因为另一个说没事而放行。
关联知识点:Guga agent-hook 文档列出 observeAll、transformChain、firstDenyWins、patchChain、collectContributions;Hermes pre_tool_call 可以 block 且 first block wins。

面试官:HookContext 暴露什么?第二层追问:为什么不能把 runtime、tool registry、conversation state 都给插件?

HookContext 应该是最小 facade:只读 session id、run id、phase、输入快照、允许的 helper、artifact writer、audit logger、abort signal。不能直接给可变 ConversationState、ToolRegistry 或 PermissionKernel,否则插件可以绕过 reducer、审计和权限。需要贡献能力时,返回 contribution candidate,由 CapabilityRegistry 做去重、冲突和权限检查。

理解与记忆 · 背后工程点

背后工程点:HookContext 是最小权限 facade,不是 runtime 后门。
专业术语:
Facade 是受限接口;
Input Snapshot 是只读输入快照;
Artifact Writer 是产物写入器;
Capability Contribution 是能力贡献候选;
CapabilityRegistry 是能力注册表。
为什么这样回答:如果插件能直接改 core state,HookKernel 的 reducer 和 audit 全部失效。
小白解析:访客可以在前台登记请求,不能直接进档案室改档案。
关联知识点:Guga 不建议 hook 原地 mutate runtime 对象,也不建议 hook 直接改 registry;能力注册应由 registry 收口。

面试官:model.request.before 能改什么?第二层追问:能不能改 system prompt 或删除用户限制?

model.request.before 可以添加低优先级 context annotation、provider options、safe metadata 或格式适配,但不能直接改 conversation history、删除当前用户约束、覆盖 protected system/developer、安全策略。需要改变模型输入时,hook 返回 patch candidate,Context Policy 负责合并和审计。protected context 永远高于插件贡献,插件只能贡献资料或建议,不能升级成根指令。

理解与记忆 · 背后工程点

背后工程点:provider request hook 不能突破上下文指令层级。
专业术语:
Protected Context 是受保护上下文;
Provider Options 是模型供应商参数;
Patch Candidate 是候选修改;
Context Policy 是上下文合并策略;
Instruction Hierarchy 是指令层级。
为什么这样回答:model.request.before 是最危险的 hook 之一,因为它靠近最终 prompt。必须明确不能改 protected 层。
小白解析:插件可以在会议材料后面加附件,但不能改公司章程或删掉老板刚说的限制。
关联知识点:Guga context-policy-plugins 要求 hooks 返回 typed contributions/patches,不直接改 final provider request。

面试官:tool.result.before 如何处理 5MB 日志、密钥、图片或网页?第二层追问:它能改变工具事实吗?

tool.result.before 负责结果治理,不负责篡改事实。它可以脱敏 secret、生成 bounded preview、按类型折叠日志、把大结果写 artifact、给图片或网页生成引用和摘要,但 raw result 要保留在受控 artifact 或 execution record 里。模型看到的是 observation,用户和 replay 可以回查完整证据。任何 redaction、truncate、artifact offload 都要落 result policy audit。

理解与记忆 · 背后工程点

背后工程点:结果 hook 做投影和治理,不篡改原始事实。
专业术语:
Bounded Preview 是有限预览;
Redaction 是脱敏;
Artifact Offload 是大结果产物化;
Observation 是模型可见结果;
Result Policy Audit 是结果策略审计。
为什么这样回答:工具结果是上下文和安全最大压力源。必须分 raw result、artifact、observation。
小白解析:原始账单要存档,给会议看的只是一页摘要,敏感号码要打码。
关联知识点:Guga tool runtime 使用 ResultPolicy;Deep Agents 用文件系统 offload 大工具结果;MCP 支持 structuredContent 和 resource link。

面试官:context.compact.before 让插件取消或改压缩,会不会破坏 context policy?第二层追问:谁有最终决策权?

context.compact.before 可以贡献建议:取消压缩、补充保留来源、标注 memory extraction candidate、调整摘要选项。但它不能直接改 session log 或 final projection。最终决策仍由 Context Policy 和 runtime 做,写 compact boundary event。多个插件冲突时用 firstCancelWins 或 patchChain,再由 policy 做字段级冲突检测。这样插件能参与长任务续航,但不能让压缩变成不可审计的字符串替换。

理解与记忆 · 背后工程点

背后工程点:compact hook 是建议和 gate,不是直接替换上下文。
专业术语:
Compaction 是上下文压缩;
Compact Boundary 是压缩边界事件;
firstCancelWins 是首个取消生效;
Field-level Conflict 是字段级冲突;
Memory Extraction Candidate 是记忆抽取候选。
为什么这样回答:context 压缩影响长任务连续性,插件参与必须有最终策略收口。
小白解析:整理仓库前,安全员可以说“这箱别扔”,但不能自己偷偷重写仓库账本。
关联知识点:Guga context-policy hooks 包括 compact.before/after;agent-context-management 强调 compact 是可见事件。

面试官:memory write hook 怎么防止不可信 observation 写成长记忆?第二层追问:hook 能直接写 MemoryStore 吗?

memory write hook 只能产出 MemoryCandidate 或 rejection reason,不能直接写 active MemoryStore。候选要带 source_event_ids、trust level、scope、sensitivity、confidence 和 evidence refs。来自网页、工具日志、子 Agent 摘要的不可信内容默认低置信,敏感或跨 scope 内容需要用户确认。真正写入由 MemoryPolicy 决定,并记录 decision event。

理解与记忆 · 背后工程点

背后工程点:hook 可以发现候选记忆,不能绕过记忆治理。
专业术语:
MemoryCandidate 是候选记忆;
Rejection Reason 是拒绝原因;
Trust Level 是可信等级;
MemoryPolicy 是记忆策略;
Decision Event 是写入决策事件。
为什么这样回答:长期记忆是持久化攻击面,写入必须比普通 context 更保守。
小白解析:插件可以建议“这条可能值得记”,但不能直接把它写进永久档案。
关联知识点:learn-agent Memory Governance 的 candidate ledger;Guga agent-memo 的三层记忆架构。

面试官:Hook 能改工具参数,这本身很危险。patch 后怎么保证参数仍合法?第二层追问:hook 吞掉错误怎么办?

tool.call.before 可以 patch args,但 patch 后必须重新 schema validation、permission evaluation 和 risk classification。Hook 不能吞掉原始工具错误,tool.result.before 只能返回 normalized patch 或 annotation,原始 raw result 和 error 仍进 artifact/audit。任何 patch 都要有 before/after summary,敏感字段脱敏后记录。这样出事故能知道是模型参数错、hook 改错,还是工具执行错。

理解与记忆 · 背后工程点

背后工程点:hook patch 必须进入重新校验和审计。
专业术语:
Schema Validation 是参数结构校验;
Risk Classification 是风险分类;
Raw Result 是原始工具结果;
Before/After Summary 是变更摘要;
Annotation 是不改变结果事实的标注。
为什么这样回答:插件修改参数会改变真实副作用,不能绕过工具运行时。
小白解析:别人帮你改合同金额,改完还要重新审核,不能直接盖章。
关联知识点:Guga tool pipeline 是 validate -> hooks -> permission -> execute -> result policy;OpenAI/MCP 工具错误也应结构化回流给模型。

面试官:两个 hook 都修改同一个字段,一个加系统提示,一个删系统提示,怎么处理?第二层追问:谁负责冲突仲裁?

patch 必须是结构化字段级 patch,不能让 hook 返回任意新对象。允许 patch 的字段有 merge strategy:append、replace-if-empty、deny-replace、max-risk-wins。protected 字段默认 deny-replace。冲突进入 explicit arbitration,由 phase reducer 或 Context Policy 决定,并记录 conflict audit。不能让后注册插件无声覆盖前一个插件的安全限制。

理解与记忆 · 背后工程点

背后工程点:patch 合并要字段级、策略化、可审计。
专业术语:
Field-level Patch 是字段级补丁;
Merge Strategy 是合并策略;
Protected Field 是受保护字段;
Conflict Audit 是冲突审计;
Arbitration 是仲裁。
为什么这样回答:多个插件修改同一请求是高发风险。字段级冲突检测比“后者覆盖前者”安全得多。
小白解析:两个人改同一条规章,不能悄悄以后写的人为准,要拿出来审批。
关联知识点:Guga patchChain 需要明确合并规则;red-team 建议字段级冲突检测和显式仲裁。

面试官:Hook 顺序怎么保证确定?第二层追问:稳定排序就足以保证确定性吗?

排序上用 phase、priority、loadTier、pluginLoadIndex、hookRegisterIndex,保证同一组 hook 顺序可解释。但稳定排序不等于确定性,因为 hook 可能读时间、网络、随机数、文件系统。Hook 要标 pure/impure;impure hook 的外部输入、决策和 patch summary 必须入 audit snapshot。replay 默认复用当时 decision,而不是重新执行 impure hook。

理解与记忆 · 背后工程点

背后工程点:确定性来自排序 + 输入快照 + replay 决策复用。
专业术语:
Stable Ordering 是稳定排序;
Pure Hook 是只依赖输入快照的 hook;
Impure Hook 是依赖外部环境的 hook;
Audit Snapshot 是审计快照;
Decision Reuse 是回放时复用决策。
为什么这样回答:很多人以为排序确定就够了。实际插件会读外部世界,必须把非确定性纳入审计。
小白解析:排队顺序固定,但每个人今天心情不同,结果也可能不同。要记录当时他们为什么这么决定。
关联知识点:Guga replay 默认不重跑带副作用 hook,只有 deterministic hook 且策略允许才重跑。

面试官:replay 时为什么不重新跑 hook?第二层追问:真实恢复时如果环境变了,还能复用旧决策吗?

诊断 replay 不重新跑非确定性 hook,因为插件版本、文件系统、时间、网络、环境变量都可能变,重跑会伪造一个新历史。它应该复用当时记录的 decision/patch/contribution。真实恢复不同:恢复前要重新校验环境新鲜度、权限和工具可用性;旧决策只能作为历史证据,不能自动授权今天的副作用。简单说:replay 解释过去,resume 面向现在。

理解与记忆 · 背后工程点

背后工程点:诊断回放和真实恢复的 hook 语义不同。
专业术语:
Diagnostic Replay 是诊断回放;
Live Resume 是真实恢复;
Freshness Check 是新鲜度校验;
Historical Decision 是历史决策;
Mutating Hook 是会改变行为或环境的 hook。
为什么这样回答:这能回应红队担心:复用旧决策可能掩盖环境变化。你要区分解释历史和继续执行。
小白解析:看监控录像时不能让保安重新演一遍当时的决定;但今天再开门时要重新刷卡。
关联知识点:Guga replay 不重跑 provider、tool 或 mutating hook;resume 需要重新绑定 cwd、tools、权限和 session。

面试官:哪些 hook fail closed,哪些 fail open?第二层追问:只有这两个策略够吗?

危险工具的 mandatory gate,比如删除文件、联网外发、生产配置、secret 访问,超时或失败要 fail closed。日志、metrics、非关键 UI annotation 可以 fail open。中间还有 pause 或 degraded:比如非危险权限 hook 超时可以暂停等用户确认;某个插件连续失败就 circuit break 并禁用该 phase。所有失败都要落 hook.failure,不能静默吞掉。

理解与记忆 · 背后工程点

背后工程点:失败策略要按风险分层,并支持熔断和降级。
专业术语:
Fail Closed 是失败即阻断;
Fail Open 是失败仍继续;
Pause 是暂停等待人工或恢复;
Circuit Breaker 是熔断器;
hook.failure 是 hook 失败事件。
为什么这样回答:只说 fail open/closed 太粗。生产系统需要超时、熔断、禁用、告警和人工接管。
小白解析:消防门传感器坏了要停止开放;装饰灯坏了可以先继续营业。
关联知识点:Guga agent-hook 测试清单要求 mandatory gate 超时 fail closed,observe hook 抛错不影响 run。

面试官:恶意插件或供应链攻击怎么办?第二层追问:装了插件是不是就能进所有 hook phase?

不能。插件要有来源签名、权限清单、phase allowlist、版本、审计和禁用机制。装插件时展示它要进入哪些 phase、能访问哪些资源、能否联网、能否改工具参数。运行时按最小权限给 HookContext,不给可变 core state;危险 phase 需要额外 capability。企业环境还要 allowlist、签名校验、沙箱执行和集中禁用列表。

理解与记忆 · 背后工程点

背后工程点:hook 是控制面能力,插件供应链必须被治理。
专业术语:
Plugin Signature 是插件签名;
Phase Allowlist 是允许进入的相位列表;
Capability 是受控能力声明;
Sandbox 是插件隔离环境;
Enterprise Allowlist 是企业白名单。
为什么这样回答:红队会把 hook 看成攻击入口。资深回答要覆盖安装、授权、运行、撤销全链路。
小白解析:给第三方钥匙前,要知道它能开哪几扇门,钥匙从哪来,出事能不能马上收回。
关联知识点:MCP 和插件生态都要求 host 负责权限、审计和用户确认;Guga PluginHost 后续要接 manifest、permissions、reload。

面试官:用户安装插件时,怎么知道它加了哪些 hook?第二层追问:产品体验上怎么展示风险?

安装时展示 plugin manifest:它注册哪些 phase、effect type、需要哪些权限、是否联网、是否读写文件、是否能 gate 工具、是否能 patch provider request。高风险 phase 要明显标注,比如 tool.call.before gate、model.request.before patch、memory write candidate。用户可以禁用某个 phase,而不是只能装或卸载整个插件。管理员能看到审计和禁用列表。

理解与记忆 · 背后工程点

背后工程点:Hook 权限要产品化展示,否则用户无法做知情授权。
专业术语:
Plugin Manifest 是插件声明文件;
Effect Type 是 hook 效果类型;
Phase Toggle 是相位级开关;
Admin Control 是管理员控制;
Risk Label 是风险标签。
为什么这样回答:生产插件生态需要用户和管理员理解控制面风险。Hook 隐藏在后台会破坏信任。
小白解析:安装浏览器插件时,你要知道它能读网页、改网页,还是只能显示图标。Agent 插件也一样。
关联知识点:MCP client/server 责任强调工具展示和用户授权;Guga 插件一等公民需要 manifest 和 permission 模型。

面试官:新增 phase 或 reducer 后,旧插件怎么办?第二层追问:Hook contract 如何版本兼容?

Hook API 要语义化版本。新增 phase 默认不会影响旧插件;修改输入字段要保持兼容或给 adapter;废弃字段要有 deprecation window。每个插件声明支持的 core version 和 phase version,runtime 加载时做 compatibility check。conformance tests 覆盖排序、reducer、失败策略和 audit shape。这样 core 演进不会随机破坏插件。

理解与记忆 · 背后工程点

背后工程点:Hook 生态需要 contract versioning 和兼容测试。
专业术语:
Semantic Versioning 是语义化版本;
Adapter 是兼容适配;
Deprecation Window 是废弃过渡期;
Compatibility Check 是兼容性检查;
Conformance Test 是契约测试。
为什么这样回答:Hook 一旦开放给插件,API 变化就是生态风险。版本兼容是平台设计的一部分。
小白解析:插座标准变了,不能让旧电器突然都不能用;要有转接头和过渡期。
关联知识点:Guga 小内核大插件的路线会带来核心契约兼容压力,必须用版本和测试管理。

面试官:Hook 链很长会拖慢每次工具调用。怎么控制延迟?第二层追问:哪些 hook 可以异步化?

关键路径 hook 要有 phase budget、单 hook timeout、总链路 timeout 和耗时 trace。安全 gate 必须同步,因为它决定能否执行;telemetry、metrics、非关键审计上报可以异步化,但核心 audit event 要先落本地。插件可以懒加载,低优先级 hook 采样执行,连续超时进入 circuit breaker。最终要在 trace 里能看到每个 phase 的耗时和慢插件。

理解与记忆 · 背后工程点

背后工程点:Hook 扩展性不能无限侵蚀工具延迟。
专业术语:
Phase Budget 是相位时间预算;
Timeout 是超时限制;
Telemetry 是遥测;
Lazy Loading 是懒加载;
Sampling 是采样执行。
为什么这样回答:工程系统要量化扩展开销。不是所有 hook 都值得进入用户等待路径。
小白解析:安检必须等,但满意度问卷可以之后再发,不能让用户堵在门口。
关联知识点:OpenAI Guardrails 有 blocking/parallel 权衡;Guga agent-hook 要求每个 hook 有 timeout 和 AbortSignal。

面试官:如果一个 hook 崩了或者长期变慢,怎么运维?第二层追问:用户正在执行的 run 怎么办?

运行时要有 health check、failure counter、circuit breaker、phase-level disable、admin alert。当前 run 里,如果是 mandatory safety hook 崩了,高风险动作 fail closed 或 pause;如果是非关键 hook,降级继续并记录 warning。后续 run 自动禁用不健康插件或降级到 observe-only。用户应该看到“某插件不可用,已按安全策略暂停/跳过”的解释。

理解与记忆 · 背后工程点

背后工程点:Hook 需要可运维性,不只是代码接口。
专业术语:
Health Check 是健康检查;
Failure Counter 是失败计数;
Phase Disable 是相位禁用;
Observe-only 是只观察模式;
Admin Alert 是管理员告警。
为什么这样回答:插件系统上线后会出故障,必须有熔断、禁用和用户解释。
小白解析:某个安检设备坏了,要么启用备用流程,要么暂停高风险通道,不能假装没事。
关联知识点:red-team 建议 fail open/closed 之外加入熔断、降级、禁用插件和管理员告警。

面试官:怎么评估一个 hook 对系统质量到底是提升还是伤害?第二层追问:只看最终成功率够吗?

不够。我会看 per-hook metrics:触发次数、deny rate、false positive、false negative、patch frequency、latency、timeout、导致 retry 次数、用户撤销率、相关任务成功率和安全违规率。评测上对比打开/关闭某个 hook 的任务集,trace 标出 hook decision 是否改变路径。安全 hook 要看越权率下降和误拦率;context hook 要看任务成功率、成本和 missing fact 下降。

理解与记忆 · 背后工程点

背后工程点:Hook 是策略,必须能被单独度量和回归。
专业术语:
Deny Rate 是拒绝率;
False Positive 是误拦;
False Negative 是漏拦;
Ablation 是关闭某能力做对照;
Policy Regression 是策略回归。
为什么这样回答:扩展点越多越可能引入隐性成本和错误。用 trace/eval 才知道它是否值得。
小白解析:一个安检规则可能减少风险,也可能让正常用户都过不了。要统计两边。
关联知识点:OpenAI tracing 记录 guardrail/function spans;Guga strategy 强调 runtime 边界回归率和审计覆盖率。

面试官:如果让你做 Hook MVP,第一版做哪些 phase,不做哪些?第二层追问:怎么避免变成任意 middleware 平台?

第一版我只做少量承重 phase:resources.discover、model.request.before、tool.call.before、tool.execute.before、tool.result.before、context.compact.before、run.end。每个 phase 只支持有限 reducer 和 typed result。先不开放任意 middleware、不允许插件直接改 runtime state、不做跨进程复杂插件市场。MVP 的目标是把顺序、阻断、patch、审计、replay 语义跑通,而不是追求“任何地方都能插”。

理解与记忆 · 背后工程点

背后工程点:Hook MVP 要少而硬,先证明控制面语义。
专业术语:
MVP 是最小可用版本;
Middleware 是任意中间层;
Typed Result 是类型化返回;
Replay Semantics 是回放语义;
Control Plane 是控制面。
为什么这样回答:这能收束整章:可扩展性不是任意扩展,而是把关键相位设计稳定。
小白解析:先开放几个安全检查点,而不是让任何人随时插进生产线任意位置。
关联知识点:Guga agent-hook 建议 M1 先实现内存版 HookKernel,首批 phase 有 session/start、resources、model request、tool call/result、run end。

PRINCIPLE我总结的核心范式

Hook 的本质是“受控扩展点”,不是“随便插代码”。能观察的走 EventBus,能改变行为的走 HookKernel;每个 phase 必须有合并规则、失败策略、审计记录和 replay 语义。