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
27 changes: 12 additions & 15 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ jobs:
node-version: "22.22.3"

- name: Qualify the TypeScript Effect core
env:
LOOPX_TEST_REQUIRE_SQLITE_QUALIFIED: "1"
run: |
npm ci --ignore-scripts
npm run typecheck:control-plane
Expand Down Expand Up @@ -213,31 +215,26 @@ jobs:
needs: changes
if: needs.changes.outputs.core_tests == 'true'
runs-on: ubuntu-latest
# The full public-minimum suite has reached fifteen minutes on hosted runners.
# Keep a bounded margin above the measured workload without weakening coverage.
timeout-minutes: 20
# The full suite runs under this exact Node version in kernel-static-checks.
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v6
with:
node-version: "22.18.0"
node-version: "22.22.3"
cache: npm
cache-dependency-path: package-lock.json
- name: Qualify the public minimum Node.js runtime
env:
LOOPX_TEST_REQUIRE_SQLITE_QUALIFIED: "1"
run: |
npm ci --ignore-scripts
npm run typecheck:control-plane
# Default File/control-plane compatibility stays on the public minimum.
# SQLite requires a WAL-fixed embedded driver; its admission rejection
# runs here, while full SQLite suites run on the qualified runtime.
tests=()
for test in tests/control_plane_ts/*.test.ts; do
case "$test" in
*/sqlite_authority_store.test.ts|*/sqlite_authority_bounded_profile.test.ts|*/sqlite_authority_migration.test.ts|*/local_authority_provider.test.ts|*/authority_provider_parity.test.ts|*/sqlite_capacity.test.ts) continue ;;
esac
tests+=("$test")
done
node --no-warnings --experimental-sqlite --experimental-strip-types --test "${tests[@]}"
# Prove the minimum itself admits SQLite and executes both provider
# lifecycle rows. The qualified core lane runs the complete suite.
node --no-warnings --experimental-sqlite --experimental-strip-types --test \
tests/control_plane_ts/sqlite_runtime_admission.test.ts \
tests/control_plane_ts/deferred_hard_lease_lifecycle.test.ts

node-forward-compatibility:
needs: changes
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ More inspectable surfaces:

## Try LoopX

Requirements: Python 3.11+ and Node.js 22.18.0+; Node.js 24 LTS is recommended.
Requirements: Python 3.11+ and Node.js 22.22.3+; Node.js 24 LTS is recommended.
Use an active Python environment whose console scripts are on `PATH`; macOS and
Linux use a POSIX shell, while native Windows uses PowerShell 7. Node.js runs
the managed, idle-exiting TypeScript Effect core; LoopX starts it automatically.
Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ SWE-Marathon 与 LHTB 每个任务、每种模式仅保留一条有效轨迹;D

## 试用 LoopX

要求:Python 3.11+ 与 Node.js 22.18.0+,推荐使用 Node.js 24 LTS。使用 console
要求:Python 3.11+ 与 Node.js 22.22.3+,推荐使用 Node.js 24 LTS。使用 console
scripts 已加入 `PATH` 的 Python 环境;macOS 和 Linux 使用 POSIX shell,原生
Windows 使用 PowerShell 7。Node.js 运行 LoopX 自动启动、空闲退出的 TypeScript
Effect core,无需手工维护 daemon。Git 仅用于源码贡献与 clone/canary 工作流。
Expand Down
2 changes: 1 addition & 1 deletion benchmark/LHTB/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ owning a second copy. It does not use the app-server heartbeat agent.
## Run

Prerequisites are an LHTB checkout with its Harbor virtual environment, Docker,
the native Codex bundle, a portable Python 3.11+ tree, and Node 22.18.0+. Copy
the native Codex bundle, a portable Python 3.11+ tree, and Node 22.22.3+. Copy
`.env.example` to `.env`, set `LHTB_ROOT`, the model gateway, and local runtime
paths, then run from this directory.

Expand Down
2 changes: 1 addition & 1 deletion benchmark/runtime/RUNTIME.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}"

