agent-trellis 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/claude-code.js +2 -2
- package/dist/adapters/codex.js +3 -3
- package/dist/adapters/jsonMcp.d.ts +1 -1
- package/dist/adapters/jsonMcp.js +2 -2
- package/dist/adapters/kimi-code.js +2 -2
- package/dist/adapters/kiro.js +11 -9
- package/dist/adapters/mcpPlan.d.ts +1 -1
- package/dist/adapters/mcpPlan.js +35 -12
- package/dist/adapters/pi.js +5 -5
- package/dist/adapters/zcode.d.ts +1 -1
- package/dist/adapters/zcode.js +6 -6
- package/dist/cli.js +12 -1
- package/dist/commands/doctor.d.ts +9 -1
- package/dist/commands/doctor.js +92 -7
- package/dist/commands/evolve.d.ts +43 -0
- package/dist/commands/evolve.js +479 -0
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcpAuth.js +1 -1
- package/dist/commands/mcpGateway.d.ts +30 -2
- package/dist/commands/mcpGateway.js +44 -10
- package/dist/commands/mcpImport.js +2 -1
- package/dist/commands/secretsAudit.d.ts +1 -1
- package/dist/commands/secretsAudit.js +36 -13
- package/dist/evolve/agentView.d.ts +32 -0
- package/dist/evolve/agentView.js +34 -0
- package/dist/evolve/apply.d.ts +71 -0
- package/dist/evolve/apply.js +162 -0
- package/dist/evolve/archive.d.ts +23 -0
- package/dist/evolve/archive.js +58 -0
- package/dist/evolve/erase.d.ts +17 -0
- package/dist/evolve/erase.js +65 -0
- package/dist/evolve/extension.d.ts +37 -0
- package/dist/evolve/extension.js +63 -0
- package/dist/evolve/gate.d.ts +95 -0
- package/dist/evolve/gate.js +295 -0
- package/dist/evolve/importHistory.d.ts +91 -0
- package/dist/evolve/importHistory.js +239 -0
- package/dist/evolve/jobMain.d.ts +22 -0
- package/dist/evolve/jobMain.js +52 -0
- package/dist/evolve/jobRun.d.ts +94 -0
- package/dist/evolve/jobRun.js +273 -0
- package/dist/evolve/jobShell.d.ts +46 -0
- package/dist/evolve/jobShell.js +75 -0
- package/dist/evolve/l2.d.ts +93 -0
- package/dist/evolve/l2.js +81 -0
- package/dist/evolve/lesson.d.ts +57 -0
- package/dist/evolve/lesson.js +97 -0
- package/dist/evolve/pending.d.ts +69 -0
- package/dist/evolve/pending.js +116 -0
- package/dist/evolve/probeWorkspace.d.ts +57 -0
- package/dist/evolve/probeWorkspace.js +69 -0
- package/dist/evolve/propose.d.ts +73 -0
- package/dist/evolve/propose.js +136 -0
- package/dist/evolve/recorder.d.ts +68 -0
- package/dist/evolve/recorder.js +169 -0
- package/dist/evolve/report.d.ts +26 -0
- package/dist/evolve/report.js +37 -0
- package/dist/evolve/reportView.d.ts +96 -0
- package/dist/evolve/reportView.js +311 -0
- package/dist/evolve/risk.d.ts +106 -0
- package/dist/evolve/risk.js +224 -0
- package/dist/evolve/sources.d.ts +19 -0
- package/dist/evolve/sources.js +29 -0
- package/dist/evolve/stateDir.d.ts +21 -0
- package/dist/evolve/stateDir.js +56 -0
- package/dist/evolve/surface.d.ts +34 -0
- package/dist/evolve/surface.js +72 -0
- package/dist/evolve/trajectory.d.ts +25 -0
- package/dist/evolve/trajectory.js +88 -0
- package/dist/evolve/treeToCanonical.d.ts +28 -0
- package/dist/evolve/treeToCanonical.js +79 -0
- package/dist/evolve/trellisSubstrate.d.ts +65 -0
- package/dist/evolve/trellisSubstrate.js +154 -0
- package/dist/evolve/trigger.d.ts +177 -0
- package/dist/evolve/trigger.js +400 -0
- package/dist/evolve/types.d.ts +126 -0
- package/dist/evolve/types.js +15 -0
- package/dist/evolve/validate.d.ts +139 -0
- package/dist/evolve/validate.js +315 -0
- package/dist/host/checks.d.ts +57 -0
- package/dist/host/checks.js +126 -0
- package/dist/host/delivery.d.ts +42 -0
- package/dist/host/delivery.js +59 -0
- package/dist/host/edits.d.ts +87 -0
- package/dist/host/edits.js +102 -0
- package/dist/host/hostEvents.d.ts +74 -0
- package/dist/host/hostEvents.js +45 -0
- package/dist/host/index.d.ts +22 -0
- package/dist/host/index.js +17 -0
- package/dist/host/levels.d.ts +106 -0
- package/dist/host/levels.js +206 -0
- package/dist/host/staging.d.ts +56 -0
- package/dist/host/staging.js +106 -0
- package/dist/host/surface.d.ts +36 -0
- package/dist/host/surface.js +20 -0
- package/dist/lib/backup.js +12 -3
- package/dist/lib/envVarNames.js +7 -0
- package/dist/lib/fsAtomic.d.ts +7 -0
- package/dist/lib/fsAtomic.js +14 -0
- package/dist/lib/hostEventBus.d.ts +47 -0
- package/dist/lib/hostEventBus.js +94 -0
- package/dist/lib/hostExtensions.d.ts +75 -0
- package/dist/lib/hostExtensions.js +196 -0
- package/dist/lib/mcpConnect.d.ts +1 -1
- package/dist/lib/mcpConnect.js +19 -8
- package/dist/lib/mcpMigrateRead.js +14 -2
- package/dist/lib/mcpRuntime.d.ts +12 -1
- package/dist/lib/mcpRuntime.js +34 -2
- package/dist/lib/mcpToolRegistry.d.ts +18 -2
- package/dist/lib/mcpToolRegistry.js +29 -9
- package/dist/lib/secretEnv.d.ts +53 -8
- package/dist/lib/secretEnv.js +78 -15
- package/dist/lib/tomlSection.js +3 -2
- package/dist/lib/workspaceDoctor.d.ts +1 -1
- package/dist/lib/workspaceDoctor.js +8 -4
- package/dist/lib/workspaceMcp.d.ts +1 -1
- package/dist/lib/workspaceMcp.js +5 -5
- package/dist/pi-bridge/bundle.js +42236 -2701
- package/dist/pi-bridge/index.js +2 -2
- package/docs/magpie-gateway-research.md +422 -0
- package/docs/research.md +4 -1
- package/docs/roadmap.md +22 -12
- package/docs/runtime-infra.md +41 -22
- package/docs/self-evolution.md +138 -44
- package/package.json +8 -2
- package/schema/secrets.policy.example.yaml +5 -0
- package/schema/servers.example.yaml +5 -1
package/docs/self-evolution.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# 自我进化:Trellis 的第二个子系统(想法沉淀)
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> **状态:阶段一已交付(2026-10-26),默认 `off` 未对用户开启。** 2026-10-20 初稿按"借 harness2 方法论自设形态"起草;**2026-10-24 用户裁决改为直接做 harness2 的 TS 版本——移植引擎,而非再造形态**,同日定下打包两阶段(内部包先行);2026-10-24–26 按 `openspec/changes/trellis-evolve/tasks.md` 完成阶段一实现。可验证的行为约束在 change 的 `specs/` 里,**二者冲突时以 `specs/` 为准**。
|
|
4
|
+
> 本文是**想法与取舍**:是什么、为什么、边界在哪、已核实什么、还没定什么。
|
|
5
5
|
|
|
6
6
|
## 接手指南
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**一句话现状**:阶段一(tasks 第 1–14 组)已交付:引擎移植为 workspace 内部包 `packages/evolve-engine/`(golden 对照 175/175)、托管扩展点、TrellisSubstrate 适配层、observe/触发、L4 治理与 fixture 端到端,宿主测试 1216/1216、`tsc` 干净、`openspec validate --strict` 通过、真机冒烟确认默认 `off` 零副作用。**生产接线已补齐(2026-10-26 收口)**:enable/disable 同步扩展清单、`activate` 订阅者包装(recorder + 触发器)、作业体 rule-based 治理流水(引擎内核 golden 锚定、生产未消费,随 L2/探针任务集接入)。后续是 `auto-A` 准入、L2/探针任务集、阶段二公开包。
|
|
9
9
|
|
|
10
10
|
**文档地图(各管什么,避免重复维护)**
|
|
11
11
|
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
| `…/tasks.md` | 实施顺序与逐项验证方式 | 实施中勾选 |
|
|
20
20
|
| `docs/roadmap.md` | 一段指针 | 阶段变化时 |
|
|
21
21
|
|
|
22
|
-
**建议阅读顺序**:本文"一句话"与"核心原则" → `design.md` 的 Context(已核实表)与 Open Questions → `tasks.md`
|
|
22
|
+
**建议阅读顺序**:本文"一句话"与"核心原则" → `design.md` 的 Context(已核实表)与 Open Questions → 本文"生产接线"与 `tasks.md` 全貌 → 需要细节再读 `specs/`。
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
**接手后第一步**:读 `tasks.md`(阶段一全部完成)与 `spec-test-mapping.md`(58 场景→测试映射,创建 PR 时并入 PR 描述),然后看下文"生产接线"的边界说明(editor 通道未接、发现面=观察面等)。golden 对照集与复现方式在 `packages/evolve-engine/golden/`,是引擎后续改动的正确性锚。
|
|
25
25
|
|
|
26
26
|
**需要接手人特别留意的三件事**
|
|
27
27
|
|
|
28
|
-
1. **解耦是硬约束**:依赖只能是进化 → 托管。`src/evolve/`
|
|
28
|
+
1. **解耦是硬约束**:依赖只能是进化 → 托管。`packages/evolve-engine/`(引擎)不 import 任何 Trellis 代码;`src/evolve/`(适配+治理)只允许 import 引擎包与 `src/host/*`,有测试强制。任何让托管"知道"进化的改动都是方向性错误。
|
|
29
29
|
2. **带外批准目前不是完全可靠的**:有 shell 能力的 agent 理论上能执行管理面命令,TTY 检测只是启发式。`auto-A` 开启之前必须再评估(见 design 的 Risks 与 Open Questions)。
|
|
30
30
|
3. **覆盖范围有边界**:事件只来自经 gateway/runtime 投递的 agent,仅走原生渲染的 agent 没有工具调用事件。不要在文档或 doctor 输出里假装全覆盖。
|
|
31
31
|
|
|
@@ -35,6 +35,18 @@
|
|
|
35
35
|
|
|
36
36
|
Trellis 由两个**解耦**的部分组成:**托管**(让配置被正确投递并保持一致)和**自我进化**(让被托管的内容随使用变得更好)。进化是挂在 runtime 底座上的环境式能力,跑在其上的 agent 自己持续进化,可选安装、分级开启;它**不是**一条要用户去敲的命令。
|
|
37
37
|
|
|
38
|
+
## 北极星(2026-10-27 定稿,两层)
|
|
39
|
+
|
|
40
|
+
**引擎层(原样继承 harness2,不许动):**
|
|
41
|
+
|
|
42
|
+
> 一个 agent 的 harness 应当仅凭自身的执行证据自我改进——无分数、无答案键、无 ground truth——只做可追溯到具体执行时刻的、上下文廉价的、可复用的编辑;宁可不改,不可白改;盲判交付物、以用户的请求为标尺;花费被严格记账;经验按域向前携带,让每一个未见任务都从更好的起点开始。
|
|
43
|
+
|
|
44
|
+
**适配层(Trellis 侧,本次工作的星):**
|
|
45
|
+
|
|
46
|
+
> 用户用 claude code / codex / pi 干的真实任务就是任务域;观察真实任务,蒸馏出考题(含标准答案),harness2 引擎原样跑考题做验证;被进化的 harness 就是托管的配置面(指令/skills/工具编排/记忆);人批与备份回滚是落地的安全壳。**进化的是 harness 不是模型;证据是任务执行对比不是配置体检;判效以用户的请求为标尺,含过程质量(少纠错、少报错、不越权);宁可不改不可改坏。**
|
|
47
|
+
|
|
48
|
+
反目标(防漂移):不追分数(报告数字永不进选择回路);不改模型、不改交付物契约;不合成配置健康分(L1 差集只是 `validate_tree` 级施工检查);不为进化而进化;引擎不绑宿主(method/substrate/benchmark 三轴分离是 harness2 自己的架构纪律)。
|
|
49
|
+
|
|
38
50
|
## 为什么要做
|
|
39
51
|
|
|
40
52
|
托管已经覆盖 skills、MCP、指令、scope、memory,但托管内容的**改进完全靠人**。信号其实一直存在,缺的是把"信号 → 提案 → 验证 → 采纳 → 教训沉淀"闭环起来的机制。2026-10 的两个真实事故说明了这一点:
|
|
@@ -54,21 +66,21 @@ Trellis 由两个**解耦**的部分组成:**托管**(让配置被正确投递
|
|
|
54
66
|
| 缺席时 | 完全正常 | (本来就可选) |
|
|
55
67
|
|
|
56
68
|
- **依赖方向只有一条:进化 → 托管,绝不反向。** 卸载进化,托管行为逐字节不变。这比"功能开关"更强:它是**可选安装**。
|
|
57
|
-
-
|
|
58
|
-
-
|
|
69
|
+
- **引擎是移植的 harness2 core**(`packages/evolve-engine/`,阶段一内部包):只依赖 `Substrate` 协议(5 方法,83 行原样翻译),对 Trellis 零感知。`src/evolve/` 的 **TrellisSubstrate 实现协议**并经托管的 `host` 门面落盘。好处:引擎可用 fake substrate 独立测试、golden 对照不被宿主污染、将来换宿主(如 agent-framework)只重写适配层。
|
|
70
|
+
- 原自设的 `HostPort` 接口**作废**——harness2 已有验证过的协议签名,不自造接口。托管的 `scope.yaml`(怎么渲染)与适配层的"可编辑表面"声明(surface)各管各的,不合并。
|
|
59
71
|
|
|
60
72
|
```
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
TS 引擎(packages/evolve-engine,移植自 harness2 core,对 Trellis 零感知)
|
|
74
|
+
schedule / recursion / selection / proposer / judge / context
|
|
75
|
+
prompts / tree / runmark / ledger ← 只认识这个协议 ↓
|
|
76
|
+
Substrate 协议(5 方法,83 行原样翻译)
|
|
77
|
+
surface() ───────→ Trellis 可编辑树 schema(能改什么、静默失效模式)
|
|
78
|
+
materialise() ───────→ staging 渲染(host 门面:scratch HOME + 临时 workspace)
|
|
79
|
+
execute() ───────→ 探针会话(穷人沙盒 + 一次性 CLI 会话)
|
|
80
|
+
read_trajectory() ───────→ 会话记录/轨迹 → 共享语法
|
|
81
|
+
preflight() ───────→ doctor 级花钱前自检
|
|
82
|
+
TrellisSubstrate(src/evolve,适配 + L4 治理)→ 托管
|
|
83
|
+
host 门面(检查 / 备份会话写入 / 回滚 / staging)· 事件流 · memory 管道(通用扩展点)
|
|
72
84
|
```
|
|
73
85
|
|
|
74
86
|
## 环境式运行:触发、观察、通知、生效
|
|
@@ -76,7 +88,7 @@ HostPort {
|
|
|
76
88
|
Trellis 的 gateway 是按会话拉起的 stdio 进程,规范明确 **"without a resident daemon"**,所以进化也**不引入常驻进程**,靠事件驱动:
|
|
77
89
|
|
|
78
90
|
1. **观察**:被动加主动并行。被动 = gateway 路由层记录元数据(工具/skill/记忆的调用、耗时、错误类别);主动 = agent 在用户纠正时自己调用 `trellis.evolve.note` 上报。主动信号最贵、质量最高(例如一次"配置改反方向"的纠正)。
|
|
79
|
-
2. **触发**:会话结束(provider 的 `close()` 钩子)
|
|
91
|
+
2. **触发**:会话结束(provider 的 `close()` 钩子)时判断信号量/冷却期(严重度加权留待后续变更,本期信号无严重度字段),满足则 detached 拉起**一次性**后台作业,单实例锁。
|
|
80
92
|
3. **提案 → 验证 → 过门**:见下节,即原五环的 Propose / Probe / Compose。
|
|
81
93
|
4. **通知**:pending 提案经 provider 暴露给 agent(`pending` 工具或 resource),agent 在会话里告知用户;doctor 与 GUI 也可查看。
|
|
82
94
|
5. **生效**:runtime 模式下 skills / instructions 由 provider 从 canonical 实时提供,采纳后**下个会话自然读到新版本,无需 sync**;只用原生渲染的 agent,采纳后触发 sync。
|
|
@@ -92,7 +104,7 @@ Observe → Propose → Probe → Compose → Apply+Reflect
|
|
|
92
104
|
lesson 回流为下次 Propose 的上下文 ┘
|
|
93
105
|
```
|
|
94
106
|
|
|
95
|
-
- **Propose
|
|
107
|
+
- **Propose**:引擎 proposer 拉起 improver 会话(本机 CLI spawn;agent-bridge 为可选委派通道),产出结构化树编辑。editor 是**不可信输出**:引擎 `validate_tree` 机械复核,错误写成可执行散文喂回重试一次,再错丢弃;证据要求与 Class C 排除由 L4 治理层与 `surface()` schema 双重强制。**没有 evidence 链接的提案直接丢弃。**
|
|
96
108
|
- **Probe**:提案先写入 staging 候选(scratch HOME,按需加临时 workspace root),不动真配置。
|
|
97
109
|
- **Compose**:风险门,见下。采纳铁律:任何验收器结果不得差于 baseline,宁可不进化。
|
|
98
110
|
- **Apply+Reflect**:写入走一个备份会话,单点 `trellis rollback` 整体回滚;被采纳的编辑蒸馏成 lesson `{cue, lesson, evidence, confidence?}` 进 `memories/`,作为下次提案上下文(harness2 的 improvement harness)。
|
|
@@ -102,9 +114,9 @@ Observe → Propose → Probe → Compose → Apply+Reflect
|
|
|
102
114
|
harness2 的评分是**两段式且互相隔离**:选择(匿名对比、无 ground truth)与评分(checklist,选择承诺之后才跑)物理分离,选择器永远看不到评分材料。我们按"有无现成 oracle"分层:
|
|
103
115
|
|
|
104
116
|
- **L1 配置类 — 确定性差集,零 LLM**:baseline 与 staging 候选各跑 doctor / `sync --check` / secrets audit,可采纳 ⟺ 无新 finding ∧ 目标 finding 已消除 ∧ 其余不变。配置类的检查本身就是 ground truth,比 LLM 选择器更强也更便宜。两个事故都属这一类。
|
|
105
|
-
- **L2 内容类 — 沙盒执行 + 匿名 A/B
|
|
106
|
-
- **L3 成绩单**:一小组带显式 checklist
|
|
107
|
-
-
|
|
117
|
+
- **L2 内容类 — 沙盒执行 + 匿名 A/B**:同一道考题在 base 与 candidate 下各跑一次,交付物冻结后,以种子匿名 id 呈现给独立选择器(不给 verdict、不含评分字样、不标明哪臂是新)。选择器失败 / 任一臂未交付 / 选中 base ⟹ 一律不采纳。**一处刻意反转**:harness2 把 base 排除出候选池("构造上无法弃权",因为它必须进化);我们把 base **留在池里**,因为我们不能退化。
|
|
118
|
+
- **L3 成绩单**:一小组带显式 checklist 的考题,定期对已采纳修改跑 `n_passed/n_criteria` 看趋势。评分失败记 `None`,不计入分母,**永不记 0 分**;结果只给人看,不给选择器看。
|
|
119
|
+
- **任务域与判分定案(2026-10-27,方向重校)**:L2 的题目不自造——**观察用户真实任务蒸馏出考题**(task.md + 源材料 + 标准答案/rubric)。rubric 从"用户请求 + 被接受的结果"沉淀,harness2 的 judge 原样可用(`n_passed/n_criteria`、失败=None 不记 0、答案键锁后台防泄漏,proposer/selector 永远看不到)。**铁律:用户的原始任务只观察、永不重放**——真实任务带副作用("发邮件"重放就真发出去了);重放只跑蒸馏考题(沙盒内、可评分、无真实副作用)。纠正率/错误率是观察层找问题的输入,**不是判分器**。考题来源优先级:真实事故复现 > 用户纠正转化 > 合成变体。此前"缺探针任务集"的缺口由蒸馏器补上——真正的前置资产从"题库"变成"蒸馏器 + 质量线"。
|
|
108
120
|
|
|
109
121
|
执行隔离:本机用"穷人沙盒"——`mkdtemp` workspace + staging 渲染配置 + 重定向的 agent 配置 HOME + 一次性会话,**沙盒保证每次执行干净可复现,对比本身发生在冻结的产物上,不在沙盒里**。容器(本机有 OrbStack)后置,等探针要跑不可信代码或需并行 K 候选时再上。
|
|
110
122
|
|
|
@@ -154,23 +166,27 @@ harness2 的评分是**两段式且互相隔离**:选择(匿名对比、无 grou
|
|
|
154
166
|
| 穷人沙盒 | `substrate/codex.py:149-185` | probe workspace 边界 |
|
|
155
167
|
| 校验错误即 prompt(原样喂回作重试反馈) | `validate_tree` | editor 重试 |
|
|
156
168
|
|
|
157
|
-
|
|
169
|
+
**移植决定(2026-10-24 修订)**:无 PyPI 包、`harness2/__init__.py` 为空(无公开 API)意味着移植只能由我们做;但 `dependencies = []`(core 纯标准库)、无平台门控、Vertex 只是 spawn 子进程的环境变量,意味着 **core ≈5,650 行可整体直译为 TS**。Linux/Docker/benchmark 属评测资产侧,不移植;benchmarks 的对应物是自建探针任务集。~~移植方法论,不移植代码~~ → **移植引擎,再造宿主**。打包两阶段:阶段一内部包(不发 npm),阶段二等第二个消费者出现(与 agent-framework 整合是同一动作)。
|
|
158
170
|
|
|
159
171
|
## 已核实 / 未核实
|
|
160
172
|
|
|
161
173
|
| 已核实(读过代码或 spec;位置见 design.md Context) | 未核实 / 假设 |
|
|
162
174
|
|---|---|
|
|
163
|
-
| gateway 无常驻进程,client 断开即释放上游 |
|
|
164
|
-
| **所有工具调用(内建与上游)汇入同一咽喉点** `BuiltinRegistry.callTool
|
|
165
|
-
| `RuntimeContext` 只有 `{agentId, homeDir}
|
|
166
|
-
| 关闭路径只处理 stdin `end`/`close` 与 SIGTERM/SIGINT/SIGHUP;**SIGKILL/崩溃不触发 `close()
|
|
167
|
-
| `
|
|
168
|
-
|
|
|
175
|
+
| gateway 无常驻进程,client 断开即释放上游 | 全局记忆未启用时 lesson 回流的实际效果(本机记忆未开,`recordLesson` 报 `skipped` 而非 `failed`) |
|
|
176
|
+
| **所有工具调用(内建与上游)汇入同一咽喉点** `BuiltinRegistry.callTool`——事件总线已在此挂载(8.3) | 带外批准在 agent 有 shell 能力时的强度(TTY 检测只是启发式;`auto-A` 前必须再评估) |
|
|
177
|
+
| `RuntimeContext` 只有 `{agentId, homeDir}`,**无会话标识**——已由事件层生成,同进程一致(8.2/8.3) | L2 探针任务集来源与归属(真实事故复现 > 用户纠正转化 > 合成;canonical 还是 per-workspace 待决) |
|
|
178
|
+
| 关闭路径只处理 stdin `end`/`close` 与 SIGTERM/SIGINT/SIGHUP;**SIGKILL/崩溃不触发 `close()`**——下次启动补偿检查已实现(11.6) | `auto-A` 准入:需要多少次有人监督的运行才算"证明不误报" |
|
|
179
|
+
| 扩展加载机制与状态目录路径已定案并实现(8.1/8.6):清单 `~/.trellis/mcp/extensions.yaml` + `activate` 契约(阶段一:绝对路径/文件 URL),状态目录 `~/.trellis/evolve`;失败按 `manifest`/`invalid`/`import`/`activate` 阶段隔离,无清单零装载 | |
|
|
180
|
+
| 观察字段已定(9.4①):事件只含白名单元数据,载荷不入库,secrets 擦除后按进程分文件追加 | |
|
|
181
|
+
| skills/instructions provider 读取路径已核实(9.4②),结论入 design | |
|
|
182
|
+
| `TrellisProvider` 含 `close()` 与 skill 条目接口;host 门面已公开检查/备份会话/回滚/staging(8.5),SDK 根入口仍只导出只读面 | |
|
|
169
183
|
| harness2 各机制的行为(见上表) | |
|
|
184
|
+
| **发布配置(14.4)**:`packages/evolve-engine` 为 `private: true`、`version 0.0.0`、files 仅 `dist`+`NOTICE`;根 tarball `files` 不含 `packages/`,引擎只在 `devDependencies`,cli.ts 静态 import 链(112 文件)零触达引擎包——**阶段二启动条件未满足前不进任何 npm 发布配置**。注意差异:根 `prepublishOnly` 是 typecheck+build+test,**不含** `verify-pack`(独立 script,pack 真 tarball 装进无 devDependencies 的 scratch 冒烟) | |
|
|
170
185
|
|
|
171
186
|
## 已定倾向 / 待决
|
|
172
187
|
|
|
173
|
-
-
|
|
188
|
+
- **已定(2026-10-24)**:移植 harness2 引擎为 TS;打包两阶段(阶段一 `packages/evolve-engine/` 内部包、不发 npm,阶段二等第二个消费者、与 agent-framework 整合同一动作);prompt 模板原样保留英文(默认)。Class B 批准带外为主;后台作业由会话结束拉起而不靠外部调度器;先做 L1。
|
|
189
|
+
- **已定(同日,8.1/9.4)**:扩展加载机制(清单 + `activate` 契约,provider 与订阅者同面)与状态目录路径;观察元数据字段白名单(9.4①);provider 读取路径(9.4②)。
|
|
174
190
|
- **待决**:用户纠正的采集形态(手工 `note` vs 从会话收割);探针任务集放 canonical 还是 per-workspace;`auto-A` 之前需要多少次有人监督的运行才算"证明不误报";运行档案的轮转策略。
|
|
175
191
|
|
|
176
192
|
## 前置依赖
|
|
@@ -184,11 +200,12 @@ harness2 的评分是**两段式且互相隔离**:选择(匿名对比、无 grou
|
|
|
184
200
|
| 阶段 | 内容 | 状态 |
|
|
185
201
|
|---|---|---|
|
|
186
202
|
| P0 | doctor oracle、backup/rollback、memory 管道、agent-bridge 委派原语 | 已就位 |
|
|
187
|
-
| P1 |
|
|
188
|
-
| P2 |
|
|
189
|
-
| P3 |
|
|
190
|
-
| P4 |
|
|
191
|
-
| P5 | 递归预算(K 候选 parallel / K 步 sequential)、容器化 probe | |
|
|
203
|
+
| P1 | **引擎移植**(阶段一内部包:golden 基线 → 按依赖图 6 层移植 → 对照验收);托管扩展点 | 已完成(引擎 175/175;扩展点 8.1–8.7) |
|
|
204
|
+
| P2 | TrellisSubstrate 适配层 + Observe/触发:环境式接入,`off`/`observe` | 已完成(第 9–11 组;默认 `off`;生产接线见"生产接线"节) |
|
|
205
|
+
| P3 | `propose` 端到端:L4 治理(证据提案、L1 前闸、带外批准、单会话写入) | 已完成(第 12–14 组;fixture E2E + 真机冒烟) |
|
|
206
|
+
| P4 | `auto-A`;内容类 L2(依赖探针任务集);lesson 回流提质 | 未开始(`auto-A` 准入门槛待决) |
|
|
207
|
+
| P5 | 递归预算(K 候选 parallel / K 步 sequential)、容器化 probe | 未开始 |
|
|
208
|
+
| 阶段二 | 引擎提升公开 npm 包 = agent-framework 整合(同一动作) | 等第二个真实消费者;发布配置已确认不夹带(见上表) |
|
|
192
209
|
|
|
193
210
|
## 明确不做
|
|
194
211
|
|
|
@@ -197,13 +214,90 @@ harness2 的评分是**两段式且互相隔离**:选择(匿名对比、无 grou
|
|
|
197
214
|
- 绕过目标 agent 的审批 / 沙盒机制。
|
|
198
215
|
- 在没有现成 oracle 的类别上抢跑自动采纳(内容类必须等探针任务集)。
|
|
199
216
|
|
|
200
|
-
##
|
|
217
|
+
## 生产接线(2026-10-26 收口)
|
|
218
|
+
|
|
219
|
+
阶段一任务按各自验证标准通过后,14.4 核实时曾记录三处生产接线未连通,**已全部补齐并配测试**(宿主 1216/1216):
|
|
220
|
+
|
|
221
|
+
1. **`evolve enable|disable` 同步扩展清单**(design 8.1):级别升至 `observe` 及以上时向 `~/.trellis/mcp/extensions.yaml` 幂等写入条目(`id: evolve`,`load` 指向 `src/evolve/extension.ts` 的 activate 模块,dist/tsx 两种运行形态同款解析),置回 `off` 时移除;任一粒度(default/agent/workspace)仍有 observe+ 时条目保留(any-of 规则,细粒度闸在订阅者逐会话判定)。
|
|
222
|
+
2. **`activate(ctx)` 订阅者包装**(`src/evolve/extension.ts`):`off` 零订阅;`observe` 只挂 recorder(事件 → 信号,含 secrets 擦除与层归属);`propose`/`auto-A` 另挂触发器订阅者(会话结束判定拉起作业、会话启动补偿)。与真实清单 loader(`loadHostExtensions`)的结构契约兼容有集成测试。
|
|
223
|
+
3. **作业体治理流水(rule-based)**(`src/evolve/jobRun.ts`,`jobMain` 调用):可选源探测 → 信号合并(自上次作业结束)→ runChecks 发现 → rule-based 提案 → 机械校验 → L1 前闸 → 风险分类 → 采纳门(A 仅 auto-A 且闸通过自动采纳并通知)→ pending 呈现/自动采纳 → 应用阶段(全部已批准编辑同一备份会话 + 按 delivery 分类对原生渲染 agent 触发同步)→ lesson(记忆启用走记忆管道,否则只留档案)。fixture E2E 的同链流水现由生产入口承载。**口径澄清(review 纠偏)**:这是 rule-based 治理流水,不是引擎循环——移植引擎的 schedule/recursion/proposer/selection/judge golden 锚定但生产未经此消费,接入随 L2/探针任务集一并启动。
|
|
224
|
+
|
|
225
|
+
接线后仍要知晓的边界(如实记录,不是缺口):
|
|
226
|
+
|
|
227
|
+
- **editor/spawn 提案通道未接**:`runDelegatedCall` 就绪前作业只走 rule-based 兜底(design D7 的降级路径);harness2 引擎的 proposer spawn 面在引擎包内已移植并 golden 锚定,生产接入随 L2/探针任务集一并启动。
|
|
228
|
+
- **发现面=观察面**:作业只扫描信号层归属出现过、或级别策略声明过的 workspace;没进过观察面的 workspace 不会被发现(与"信号是观察记录"一致)。
|
|
229
|
+
- **批准即应用与降级边界**(trellis-evolve-review-fixes):`approve` 成功即在同一命令内经备份会话应用(单飞锁互斥;锁忙/失败时如实告知、提案保持 approved)。滞留的已批准提案经 `trellis evolve apply` 随时消化(显式管理面命令,执行用户已批准的决策,不属循环触发、不写信号),或由下次 propose+ 作业的应用阶段消费;`trellis evolve status` 显示 approved 未应用计数。
|
|
230
|
+
- **生效侧判定**:`triggerRenderSync` 只在存在原生渲染 agent 且本次有编辑被应用时触发一次;`isMemoryDeliveryEnabled` 按 memory MCP server 的显式配置(`staticEnv.MEMORY_FILE_PATH`)判定记忆管道开关。
|
|
231
|
+
- **agent 粒度只闸观察与触发**:提案产出按提案目标层粒度(workspace > default)判定——发现来自 doctor 检查面,不归属某个 agent 的行为;只设 `agents: {x: propose}` 时作业会被拉起但不产提案(spec 已就此澄清)。
|
|
232
|
+
- **agent 接口面 transport 后置**:`agentView.listPendingSummaries` 与 `reportUserCorrection` 函数与约束(只读、无批准能力、secrets 擦除)已交付并有测试,但本期不进 MCP/CLI/provider——真实会话中的 agent 尚无可达通道,接入随 editor/spawn 通道一并启动。
|
|
233
|
+
- **`secrets-policy-fix` 的 Class A 归属待 editor 通道接通时复审**:当前 rule-based 通道只产 workspace-toml 修复(恒 B),该规则不可达;接通 editor 通道前评估是否降为 B。
|
|
234
|
+
|
|
235
|
+
## 可视化(2026-10-27,trellis-evolve-visualization)
|
|
236
|
+
|
|
237
|
+
进化过程对用户可见的三段呈现(只读消费,查看零副作用):
|
|
238
|
+
|
|
239
|
+
- **数据出口**:`trellis evolve report [--json]` 与 `status --json` —— 单一聚合函数 `src/evolve/reportView.ts`(`buildEvolveReport`)从档案/pending/级别策略计算,CLI 文本、JSON、GUI 三副渲染壳同源,不维护第二份计算。
|
|
240
|
+
- **GUI 仪表盘**(`packages/gui` Evolution 页):趋势(真实测量,含口径)、优化内容卡(前后 finding 差集 + 编辑清单)、提案时间线(发现→提案→verdict→决策→应用→lesson 全链,含备份会话回滚入口)。
|
|
241
|
+
- **指标诚实性原则**(spec 约束):只展示可从档案重算的真实测量(累计发现解决数、采纳率/拒绝率、作业运行/失败次数);**不合成数值评分**,分数轴等 L2 探针任务集落地后另起变更。空态/未开启是一等状态,不画误导性的空图。
|
|
242
|
+
|
|
243
|
+
## 审查修复轮(2026-10-26,子 Agent 四路审查后)
|
|
201
244
|
|
|
202
|
-
|
|
245
|
+
阶段一收口后做了一轮四路只读审查(spec 符合性/正确性/安全/测试覆盖),随后修复:
|
|
203
246
|
|
|
204
|
-
|
|
247
|
+
- **崩溃循环链**:spawn 失败收容(`error` 监听,pid 缺失记 `spawn-failed` 而非假 launch);作业体抛错也落 job-run 档案(endedAtMs 推进冷却,error 留审计,不再无限重拉);apply 部分失败落 failed 标记档案且 `remove-symlink` 幂等重放。
|
|
248
|
+
- **信号水位线**:job-run 档案记"信号合并时刻"(signalsMergedAtMs),触发计数与作业合并以它为界——作业运行期间到达的信号不再永久丢失。
|
|
249
|
+
- **staging 凭据排除**:`.trellis` 复制剔除 `mcp/oauth`、`backups`、`evolve`(`TRELLIS_STAGING_EXCLUDES`),凭据不离开真实 home。
|
|
250
|
+
- **纵深防御**:应用阶段对每条 approved 记录重跑机械校验(`validateProposal`),pending 磁盘漂移/伪造编辑到不了写入面;死锁清理改 compare-and-delete。
|
|
251
|
+
- **写路径加固**:`evolve.yaml`/`extensions.yaml`/pending 记录全部原子写(tmp+rename);进化状态目录 0700、信号/档案/pending 文件 0600;`extensions` 键非数组硬抛而非静默吞;`enable` 建状态目录骨架并在 dotfiles 仓库场景把 `evolve/` 加入 .gitignore。
|
|
252
|
+
- **自治升级门**:`enable --level propose|auto-A` 与 approve 同级 TTY 闸门(非交互 agent 会话不得自行提升自治级别);`disable` 不再接受 `--level`,存在非 off 覆盖时明确提示仍生效。
|
|
253
|
+
- **spec 措辞对齐**:触发判定去掉"严重度"(本期按计数);补充 agent 粒度语义;`trellis evolve status` 展示最近自动采纳通知(原只落档案)。
|
|
254
|
+
|
|
255
|
+
## 手动触发与历史回填(2026-10-27,trellis-evolve-run-backfill)
|
|
256
|
+
|
|
257
|
+
两个真实入口补齐(动机:手动立刻跑一次;开启之前的会话是宝贵财富):
|
|
258
|
+
|
|
259
|
+
- **手动触发 `trellis evolve run [--dry-run]`**(唯一命令行触发入口):门语义 = 阈值/冷却豁免(用户明确意图),**单飞锁与预算护栏照旧**(日提案上限/editor 预算超限仍跳过并记因,不排队);observe 及以下作业体零副作用早退并说明级别与调整方法;`--dry-run` 只预览(将消费信号数/护栏判定),不拉起、不写入。前台跑与事件触发同一作业壳(`runJobShell`),job-run 档案记触发来源 `manual`。
|
|
260
|
+
- **补跑语义(单槽 coalesce,不是队列)**:运行期间到达的触发请求(手动或事件)塌缩为至多一个 `evolve/run-request.json` 标记(count 仅审计);任何作业启动即清标记(请求已被满足),作业收尾释锁后消费标记并链起至多一次补跑(`trigger: chain`,同受预算护栏,skip 照记因)。崩溃残留的标记由下次作业启动清掉(至多多跑一次,提案去重兜底),丢失至多一次请求(下次事件/手动自然补)。全程无常驻进程,系统保持 daemon-less。
|
|
261
|
+
- **历史回填 `trellis evolve import <path>... [--workspace <root>]`**:导入边界 = 仅显式选定路径、对源只读;按观察信号同一字段白名单抽元数据(时间戳/agent/会话/工具名/耗时/结果类别,入参与正文一律不入库),字符串写入前一律 secrets 擦除;台账幂等(`evolve/imports/<sha256>.json`,重复导入为空操作);stableId `import:<digest12>:<行号>` 确定性,重复消费不产生重复提案;整批先校验后写入(任何源不可解析即零写入收口);导入不触发作业,信号待后续作业按水位线消费。适配器契约 `{ sniff, extract }` 先行,首个适配器 `claude-code-jsonl`(Kimi/Codex/ZCode 源后置)。
|
|
262
|
+
|
|
263
|
+
## 方向定案(2026-10-27,任务域重校)
|
|
264
|
+
|
|
265
|
+
实现走线曾把"配置体检(L1)"当成了主循环驱动——观察配置、以 finding 消除为效果判据,引擎内核被搁置旁路。经对照 harness2 源意图复核,确认这是结构性偏差:**主循环的驱动信号是任务,不是配置体检**;L1 的位置是 `validate_tree`(施工合法性硬闸),不是 `score`(效果判据)。定案后完整管线:
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
观察层(只读,永不执行用户的活) 用户用 claude/codex/pi 真实干的任务 → 任务分析(要什么/哪里不顺/结果)
|
|
269
|
+
↓ 蒸馏(适配层核心新部件)
|
|
270
|
+
考题库(任务域) task.md + 源材料 + 标准答案/rubric(从被接受的结果沉淀)+ 可安全重跑
|
|
271
|
+
↓ 以下与 harness2 逐字一致,引擎零改动
|
|
272
|
+
harness2 循环 base rollouts → 提案 → 候选跑考题 → 盲选 → judge 对 rubric 打分 → 经验库
|
|
273
|
+
↓ 采纳
|
|
274
|
+
应用安全壳(宿主职责) 人批 B 类 + 备份会话写回配置 + 一步回滚
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
| 部件 | 状态 |
|
|
278
|
+
|---|---|
|
|
279
|
+
| 任务来源 | **变**:题库作者 → 从真实任务观察蒸馏 |
|
|
280
|
+
| 真实任务的执行 | **永不重放**(副作用铁律);只被动观察 |
|
|
281
|
+
| 考题(task+源材料+rubric) | **不变**——蒸馏出的考题就是 harness2 意义上的 benchmark 题 |
|
|
282
|
+
| 提案/递归重试/validate_tree | **不变** |
|
|
283
|
+
| 盲选/KEEP_BASE/judge/None≠0 | **不变** |
|
|
284
|
+
| 经验库/账本/防泄漏 | **不变**(蒸馏 rubric 同为答案键,防泄漏纪律原样适用) |
|
|
285
|
+
| 应用安全壳(人批/备份/回滚) | **保留**(写真实配置是引擎外的宿主职责) |
|
|
286
|
+
| L1 配置体检 | 降级为 `validate_tree` 级施工检查,永不当效果分 |
|
|
287
|
+
|
|
288
|
+
**考题六要素**(2026-10-27 补):`task.md`(只描述工作、不描述度量——harness2 禁词规则照搬)+ 源材料(脱敏、最小化)+ 参考交付物(用户被接受的结果)+ rubric(二值判据集,形态参照 harness2 LAB;**含过程判据**——少纠错/少报错/不越权类,如"发送前有确认""未执行破坏性命令")+ 副作用声明(重放时必须 mock 的动作:"发邮件"变"写邮件")+ 过程注记(蒸馏自真实过程的错误点/纠正点/绕路点)。无明确接受结果的任务(用户中途放弃)不产考题,产观察教训。
|
|
289
|
+
|
|
290
|
+
**过程数据三层保留**(同日补):① 真实任务过程**原地保留**(用户机器上的会话文件不搬不动),蒸馏时只提炼过程注记;② 验证 rollout 的过程按 harness2 同款**完整轨迹**保留(证据文件、不截断)——"改动能指认到具体轨迹时刻,指认不出即投机";③ 过程质量进 rubric 成为可判分判据(判据里没有的,循环不会优化它)。
|
|
291
|
+
|
|
292
|
+
**细节裁决(2026-10-27,四项已定)**:
|
|
293
|
+
① **考题库归属 = per-workspace**:每个 workspace 的配置不同,优化对象常是 workspace 配置而非全局;通用题晋升 canonical 用**自动保守规则**(同一题跨 ≥2 个 workspace 复现才晋升),不设人工审核。
|
|
294
|
+
② **蒸馏质量线 = 全自动质检,不设人工过目**(减少人工参与):自动闸 = 可重跑性 / rubric 二值可判 / 脱敏扫描 / 禁词扫描 / 副作用声明完备。错误考题的爆炸半径两层兜底——沙盒隔离(烧的只是预算)+ 应用前 B 类人批(坏改动到不了真配置)。人工点收敛到只剩 B 类批准一个**决策**(auto-A 成熟后再减)。
|
|
295
|
+
③ **隐私边界 = 保结构去内容 + 工具调用永不重放**:观察侧只蒸馏工具调用元数据(白名单字段)与过程注记,原会话原地不动;验证侧重放**考题**而非原任务,副作用工具按副作用声明生成 mock 表(发邮件→mock outbox、部署/删除/外呼 API 一律 mock、出网默认封锁),安全工具沙盒内正常执行;过程判据(少纠错/少报错/不越权)作用于**新轨迹**,不重放原过程。"证据是数据不是指令"防注入照挂。
|
|
296
|
+
④ **预算与模型均可配置**:`evolve.yaml` 增执行配置段——单轮沙盒会话上限、USD 上限、proposer/executor/judge 三角色模型各自可配(缺省保守:≤8 会话/轮);账本恒等式照 harness2 硬约束;花钱动作只由手动触发/人批准时机执行(事件触发只做观察+蒸馏,零花费)。
|
|
297
|
+
|
|
298
|
+
## 下一步
|
|
205
299
|
|
|
206
|
-
1.
|
|
207
|
-
2.
|
|
208
|
-
3.
|
|
209
|
-
4.
|
|
300
|
+
1. **OpenSpec 提案**:任务域接入变更(蒸馏层 + harness2 式考题循环 + substrate 执行/mock 层),四项细节裁决见"方向定案"节;同步精读 harness2 自带 benchmark 适配实现作 Trellis 适配参照(源 checkout 只读、保持原样)。
|
|
301
|
+
2. **`auto-A` 准入评估**:带外批准强度(见 design Risks)、需要多少次有人监督的运行才算"证明不误报"(待决);此后才谈真实开启 `auto-A`。
|
|
302
|
+
3. **lesson 回流提质**(全局记忆启用后才有真实载体)、editor/spawn 提案通道接入(等 `runDelegatedCall`)。
|
|
303
|
+
4. **阶段二**:引擎提升公开 npm 包 = agent-framework 整合(同一动作),等第二个真实消费者;递归预算、容器化 probe 为后续独立变更。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-trellis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "A unified Code Agent Runtime for Skills, MCP, Memory, and shared instructions across Claude Code, Codex, Kiro, pi, Kimi Code, and ZCode.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Paul Leo",
|
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
"types": "./dist/sdk.d.ts",
|
|
19
19
|
"import": "./dist/sdk.js"
|
|
20
20
|
},
|
|
21
|
-
"./package.json": "./package.json"
|
|
21
|
+
"./package.json": "./package.json",
|
|
22
|
+
"./host": {
|
|
23
|
+
"types": "./dist/host/index.d.ts",
|
|
24
|
+
"import": "./dist/host/index.js"
|
|
25
|
+
}
|
|
22
26
|
},
|
|
23
27
|
"files": [
|
|
24
28
|
"dist",
|
|
@@ -53,6 +57,7 @@
|
|
|
53
57
|
"agents.md"
|
|
54
58
|
],
|
|
55
59
|
"devDependencies": {
|
|
60
|
+
"@trellis/evolve-engine": "*",
|
|
56
61
|
"@types/node": "^22.0.0",
|
|
57
62
|
"esbuild": "^0.28.2",
|
|
58
63
|
"tsx": "^4.19.0",
|
|
@@ -64,6 +69,7 @@
|
|
|
64
69
|
"@modelcontextprotocol/client": "^2.3.1",
|
|
65
70
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
66
71
|
"@modelcontextprotocol/server": "^2.3.1",
|
|
72
|
+
"@morphixai/mxenv-core": "^0.12.2",
|
|
67
73
|
"smol-toml": "^1.9.1",
|
|
68
74
|
"yaml": "^2.9.1",
|
|
69
75
|
"zod": "^4.6.5"
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
# whose own native MCP client resolves `${VAR}` in its own process), so it
|
|
13
13
|
# already has to read a value into memory to hand to that subprocess.
|
|
14
14
|
#
|
|
15
|
+
# Prefer `mxenv://<profile>/<KEY>` references in servers.yaml `env` /
|
|
16
|
+
# `envAliases` entries where possible: they resolve from the encrypted
|
|
17
|
+
# mxenv store at consumption time and need neither ambient env nor a
|
|
18
|
+
# plaintext env_file (mx-env-secret-source).
|
|
19
|
+
#
|
|
15
20
|
# env_file (optional) narrows *where* the bridge reads those values from —
|
|
16
21
|
# a dotenv-format file (KEY=VALUE per line, no quoting/interpolation), never
|
|
17
22
|
# merged with ambient process env once set: a name absent from it resolves
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
# .trellis/mcp/servers.yaml — canonical MCP server definitions.
|
|
2
2
|
#
|
|
3
3
|
# Rules (see docs/architecture.md and docs/research.md §"Secrets"):
|
|
4
|
-
# - `env` values are variable NAMES only
|
|
4
|
+
# - `env` values are variable NAMES only, or `mxenv://<profile>/<KEY>`
|
|
5
|
+
# references resolved from the mxenv store at consumption time and
|
|
6
|
+
# delivered under the `KEY` segment (mx-env-secret-source). A
|
|
7
|
+
# reference gives this file value-free, machine-independent
|
|
8
|
+
# provenance; prefer it over relying on ambient process env.
|
|
5
9
|
# - Real values come from whatever already populates process env
|
|
6
10
|
# (a plain `.env`-style file, 1Password's `op run`, etc.) — Trellis
|
|
7
11
|
# does not store or transport secret values itself.
|