Repository navigation
Releases: jiangkoumo/ego-decision-layer
Release list
v0.9.1 — Windows 修复与五阶段能力更新
This release brings the GitHub Releases page up to date with the v0.9.x engine and includes the Windows CLI fixes from PR #2. The earlier v0.9.0 Git tag remains unchanged.
Included capabilities
- Adaptive page settling with MutationObserver-assisted quiet detection and bounded navigation waits.
- Structured extraction with
--extract/--schemaandextract(), a documented JSON Schema subset, selector scoping and explicit response validation. - Guarded action replay with context-bound cache keys, complete URL identity, LRU/TTL persistence and explicit stop conditions for uncertain outcomes. A cache hit skips the model request; it does not make the entire action instantaneous.
- Action batches supplied by a custom decision backend, with dangerous-action prechecks, one final settle and receipts for partial execution. The default Jev backend does not automatically produce batches.
- Canvas/SVG region fallback and an injectable
visualGrounder. Built-in region scanning supplies geometry and labels; it is not an image-understanding model.
Windows fixes
Thanks to @qikairo7 for contributing PR #2, following up on the reviews and testing the final changes on Windows.
- Convert engine import paths into valid file URLs across Git Bash, MSYS and Cygwin.
- Normalize temporary configuration and persistent-cache paths for the native child runtime, including
EGO_JEV_CACHE_FILEoverrides. - Preserve the server authority in UNC URLs and encode reserved characters, spaces and non-ASCII paths.
- Pass the encoder input through the environment to avoid MSYS command-line argument rewriting.
Documentation and distribution
README now documents the newer APIs, flags, test commands and their limits. Both the v0.9.1 source archives and current main include the Windows fixes. Fixed v0.9.0 archives do not. Existing skill copies and plugin caches require an explicit update.
npx skills add jiangkoumo/ego-decision-layer
# For an existing clone tracking main:
./update.shValidation and limits
- Windows path regression: 36 assertions passed on the contributor's Windows 11 / Node v24.20.0 / ego-browser 0.6.0.16 setup, including default-cache creation/reuse and the cache-path override.
- Ubuntu CI for PR #2 passed syntax, public-export compatibility and offline unit tests.
- Release metadata and README updates passed local release-consistency and Windows-path regression checks.
- UNC conversion and Windows Node parsing were checked, but end-to-end execution on a reachable network share remains untested. Some browser benchmark scripts still need separate Windows import-path adaptation.
- Model completion and schema validity do not prove business correctness; verify final URLs or application state for critical tasks.
Full changelog: v0.4.4...v0.9.1
v0.4.4 — 注入面可收缩:定向移除 + 路由层自知
0.4.4 — 2026-09-26
新增
--always-on --remove <file>(别名--always-on-remove <file>):把 always-on 从「全量
--restore才能清」变成定向往外移除。只移除我们自己的标记块(新标记
<!-- ego-decision-layer:route begin/end -->与历史标记),文件其余内容逐字节不变
(有.bak时按备份精确还原;没有时只删标记区及其自带分隔空行),同步从always-on.list
去掉该文件,绝不触碰接管层。幂等(没有块 → exit 0「无块可移」);文件不存在 / 缺参数 → exit 2。
--check/--status-json反映新的列表。- 路由层「自知」行:生成的
ego-browser/SKILL.md顶部(标题下方)现在写明「本入口由
本地接管层生成(非厂商文件):停止被路由bash <wire> --restore;查看当前状态
<cli> --route-status」。模板新增{{EGO_JEV_CLI}}占位符(渲染时替换成 CLI 真实路径);
description 拼法未动(位置断言不变),生成物仍确定性。
变更
- 注入面按需收缩:本机撤掉
~/.pi/agent/AGENTS.md与~/.claude/CLAUDE.md两处 always-on 块,
只保留~/.hermes/SOUL.md。依据:三个 always-on 里唯一有实测价值的常驻块是 Hermes 那处
(Hermes 真实运行没加载技能就直接用了 CLI);pi 与 Claude 两处没有证据支持——决策探针里
交互式会话在没开 always-on 时就是 5/5 命中(见 README「已知限制」与docs/WHY.md的探针口径)。
三个技能目录(.agents/.claude/.hermes)的同名接管层不变。
未验证
- Claude 侧路由未测(无探针):撤掉
~/.claude/CLAUDE.md那块之后,Claude Code 里的多步浏览器
任务是否仍会走 ego-decision-layer,没有测量(Hermes 那处有实测,pi/Claude 两处没有)。
保留的--always-on <file>仍可随时给任意文件插块。 - 同 0.4.3:本地模型后端只用 stub 验证,未在真实本地推理服务上端到端跑过;跨域 iframe 不处理;
frame 祖先带缩放/旋转直接拒绝;危险词表是启发式;真实验证码 / 登录墙未测。
v0.4.3 — 视口 0×0 默认自动撑起(修 0.4.2 的回归)
0.4.3 — 2026-09-26
修复
- 0.4.2 的「视口 0×0 就硬失败」在本机正常路径上就是回归 → 改成默认自动撑起。本机复测确认:
taskSpace新建的标签页在未导航 /domcontentloaded/load之后innerWidth/innerHeight
都是0×0,page.info()也为空——0×0 是这台机器的常态,不是异常。0.4.2 之后
examples/bench/run-pair.sh A从success:true, steps:2变成viewport_degraded,CLI 冒烟也 exit 1。
现在runJevAutonomousLoop入口仍只读一次视口(page.evaluate,不新增 CDP),任一为 0 时
默认自动Emulation.setDeviceMetricsOverride(1280x900@1)并打印一行说明,然后照常跑;
视口正常时零额外 CDP;只有自动撑起失败(CDP 报错)或显式 strict 时才viewport_degraded
(steps: 0、不派发、不问模型)。引擎结果新增viewportOverride(本次实际下发的覆盖),
CLI 据此决定退出时是否清理。
新增
--no-force-viewport(CLI)/options.strictViewport(库):显式要求「视口退化就直接失败」,
把 0.4.2 的 fail-fast 保留为可选行为。--force-viewport <宽x高>[@缩放]保留,尺寸优先于自动默认值。bench/test-viewport-degraded.mjs改写为 0.4.3 语义:0×0 默认自动撑起并继续、strict 失败、
CDP 撑不起来失败、正常视口零额外 CDP、显式值优先、确定性、CLI 参数。
更正
- 「覆盖跨进程持续」是错的(0.4.2 写入)。本机复测:覆盖是 per-space / per-page 的——
给某个 space 设过覆盖后,紧接着新开的 space 仍是 0×0;旧run-pair A success:true是因为
当时别处已有覆盖。已从 SKILL / README / CHANGELOG 更正。 - 「0×0 是异常宿主」的定位也是错的(0.4.2):本机新 space 常态就是 0×0。
Emulation.clearDeviceMetricsOverride在本机 0.5.1.13 上确实不回退(同进程 set→clear 后
innerWidth/innerHeight仍是覆盖值)——这一事实保留;但 CLI 不再把它当作“覆盖仍在生效”的依据,
而是退出时再读一次视口、如实报告。
未验证
- 同 0.4.2:本地模型后端只用 stub 验证,未在真实本地推理服务上端到端跑过;跨域 iframe 不处理;
frame 祖先带缩放/旋转直接拒绝;危险词表是启发式;真实验证码 / 登录墙未测。 - 自动撑起的默认尺寸
1280x900@1是否适合所有任务未做遍历;clearDeviceMetricsOverride在其它
ego lite 版本上的行为未测(只在 0.5.1.13 上测过)。
v0.4.1 — 采纳:子代理指派块 + 可复算的证据短文
0.4.1 — 2026-09-26
新增
--handoff-prompt(CLI):把「派活给子代理必须显式点名」做成产品能力。
决策探针实测:交互式会话 5/5 主动走本技能,而子代理 / 一次性无会话上下文 0/6——
这类上下文里既没有技能清单、也没有任何 AGENTS.md 内容,接管与 always-on 都到不了它们。
该选项打印一段可直接粘贴的指派块:路由判据(多步线性走本 CLI、单步 / 精确 DOM / 批量抓取走
ego-browser原生 API)、解析后的真实路径(技能目录 / CLI / SKILL.md,复用既有解析逻辑、
不硬编码~)、「先读 SKILL.md 再动手」、可照抄的命令模板(--url/--until/--steps/ 目标句),
结尾提示用--route-status核对。默认纯文本;--handoff-prompt --json给
{prompt, skillDir, cliPath, skillMdPath}。只读:不起浏览器、不需要凭证、不写任何文件,
也不触发首跑接管;输出不含任何外部仓库名,且确定性(两次运行逐字节一致)。- README「让 Agent 真的用上它」:三档手段与实测差异(交互式主动走;子代理必须显式指派 →
--handoff-prompt;常驻兜底 →--always-on),并如实写明边界:不读技能的 Agent 绕不过去;
个人作用域技能在 Cowork / 云会话不加载。 docs/WHY.md:为什么是「可插拔决策层」而不是「又一个包装」;三组可复算证据各带复算命令
或出处,并明写未验证边界。生态事实一律指向docs/ECOSYSTEM.md,不在该文重复。- 测试
bench/test-handoff-prompt.mjs(纯 node、无浏览器无凭证):断言真实路径、路由判据、
命令模板、--json结构、不含外部仓库名、两次运行逐字节一致。
未验证
- 同 0.4.0:本地模型后端只用 stub 验证,未在真实本地推理服务上端到端跑过;跨域 iframe 不处理;
frame 祖先带缩放/旋转直接拒绝;危险词表是启发式;真实验证码 / 登录墙未测。 --handoff-prompt产出的是指派文本,不是强制机制,也不改变执行成功率;探针样本仍是
n=5/6、单机单模型、只报计划(见 README「已知限制」),不能外推成真实执行成功率。
v0.4.0 — 改名 ego-decision-layer:可插拔决策层 + 一键本地迁移
0.4.0 — 2026-09-26
破坏性变更(改名):项目从
ego-jev改名为ego-decision-layer。公开身份都变了:
安装命令(npx skills add jiangkoumo/ego-decision-layer)、技能名(ego-decision-layer)、CLI 路径
(scripts/ego-jev→scripts/ego-decision-layer;引擎scripts/ego-jev.mjs→scripts/decider-loop.mjs)、
配置目录(~/.config/ego-jev→~/.config/ego-decision-layer)、always-on 块标记
(<!-- ego-jev:route … -->→<!-- ego-decision-layer:route … -->)。迁移三步(旧命令
ego-jev仍可用,保留为兼容垫片;环境变量EGO_JEV_*与引擎的 24 个导出
签名与名字都没动):bash scripts/rename-self.sh --dry-run # 1. 先看它会做什么(不写任何文件) bash scripts/rename-self.sh # 2. 执行(幂等) # 3. 重开 Agent 会话(技能列表是启动时快照的)
新增
- 改名 + 本地迁移脚本
scripts/rename-self.sh:幂等、支持--dry-run。顺序:旧接管先--restore→
记下 always-on 清单 → 删旧技能软链 / 建新软链(~/.local/bin也更新)→ 迁移配置目录 →
用新名重接管 → 重插 always-on → 自检。旧配置目录仍读得到(新目录不存在而旧目录存在时沿用并提示一次)。 - 历史入口垫片
scripts/ego-jev:打印一行改名提示后 exec 新 CLI,~/.local/bin/ego-jev不断。 --restore能清旧 always-on 块:wire 脚本同时识别新旧块标记。- 测试:断言旧名的测试改到新名;
test-release-consistency.mjs新增身份一致性断言
(SKILL.mdname == 插件清单 name ==skills/<name>/)与旧名白名单扫描;新增
bench/test-rename-self.mjs(临时 HOME + 假官方软链:--dry-run不写盘、真跑后迁移到位、
--checkexit 0、再跑幂等)。
未验证
- 同 0.3.4:本地模型路径只用 stub
fetch验证,未在真实本地推理服务上端到端跑过;hooks 未做、
路由触发率未量化。 - 改名后的真实第三方会话(Codex / Cursor 等重新读取新技能名)未实测;远端仓库改名由维护者在
GitHub 侧完成,本仓库只改本地身份。 - 迁移脚本只在临时 HOME 的模拟布局上验证过;未在本机实盘的多用户 / 多技能目录组合上验证。
v0.3.4 — 决策后端可插拔:默认 System One,可接本地 OpenAI 兼容端点
0.3.4 — 2026-09-26
新增
- 决策后端(decider)抽成可插拔的一层:正式契约
decide({ state, questions, options }) → { answers, meta }
(meta带model/usage/endpoint/kind)。既有 16 个导出签名不变,options.ask语义保持
(注入实现优先级最高)。默认仍是 System One(askJev),未配置时行为与从前完全一致。 - 本地模型路径(
kind: "openai-compatible"):POST {baseUrl}/chat/completions,适配
llama.cpp / ollama / vLLM / LM Studio 等 OpenAI 兼容端点。questions按稳定顺序确定性地渲染成
一段文本(不掺时间戳/随机数),要求严格 JSON;非 JSON / 缺问题头 / 候选非法 → 按既有
invalid_response失败,不猜、不派发任何动作。 - 诚实的能力声明:适配器
capabilities: { confidence: false }——文本 LLM 没有校准置信度。
引擎据此跳过minOpConfidence/minTargetConfidence/doneThreshold/stuckThreshold
四类基于置信度的阈值升级(默认全关),绝不伪造概率数字;但执行层护栏一条不少(陈旧校验、
guardRejected、跨 frame fail-closed、危险动作拦截、validateChoice候选合法性校验)。 - 文件式配置 + CLI 开关:
~/.config/ego-jev/decider.json(kind/baseUrl/model/
apiKey/apiKeyFile/timeoutMs/headers);CLI 加--decider <kind>/--base-url/--model。
本地后端不需要 TypeSafe 凭证,凭证预检相应放宽。README 加「决策后端」一节,SKILL.md对应一句。 - 新增
bench/test-decider-backend.mjs(离线、stubfetch、不需凭证)覆盖:默认路径请求体形状、
本地后端提示完整性/顺序稳定性、解析失败不派发、置信度能力差异、三类护栏仍生效、注入 ask 优先。
未验证
- 本地模型路径只用 stub
fetch验证过:没有在真实的本地推理服务上端到端跑过(llama.cpp /
ollama / vLLM / LM Studio 任一都没试)。真实端点的超时、response_format支持度、JSON 遵循率
均未测量。 - 同 0.3.3:hooks 方案未做、路由触发率未量化、个人作用域技能在 Cowork / 云会话不加载未实测;
docs/ECOSYSTEM.md的三列计数是文件树机械计数,★ 数与更新日期会变。
v0.3.3 — 生态一览:同类项目与上游的中立普查
0.3.3 — 2026-09-26
新增
- 生态一览
docs/ECOSYSTEM.md:同一思路(用 Jev / System One 替掉 ego lite
每步的大模型决策)在 5 天内出现了多个项目,本文档用同一套 GitHub API 查询做了中立的点状普查:
每个项目一行自述照抄其 GitHub About 原文,★数 / 创建日期 / 测试类文件数 / 原始数据 / CHANGELOG
都可复算(口径写进文档)。刻意不做排名、不评价优劣、不比较性能,并明说没有跑过他们的代码。
README 的「致谢」节加了一行指向它。回归保护:bench/test-release-consistency.mjs的
「文档里不出现未登记上游 github URL」断言只显式放行这一个文档(理由写在断言旁);
「代码行不得出现外部仓库名」这条不变。
未验证
- 同 0.3.2:hooks 方案未做、路由触发率未量化、个人作用域技能在 Cowork / 云会话不加载未实测。
docs/ECOSYSTEM.md的三列计数是文件树机械计数,不是测试用例数或质量评分;★ 数与更新
日期会变,且第三方目录(aiskill.market)的条目未经本仓库独立复核。
v0.3.2 — 路由句前置 + 触发通道实测
0.3.2 — 2026-09-26
更正
- always-on 到不了子代理:实测(全新会话的决策探针,中立 cwd,只报计划不执行)——
交互式会话 5/5 主动走 ego-jev(当时只有同名接管 + 自身技能两层,未开 always-on),
而子代理 / 一次性无会话上下文 0/6(开 always-on 前 0/4);探针直接确认这类上下文里
既没有技能清单、也没有任何 AGENTS.md 内容。所以 always-on 那行只对会读指令文件的
交互式会话有效;派活给子代理必须在 handoff 里显式写明用ego-jevCLI。 - 路由句被拼在最易被截断的位置:接管层把路由句拼在厂商描述之后。技能选择只看
「技能名 + description」,而描述会在技能多时按模型上下文的约 1% 做预算压缩、优先丢最少用的尾部,
单条也有长度上限——放在末尾等于最先被砍掉(本机实测:约 600+ 字符英文之后才出现那句中文)。
现在改为路由句在前、厂商描述在后(厂商文本一字未删、未改写,只挪位置),并把路由句改写成
以「触发条件 + 动作」开头,不再以「本入口已由 ego-jev 接管:」这种陈述打头;长度不增(反而更短)。
always-on 块第一句同样改为触发条件 + 命令,命令紧跟其后。测试新增位置断言
(不是 contains 断言)防止以后改拼法时悄悄退化。
未验证
- 同 0.3.1:hooks 方案未做;个人作用域技能在 Cowork / 云会话不加载未在真机上实测。
- 触发率测量是决策探针(只报计划、不执行)且样本很小(交互式 n=5,子代理 n=6),
不能当作真实执行成功率;always-on 的增量效果也未测出(基线已 5/5,天花板效应)。
v0.3.1 — --restore 变粘性:CLI 不再静默反转用户选择
0.3.1 — 2026-09-26
修复
--restore会被下一次 CLI 运行静默撤销:--ensure(CLI 首跑接管)只认「有启用标记」与
「检测到官方入口」,没有「用户已明确选择不接管」的持久状态。于是--restore清掉标记后,
下次跑ego-jev又会把入口接管回去(只打一行提示)——用户的显式决定被自动流程反转。
现在--restore会写一个持久化的 opt-out 标记(~/.config/ego-jev/opted-out,内容确定性,
无时间戳/随机数),--ensure见到它直接退出、什么都不做(连官方入口都不探测)。- opt-out 状态下的诊断文案自相矛盾:明明是「已按用户选择不接管」,末行仍打印
「所有 ego-browser 入口都已接管且最新」。现在该状态打印「按你的选择未接管任何入口
(重新启用命令见上)」;已接管状态与漂移状态的文案不变。
更正
--restore现在是粘性的:它不再只是「这一次还原」,而是「以后也别自动接管」。
重新启用必须用显式动作:bash scripts/wire-agent-skills.sh(或./install.sh的接管步骤)
会清掉 opt-out 标记并恢复接管;自动路径(--ensure/--if-enabled)永远不解除它。
新增
--status-json/ego-jev --route-status增加optedOut字段;--check在 opt-out 状态下
输出「已按用户选择不接管」并 exit 0(这是健康状态,不是漂移)。
「没有 opt-out 的普通未接管」仍按既有语义exit 1(回归保护已加进测试)。
未验证
- 同 0.3.0:hooks 方案未做、路由触发率未量化、个人作用域技能在 Cowork / 云会话不加载未实测。
v0.3.0 — 安装默认接管 + always-on 路由 + 路由可审计
0.3.0 — 2026-09-26
破坏性变更(安装默认行为):
./install.sh现在默认接管官方ego-browser入口;
ego-jevCLI 首次运行也会在检测到官方入口时接管一次。想退回旧行为:安装加--no-wire,
或随时bash scripts/wire-agent-skills.sh --restore(把入口还原成官方软链,并移除所有 always-on 块)。
新增
- 首装就默认接管:
install.sh默认执行接管(--wire仍接受,视为显式启用;--no-wire跳过)。
接管失败时安装仍然成功(提示原因 + 明确说 CLI 仍可用),只有显式--wire才让安装退出非零。 - CLI 首跑一次性接管:
scripts/ego-jev跑任务前看一眼官方入口——已接管过就静默刷新;
没接管过但检测到官方入口,就首跑接管一次并打印一行说明(含--restore还原命令);
两者都不是则什么都不做(不建目录、不打噪音)。EGO_JEV_NO_WIRE=1整体关闭(旧名
EGO_JEV_NO_HEAL=1仍接受)。这步任何失败只降级为一行提示,不改变任务的退出码。 --check给出结论而不是「跳过」:没有官方入口的目录明确写「无需接管(没有官方
ego-browser入口;该 Agent 通过自身的 ego-jev 技能被发现)」,并汇总
已接管 N / 无需接管 M / 漂移 K;有漂移仍 exit 1。--check保持只读(连 mtime 都不变)。- always-on 路由块(显式开关,默认不写任何用户文件):
bash scripts/wire-agent-skills.sh --always-on <file>向指定文件插入一段带标记的说明块
(<!-- ego-jev:route begin -->…end),幂等、可--restore精确移除,首次写入前备份到
同目录.bak。适合放在项目AGENTS.md或~/.claude/CLAUDE.md:让 Agent 在读任何技能之前
就知道「多步线性浏览器任务先走 ego-jev」。 - 路由可审计:新增只读命令
scripts/ego-jev --route-status,输出机器可读 JSON
(enabled/dirs[]/summary{n,m,k}/alwaysOn[]/vendor/generatedHash),
不起浏览器、不需要凭证、不建 TaskSpace。同一份信息作为route段写进 CLI 的结果 JSON,
renderJevSummary也带一行(路由: 已接管 2 / 无需 1 / 漂移 0 · always-on 1)。 --restore一次清两样:同时把接管层还原成官方软链、并移除所有已记录的 always-on 块。
修复
--check对「目录里没有官方入口」只打一行「跳过」,用户看不出结论;现在给出明确结论与原因。- CLI 自愈只在已有启用标记时才动手,导致「装完但从未接管」的机器永远不会走 ego-jev;
现在首跑接管。
更正
- 旧文档把
--wire写成可选的「顺便」动作,实际效果是多数用户装完仍走官方正文;
0.3.0 起默认接管,--no-wire才是显式跳过。
未验证
- hooks 方案没做:
SessionStart/UserPromptSubmit注入additionalContext是唯一
「必须发生」的强制层,但它要写用户的 Agent settings;本轮只文档说明,不自动改用户设置。 - 路由触发率没有量化:没有测「Agent 实际走 ego-jev 的比例」(需要另一套 grader)。
- always-on 的覆盖边界如实记录:个人作用域技能在 Cowork / 云会话里不加载,always-on 那行
一样受会话类型限制;它只影响读这个文件的 Agent。