Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .codex/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ project_doc_fallback_filenames = ["AGENTS.md"]
# [agents].max_threads (codex will reject the combination).
# `enabled = true` is required inside the table — the table form does
# NOT auto-enable the feature without it.
# - max_concurrent_threads_per_session: bumps default 4 → 6.
# - min_wait_timeout_ms: 480000 ms = 8 min. Codex default is 10 s, too
# short for Trellis subagents that routinely take 2-10 min. Hard
# ceiling is 3,600,000 (1 h).
# - max_concurrent_threads_per_session: keeps at most three bounded workers.
# - min/default wait timeout: 120000 ms = 2 min. Codex requires the default
# to be greater than or equal to the configured minimum.
[features.multi_agent_v2]
enabled = false
max_concurrent_threads_per_session = 6
min_wait_timeout_ms = 480000
max_concurrent_threads_per_session = 3
min_wait_timeout_ms = 120000
default_wait_timeout_ms = 120000
127 changes: 118 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,35 @@ jobs:

package-smoke:
needs: verify
runs-on: ubuntu-latest
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22, 24]
name: Package smoke (Node.js ${{ matrix.node-version }})
include:
- os: ubuntu-latest
node-version: 18
- os: ubuntu-latest
node-version: 20
- os: ubuntu-latest
node-version: 22
- os: ubuntu-latest
node-version: 24
- os: macos-latest
node-version: 24
- os: windows-latest
node-version: 24
name: Package/project smoke (${{ matrix.os }}, Node.js ${{ matrix.node-version }})
steps:
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}

- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.11"

- name: Download package artifacts
uses: actions/download-artifact@v8
with:
Expand All @@ -74,14 +91,13 @@ jobs:
run: |
smoke_dir="${RUNNER_TEMP}/package-smoke"
mkdir "${smoke_dir}"
mapfile -t tarballs < <(find "${RUNNER_TEMP}/package-artifacts" -type f -name '*.tgz' -print)
if [ "${#tarballs[@]}" -ne 2 ]; then
echo "Expected exactly two package tarballs, found ${#tarballs[@]}" >&2
exit 1
fi
core_tarball="$(find "${RUNNER_TEMP}/package-artifacts" -type f -name 'research-trellis-core-*.tgz' -print -quit)"
cli_tarball="$(find "${RUNNER_TEMP}/package-artifacts" -type f -name 'research-trellis-*.tgz' ! -name 'research-trellis-core-*.tgz' -print -quit)"
test -n "${core_tarball}"
test -n "${cli_tarball}"

cd "${smoke_dir}"
npm install --ignore-scripts "${tarballs[@]}"
npm install --ignore-scripts "${core_tarball}" "${cli_tarball}"

expected_version="$(node -p "require('./node_modules/research-trellis/package.json').version")"
core_version="$(node -p "require('./node_modules/research-trellis-core/package.json').version")"
Expand Down Expand Up @@ -140,3 +156,96 @@ jobs:
];
await Promise.all(specifiers.map((specifier) => import(specifier)));
NODE

project_dir="${RUNNER_TEMP}/research-trellis-project-${{ matrix.node-version }}"
mkdir "${project_dir}"
cd "${project_dir}"
"${smoke_dir}/node_modules/.bin/research-trellis" init -y -u ci --codex --no-monorepo

node --input-type=module <<'NODE'
import fs from "node:fs";

const configPath = ".codex/config.toml";
let config = fs.readFileSync(configPath, "utf8");
const minimum = Number(config.match(/min_wait_timeout_ms\s*=\s*(\d+)/)?.[1]);
const defaultWait = Number(config.match(/default_wait_timeout_ms\s*=\s*(\d+)/)?.[1]);
if (!(minimum > 0 && defaultWait >= minimum)) {
throw new Error(`Invalid Codex wait defaults: min=${minimum}, default=${defaultWait}`);
}
if (config.includes("[hermes.context_firewall]")) {
throw new Error("Generated Codex config contains an unsupported Hermes table");
}