Also set `CODEX_OFFLINE_DIR` (Codex, code-mode sidecar, rg),
`LOOPX_PORTABLE_PYTHON` (Python >=3.11 distribution) and `LOOPX_NODE_DIR`
(Node >=22.18.0 distribution). Staging archives the verified commit SHA, never local run
(Node >=22.22.3 distribution). Staging archives the verified commit SHA, never local run
artifacts. The host import must come from that checkout, whose tracked files
must match HEAD. Commit the candidate before real validation. Baselines stage only
the runner/native transport, without installing LoopX skills or initializing
Expand Down
2 changes: 1 addition & 1 deletion demo/workspace/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Explore three connected projects in the real LoopX Personal Workspace: a 120-person community event, a home-energy buying guide, and a neighborhood website release. Each has four work roles, 18 delivery tasks across multiple phases, two owner decisions and two scheduled watches.

From a source checkout with Python 3.11+ and Node 22.18.0+:
From a source checkout with Python 3.11+ and Node 22.22.3+:

```bash
python -m demo.workspace serve
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1310,9 +1310,10 @@ large-history recovery, fenced backup/restore, supported upgrade/rollback,
OS/runtime coverage and the >=10-day elapsed soak; runner completion cannot
claim them. See the
[SQLite qualification commands](../../reference/sqlite-authority-store.md#reproduce-validation).
The public minimum remains Node 22.18 for File; SQLite additionally requires
synchronous finalization and the WAL-reset fix, with Node 22.22.3/SQLite 3.51.3
as the reference. Node 24 stays primary and Node 26 stays a non-blocking probe.
The public minimum is now Node 22.22.3 for File and optional SQLite. SQLite
still checks synchronous finalization and the actual WAL-reset-fixed driver;
Node 22.22.3/SQLite 3.51.3 is the reference. Node 24 stays primary and Node 26
stays a non-blocking probe.

**Migration decision points.** Before the first existing-Goal cutover, freeze
one exact source lineage/revision under the authority writer fence, import a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1018,8 +1018,9 @@ rehearsal 证据(1000 次提交/64 KiB)现为 16 个 checkpoint、63 次 r
headroom、完整领域负载、大历史恢复、fenced backup/restore、受支持升级/回滚、
OS/runtime 覆盖和 >=10 天自然时间 soak 仍是 hold,工具跑完不能声称已满足。参见
[SQLite 验证命令](../../reference/sqlite-authority-store.md#reproduce-validation)。
公开 Node 最低版本 22.18 继续用于 File;SQLite 另需同步 finalization 与 WAL-reset
修复,参考组合为 Node 22.22.3/SQLite 3.51.3。Node 24 主 runtime 与 Node 26
公开 Node 最低版本已升至 22.22.3,适用于 File 和可选 SQLite;SQLite 仍需检查
实际内嵌驱动的同步 finalization 与 WAL-reset 修复,参考组合为 Node 22.22.3/
SQLite 3.51.3。Node 24 主 runtime 与 Node 26
非阻塞 forward probe 保持原合同。

**迁移决策点。** 首次迁移已有 Goal 前,先在 authority writer fence 下冻结精确的源
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1807,6 +1807,8 @@ cannot be silently relaxed.
The migration must not ask users to manage a service. The Python-transition
release requires Node.js 22.18.0 or newer, but installer and `loopx doctor`
must detect it before normal control-plane work and provide exact remediation.
The current source checkout raises that floor to Node.js 22.22.3 because this
release embeds the WAL-reset-fixed SQLite driver.
The wheel and sdist carry the TS source and versioned schemas.

The runtime is healthy while idle-exited: `stopped` means the next
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,7 @@ transaction 要和 matched durability baseline 比较,而不是套用 2 ms ker

迁移不能要求用户管理服务。Python 过渡版本要求 Node.js 22.18.0 或更新版本,
但 installer 与 `loopx doctor` 必须在正常控制面工作前检测,并给出精确修复方式。
当前源码版本已将最低要求升至 Node.js 22.22.3,以覆盖内嵌 SQLite 的 WAL-reset 修复。
Wheel 与 sdist 携带 TS source 和版本化 schema。

Runtime 因 idle 退出时仍是健康状态:`stopped` 表示下一次控制面请求会自动拉起,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ full-CLI p95 regression is an owner review gate rather than a silent pass.

RFC Section 7 projects only `running`/`stopped`/`unavailable` plus a stable
diagnostic code; raw stderr, tokens, local paths, and private runtime metadata
must not be projected. Node.js 22.18.0+ detection with exact remediation is
must not be projected. Node.js 22.22.3+ detection with exact remediation is
required before normal control-plane work.

Verified status: `loopx check` runs a public-boundary scan over the RFC and
Expand Down
3 changes: 2 additions & 1 deletion docs/book/chapters/00-reading-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ lifecycle 选择,不是所有贡献的默认终点。
## 版本基线

当前内容以 LoopX GitHub release `v1.1.0` 为发布锚点;本地命令示例已按 `loopx 1.1.0` 的
公开 CLI 与协议表面复核。该版本要求 Python 3.11+ 与 Node.js 22.18.0+;后者运行由 LoopX 自动管理、
公开 CLI 与协议表面复核。该历史版本要求 Python 3.11+ 与 Node.js 22.18.0+;此源码版本要求
Node.js 22.22.3+。后者运行由 LoopX 自动管理、
空闲后退出的 TypeScript Effect runtime,用户不需要手工维护 daemon。

发布标签、已安装 CLI 与源码 checkout 可能处于不同 revision,因此以下表面尤其需要按实际环境复核:
Expand Down
2 changes: 1 addition & 1 deletion docs/book/chapters/05-connect-existing-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ next_action: <one concrete next step>
要求:

- Python 3.11 或更高版本;
- Node.js 22.18.0 或更高版本,用于 LoopX 自动管理的 TypeScript Effect runtime;
- Node.js 22.22.3 或更高版本,用于 LoopX 自动管理的 TypeScript Effect runtime;
- macOS/Linux shell,或 Windows PowerShell 7;
- 一个已有 Git 项目。

Expand Down
3 changes: 2 additions & 1 deletion docs/book/en/chapters/00-reading-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ Do not bypass a newer permission or lifecycle check just to make an older exampl
## Version baseline

The current release anchor is LoopX GitHub release `v1.1.0`. Local command examples were checked against
the public `loopx 1.1.0` CLI and protocol surface. This release requires Python 3.11+ and Node.js 22.18.0+.
the public `loopx 1.1.0` CLI and protocol surface. That release required Python 3.11+ and Node.js 22.18.0+;
this checkout requires Node.js 22.22.3+.
LoopX starts and reuses its managed, idle-exiting TypeScript Effect runtime automatically; users do not
operate that runtime as a manual daemon.

Expand Down
2 changes: 1 addition & 1 deletion docs/book/en/chapters/05-connect-existing-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ diagnosis and choices only. Do not write state, commit, or push.
Prerequisites:

- Python 3.11 or later;
- Node.js 22.18.0 or later for the LoopX-managed TypeScript Effect runtime;
- Node.js 22.22.3 or later for the LoopX-managed TypeScript Effect runtime;
- a macOS or Linux shell, or Windows PowerShell 7;
- an existing Git project.

Expand Down
2 changes: 1 addition & 1 deletion docs/book/en/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ versioned or optional functionality, not the default shape of every contribution
- Site generator: MkDocs Material
- Hosting: GitHub Pages
- LoopX release anchor: `v1.1.0`
- Runtime prerequisites: Python 3.11+ and Node.js 22.18.0+
- Runtime prerequisites: Python 3.11+ and Node.js 22.22.3+

The official public protocols remain authoritative for protocol facts. Commands that change across
releases remain authoritative in the release you use, its current `--help`, and official documentation.
Expand Down
2 changes: 1 addition & 1 deletion docs/book/en/welcome-wagon.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ loopx doctor
git status --short --branch
```