for (const marker of [
"# TRELLIS:CODEX_CONFIG:START\n",
"\n# TRELLIS:CODEX_CONFIG:END",
"# TRELLIS:CODEX_MODEL_DEFAULTS:START\n",
"\n# TRELLIS:CODEX_MODEL_DEFAULTS:END",
"# TRELLIS:CODEX_TABLES:START\n",
"\n# TRELLIS:CODEX_TABLES:END",
]) {
config = config.replace(marker, "");
}
config = config
.replace("model = \"gpt-5.6-sol\"", "model = \"gpt-5.6-custom\"")
.replace(
"model_reasoning_effort = \"high\"",
"model_reasoning_effort = \"medium\"",
)
.replace("min_wait_timeout_ms = 120000", "min_wait_timeout_ms = 480000")
.replace("default_wait_timeout_ms = 120000\n", "");
config += '\n[hermes.context_firewall]\nnative_authority = "protocol"\n';
fs.writeFileSync(configPath, config);
fs.writeFileSync(".trellis/.version", "0.7.1-beta.0");
NODE

"${smoke_dir}/node_modules/.bin/research-trellis" update < /dev/null

node --input-type=module <<'NODE'
import fs from "node:fs";
import { spawnSync } from "node:child_process";

const config = fs.readFileSync(".codex/config.toml", "utf8");
if (
!config.includes('model = "gpt-5.6-custom"') ||
!config.includes('model_reasoning_effort = "medium"')
) {
throw new Error("Legacy custom Codex model settings were not preserved");
}
if (!config.includes("min_wait_timeout_ms = 480000")) {
throw new Error("Legacy minimum wait was not preserved");
}
if (!config.includes("default_wait_timeout_ms = 480000")) {
throw new Error("Legacy default wait was not repaired");
}
if (config.includes("[hermes.context_firewall]")) {
throw new Error("Legacy unsupported Hermes table was not removed");
}

const hooks = JSON.parse(fs.readFileSync(".codex/hooks.json", "utf8"));
const commands = [];
const visit = (value) => {
if (Array.isArray(value)) return value.forEach(visit);
if (!value || typeof value !== "object") return;
if (typeof value.command === "string") commands.push(value.command);
Object.values(value).forEach(visit);
};
visit(hooks);
const command = commands.find((item) =>
item.includes("inject-workflow-state.py"),
);
if (!command) throw new Error("Codex workflow hook command is missing");
const [executable, ...args] = command.split(" ");
const hook = spawnSync(executable, args, {
cwd: process.cwd(),
input: "{}\n",
encoding: "utf8",
});
if (hook.status !== 0) {
throw new Error(`Codex workflow hook failed: ${hook.stderr}`);
}
NODE

if [ "${{ matrix.os }}" = "ubuntu-latest" ] && [ "${{ matrix.node-version }}" = "24" ]; then
npx --yes @openai/codex@0.145.0 --version >/dev/null
fi
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ node packages/cli/scripts/release-preflight.js verify-packed-cli
新包发布后,可固定安装本次测试版:

```bash
npm install -g research-trellis@0.7.1-beta.2
npm install -g research-trellis@0.7.1-beta.3
research-trellis --version
```

Expand All @@ -108,7 +108,7 @@ research-trellis --version

```bash
npm uninstall -g trellis-hermes
npm install -g research-trellis@0.7.1-beta.2
npm install -g research-trellis@0.7.1-beta.3
research-trellis --version
```

Expand Down Expand Up @@ -204,7 +204,7 @@ node /path/to/research-trellis/packages/cli/bin/trellis.js update

### 7. Agent Context Firewall

每次正式角色派发先生成绑定 `hermes_revision`(Hermes 修订号)的结构化文件,正文最多 2000 字符、引用最多 3 个。`Claude Code`(Claude 代码工具)钩子只接收 `job_id`(工作编号)并替换长提示;`Codex`(代码代理平台)使用同一份紧凑派发和结果契约,在当前项目工作区协作。
每次正式角色派发先生成绑定 `plan_revision`(计划修订号)的结构化文件,并记录创建时的 `state_revision`(状态修订号)。只有计划实际变化才会让旧派发过期,并行结果登记不会互相失效。目标正文最多 2000 字符、引用最多 3 个。`Claude Code`(Claude 代码工具)钩子只接收 `job_id`(工作编号)并替换长提示;`Codex`(代码代理平台)使用同一份紧凑派发和结果契约,在当前项目工作区协作。

返回必须包含 `uncertainties`(不确定项),长日志、完整差异和搜索过程不会进入主上下文。原始跟踪保存在 `.trellis/.runtime/`(本地运行目录),成功或失败都会机械更新下一动作,但不会仅凭聊天关闭任务。

Expand Down
4 changes: 2 additions & 2 deletions docs/manual/01-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
## 前置条件

- 能管理目标项目中的文件和提交。
- 接受当前版本为 `0.7.1-beta.2`(测试版)。
- 接受当前版本为 `0.7.1-beta.3`(测试版)。
- 不把它当作安全隔离工具或自动科研结论系统。

## 操作步骤
Expand Down Expand Up @@ -45,7 +45,7 @@
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "AGPL|Hermes|未实现" README.md docs/manual/appendix-f-feature-status.md`(静态核对)。
- 结果:项目定位、上游归属、实验性与未实现边界已对齐。
Expand Down
12 changes: 6 additions & 6 deletions docs/manual/02-installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,22 @@ git --version
新包发布后,推荐固定安装本手册对应的测试版:

```bash
npm install --global research-trellis@0.7.1-beta.2
npm install --global research-trellis@0.7.1-beta.3
research-trellis --version
research-trellis --help
```

如不希望全局安装,可临时执行:

```bash
npm exec --yes --package research-trellis@0.7.1-beta.2 -- research-trellis --version
npm exec --yes --package research-trellis@0.7.1-beta.3 -- research-trellis --version
```

已经安装旧包时,先卸载旧名称,再安装新包:

```bash
npm uninstall --global trellis-hermes
npm install --global research-trellis@0.7.1-beta.2
npm install --global research-trellis@0.7.1-beta.3
research-trellis --version
```

Expand All @@ -62,7 +62,7 @@ node packages/cli/bin/trellis.js --version

## 预期结果

版本命令输出 `0.7.1-beta.2`,帮助中能看到 `init`(初始化)、`update`(更新)、`workflow`(工作流)、`channel`(协作频道)和 `mem`(会话记忆)等命令。
版本命令输出 `0.7.1-beta.3`,帮助中能看到 `init`(初始化)、`update`(更新)、`workflow`(工作流)、`channel`(协作频道)和 `mem`(会话记忆)等命令。

## 失败恢复

Expand All @@ -74,10 +74,10 @@ node packages/cli/bin/trellis.js --version
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`node -p "require('./packages/cli/package.json').version"`(包版本核对)。
- 结果:源码包版本为 `0.7.1-beta.2`(测试版),运行时要求与包配置一致。
- 结果:源码包版本为 `0.7.1-beta.3`(测试版),运行时要求与包配置一致。
- 未验证项:本轮未重新进行全局安装,也未实时查询 `npm`(Node 包平台)标签。

## 来源
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/03-first-research-task.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ python3 ./.trellis/scripts/closure.py close --task "$TASK"
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "experiment.py|task.py start|--codex" packages/cli/src packages/cli/test`(实现与测试核对)。
- 结果:初始化、任务创建、实验校验和启动步骤与当前入口一致。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/04-how-it-works.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "state_machine|approval-gate|task.py" packages/cli/src/templates`(协议与实现核对)。
- 结果:任务生命周期有实现支持;科研状态文件已准确标为协议模板。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/05-project-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ python3 ./.trellis/scripts/task.py list
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "options.yes|registry|selectedTemplate" packages/cli/src/commands/init.ts packages/cli/test/commands/init.integration.test.ts`(分支核对)。
- 结果:默认、交互、指定模板、自定义源和 `-y`(自动确认)的失败行为已分开记录。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/06-tasks-and-planning.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ python3 ./.trellis/scripts/closure.py grill --task "$TASK" --complete \
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "plan_change|decision_state|supersedes" packages/cli/src/templates/trellis/scripts/hermes packages/cli/test/templates/hermes-runtime.test.ts`(变更协议核对)。
- 结果:提出、审阅、接受或拒绝、替代和校验流程已补全,并明示了结构校验边界。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/07-spec-and-context.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ python3 ./.trellis/scripts/task.py validate "$TASK"
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "implement.jsonl|check.jsonl|context" packages/cli/src/templates/trellis/scripts packages/cli/test`(上下文实现核对)。
- 结果:上下文清单、重复检查和平台读取路径与当前模板一致。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/08-hermes-records.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ python3 ./.trellis/scripts/hermes/validate.py --task "$TASK" --kind evidence
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n "validate_artifact_file|artifact_ref_errors|has_symlink_component" packages/cli/src/templates/trellis/scripts/hermes/runtime.py`(路径与引用边界核对)。
- 结果:示例已改为先创建产物和摘要,再写产物与证据账本;路径检查范围已明示。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/09-experiments.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ python3 ./.trellis/scripts/hermes/experiment.py validate --task "$TASK"
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n -m 1 "allowed_commands" packages/cli/src/templates/trellis/scripts/hermes packages/cli/test/templates/hermes-runtime.test.ts`(实现与测试核对)。
- 结果:命令允许列表和本地运行记录均可定位。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/10-runs-and-replay.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ python3 ./.trellis/scripts/hermes/runner.py replay --task "$TASK" --run-id "$RUN
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n -m 1 "run_manifest|replay" packages/cli/src/templates/trellis/scripts/hermes packages/cli/test/templates/hermes-runtime.test.ts`(运行清单与复查核对)。
- 结果:运行清单、输出摘要和复查失败分支均有实现与测试依据。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/11-metrics-and-comparison.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ python3 ./.trellis/scripts/hermes/report.py quality-gate --task "$TASK"
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n -m 1 "quality-gate|evidence_refs|claim_refs" packages/cli/src/templates/trellis/scripts/hermes packages/cli/test/templates/hermes-runtime.test.ts`(门禁和引用核对)。
- 结果:质量门禁已有账本编号存在性检查以及有效、缺失引用测试。
Expand Down
2 changes: 1 addition & 1 deletion docs/manual/12-reports-and-claims.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ python3 ./.trellis/scripts/hermes/report.py approval-gate --task "$TASK" --claim
## 验证记录