Current LoopX releases require Python 3.11+ and Node.js 22.18.0+. If `doctor` fails, repair the installation
This checkout requires Python 3.11+ and Node.js 22.22.3+. If `doctor` fails, repair the installation
through [Installing LoopX](/loopx/docs/guides/installing-loopx/) before writing project state in a broken
environment.

Expand Down
2 changes: 1 addition & 1 deletion docs/book/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ Extension 只是可独立版本化和交付的一种路径。
- 站点生成器:MkDocs Material;
- 在线发布:GitHub Pages;
- LoopX 发布锚点:`v1.1.0`;
- 运行时前提:Python 3.11+ 与 Node.js 22.18.0+。
- 运行时前提:Python 3.11+ 与 Node.js 22.22.3+。

协议解释以 LoopX 官方公开合同为事实源。易变化的命令仍以对应发布物、官方文档和当前
`--help` 为准;本书负责教学顺序与心智模型,不成为另一份完整命令参考。
Expand Down
2 changes: 1 addition & 1 deletion docs/book/welcome-wagon.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ loopx doctor
git status --short --branch
```

LoopX 当前要求 Python 3.11+ 与 Node.js 22.18.0+。如果 `doctor` 失败,先按
此源码版本要求 Python 3.11+ 与 Node.js 22.22.3+。如果 `doctor` 失败,先按
[安装指南](/loopx/docs/guides/installing-loopx/)修复安装,不要在错误环境里继续写项目状态。

<!-- welcome-wagon:public-private-boundary -->
Expand Down
10 changes: 7 additions & 3 deletions docs/guides/installing-loopx.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ development and qualification surface, not a second implicit package channel.
The archive snapshot remains a recovery path rather than a competing default.

LoopX's Effect Program core runs in a managed, idle-exiting TypeScript runtime
and requires Node.js 22.18.0 or later; Node.js 24 LTS is the recommended primary
and requires Node.js 22.22.3 or later; Node.js 24 LTS is the recommended primary
runtime. LoopX starts and reuses that local runtime automatically; users do not
run a daemon manually. The runtime binds only to loopback, authenticates
requests with a user-private token, rotates when the packaged Effect core
Expand All @@ -35,7 +35,11 @@ engine. The same doctor projection exposes `runtime_lifecycle.state` as
`running`, `stopped`, or `unavailable`, plus a public-safe `diagnostic_code`;
the App can render this projection without inventing a second health model.
`stopped` is healthy and means the idle-exited runtime will restart on the next
control-plane request. Validate Node before installing or upgrading LoopX:
control-plane request. Validate Node before installing or upgrading LoopX.
Upgrading from an older Node 22 installation requires restarting the managed
runtime with `loopx doctor --restart-runtime` after the new Node is on `PATH`.
SQLite remains opt-in and checks the actual embedded SQLite version before
opening authority state.

The CI and release lanes use Node.js 24 LTS. Node.js 26 remains a non-blocking
forward-compatibility probe and is not a supported-version promise. After the
Expand All @@ -45,7 +49,7 @@ flags.

```bash
node --version
# v22.18.0 or newer
# v22.22.3 or newer
```

Use `loopx doctor --deep` after installation to start the managed runtime and
Expand Down
10 changes: 6 additions & 4 deletions docs/reference/sqlite-authority-store.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,10 @@ qualify the complete D2 profile.

This intentionally rejects SQLite runtimes previously accepted by the
statement-only probe, including vulnerable drivers shipped with older Node 22
releases. The public Node minimum remains 22.18 for the default File path;
SQLite requires the additional fix. No provider selection changes and no
fallback to File occur when an explicitly selected SQLite runtime is rejected.
releases. The public Node minimum is now 22.22.3 for both File and optional
SQLite use; SQLite also checks the actual embedded driver. Provider selection
does not change, and an explicitly selected SQLite runtime never falls back to
File when rejected.
The optional driver is still opened only after opt-in. The serving runtime
loads it in-process once at startup for the read-only identity probe described
below; that probe opens no database file and creates no authority state, and
Expand Down Expand Up @@ -400,7 +401,8 @@ retained commit. That row stays `missing` for a rehearsal, exactly like every
other formal budget.

SQLite 资格参考使用 Node 22.22.3/SQLite 3.51.3;打开前同时检查实际 WAL 修复版本
和 statement 关闭行为。公开 Node 最低版本 22.18 继续用于默认 File 路径。显式
和 statement 关闭行为。公开 Node 最低版本已升至 22.22.3,同时适用于默认 File
和可选 SQLite;SQLite 仍检查实际内嵌驱动。显式
SQLite 选择遇到不合格 runtime 会拒绝,不会改默认 provider 或静默回退。

托管 Effect runtime 按用户与源码修订复用,因此真正服务某个 Goal 的 Node/SQLite
Expand Down
6 changes: 3 additions & 3 deletions examples/dev-book-publication-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ def main() -> int:
"en/index.md",
(
(f"LoopX 发布锚点:`{release_tag}`", f"LoopX release anchor: `{release_tag}`"),
("运行时前提:Python 3.11+ 与 Node.js 22.18.0+", "Runtime prerequisites: Python 3.11+ and Node.js 22.18.0+"),
("运行时前提:Python 3.11+ 与 Node.js 22.22.3+", "Runtime prerequisites: Python 3.11+ and Node.js 22.22.3+"),
("TypeScript owner", "TypeScript owners"),
("这不是两套可独立演进的 控制面", "These are not two independently evolving control planes"),
),
Expand All @@ -476,7 +476,7 @@ def main() -> int:
(
("语义镜像", "semantic mirrors"),
("Python 3.11+", "Python 3.11+"),
("Node.js 22.18.0+", "Node.js 22.18.0+"),
("Node.js 22.22.3+", "Node.js 22.22.3+"),
("用户不需要手工维护 daemon", "users do not operate that runtime as a manual daemon"),
("TypeScript 已拥有", "TypeScript owns"),
("Python CLI 仍负责", "Python CLI still owns"),
Expand Down Expand Up @@ -545,7 +545,7 @@ def main() -> int:
"chapters/05-connect-existing-project.md",
"en/chapters/05-connect-existing-project.md",
(
("Node.js 22.18.0", "Node.js 22.18.0"),
("Node.js 22.22.3", "Node.js 22.22.3"),
("Windows PowerShell 7", "Windows PowerShell 7"),
("loopx doctor --deep", "loopx doctor --deep"),
("用户不需要手工维护 daemon", "users do not supervise a daemon manually"),
Expand Down
2 changes: 1 addition & 1 deletion examples/dev-book-welcome-wagon-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@

SHARED_BOUNDARY_MARKERS = (
"Python 3.11+",
"Node.js 22.18.0+",
"Node.js 22.22.3+",
".loopx/",
".codex/goals/",
".local/",
Expand Down
8 changes: 4 additions & 4 deletions examples/github-actions-runtime-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
}

PRIMARY_NODE_VERSION = "24"
MINIMUM_NODE_VERSION = "22.18.0"
MINIMUM_NODE_VERSION = "22.22.3"
MINIMUM_NODE_ACTION_VERSION = MINIMUM_NODE_VERSION
FORWARD_NODE_VERSION = "26"
# SQLite needs both synchronous statement finalization and the WAL-reset fix.
Expand Down Expand Up @@ -88,7 +88,7 @@ def main() -> int:
r"^ ([a-z][a-z0-9-]*):\n(.*?)(?=^ [a-z][a-z0-9-]*:\n|\Z)",
python_workflow, re.MULTILINE | re.DOTALL,
))
for name in ("kernel-static-checks", "dashboard-acceptance", "windows-powershell"):
for name in ("kernel-static-checks", "node-minimum-compatibility", "dashboard-acceptance", "windows-powershell"):
assert SQLITE_NODE_VERSION in node_version_pattern.findall(jobs[name]), name
postgresql_versions = node_version_pattern.findall(
workflows["postgresql-integration.yml"]
Expand All @@ -102,8 +102,8 @@ def main() -> int:
assert package["engines"]["node"] == f">={MINIMUM_NODE_VERSION}"

print(
"github-actions-runtime-smoke ok: Node 24 primary, 22.18 minimum, "
"26 forward, 22.22.3 sqlite/authority"
"github-actions-runtime-smoke ok: Node 24 primary, "
"22.22.3 minimum and SQLite/authority reference, 26 forward"
)
return 0

Expand Down
1 change: 0 additions & 1 deletion examples/showcase-catalog-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,6 @@ def main() -> int:
assert phrase in feedback_loop, phrase
for phrase in (
"https://loopx-project.github.io/loopx/",
"## Advanced Paths",
"docs/assets/long-running-loop-openviking-trajectory.png",
"docs/assets/long-running-loop-ml-experiment-trajectory.png",
"### Review Agent Work",
Expand Down
Loading
Loading