- 日期:2026-07-15。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n -m 1 "claim-review|approval-gate" packages/cli/src/templates/trellis/scripts/hermes packages/cli/test/templates/hermes-runtime.test.ts`(主张与审批边界核对)。
- 结果:主张审查和审批门禁入口可定位,报告与人工批准保持分离。
Expand Down
6 changes: 4 additions & 2 deletions docs/manual/13-workers-and-gates.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ profile: evidence

### 派发与结果防火墙

1. 每次派发先创建 dispatch(派发)。命令会绑定当前 `hermes_revision`(Hermes 修订号),并同时写入兼容的 `task_card`(任务卡)。`coder`(编码代理)和 `runner`(运行代理)必须绑定当前工作包。测试、构建或代码验证 runner 必须用 `parent_job_id`(父工作编号)绑定被检查的 coder;独立实验 runner 可以不绑定。`reviewer:quality/evidence/claim/statistics`(质量、证据、主张或统计复核)也必须绑定被审查的具体工作;`reviewer:closure/safety`(关闭或独立安全复核)可以保持任务级。
1. 每次派发先创建 dispatch(派发)。命令会绑定 `plan_revision`(计划修订号)和创建时的 `state_revision`(状态修订号),并同时写入兼容的 `task_card`(任务卡)。只有计划实际变化才会让旧派发过期;兄弟派发登记结果只增加状态修订号,不会互相失效。`coder`(编码代理)和 `runner`(运行代理)必须绑定当前工作包。测试、构建或代码验证 runner 必须用 `parent_job_id`(父工作编号)绑定被检查的 coder;独立实验 runner 可以不绑定。`reviewer:quality/evidence/claim/statistics`(质量、证据、主张或统计复核)也必须绑定被审查的具体工作;`reviewer:closure/safety`(关闭或独立安全复核)可以保持任务级。

任务关闭后拒绝全部派发。任务阻塞或计划漂移时,正式编码、运行和审查会停止,但仍允许范围受限的 `planner`(规划诊断)和 `researcher`(资料研究)派发,用于找出恢复条件;它们不能借此修改任务状态或继续正式实施。

```bash
JOB="job-$(date -u +%Y%m%d-%H%M%S)-coder"
Expand Down Expand Up @@ -179,7 +181,7 @@ python3 ./.trellis/scripts/hermes/evidence.py summary --task "$TASK"
## 验证记录

- 日期:2026-07-16。
- 版本:`0.7.1-beta.2`(测试版)。
- 版本:`0.7.1-beta.3`(测试版)。
- 更名前基准提交:`9f7dc8497b4782878d6fa7ac3b63eba5bde507df`。
- 命令:`rg -n -m 1 "PreToolUse|Stop" packages/cli/src/templates/{claude,codex,shared-hooks} packages/cli/test`(钩子与门禁核对)。
- 结果:五个正式角色、模式校验、旧角色迁移、两平台模板、最小上下文、证据工具和模式感知门禁均有自动化覆盖。
Expand Down
Loading