Release Readiness¶
Status: stable maintainer contract.
LoopX can move quickly without making every merged PR feel like a product release. This note defines the small mental model maintainers should use before promoting a release snapshot, recommending an install path, or telling users which control-plane surfaces are safe to build on.
Supported Install And Update Paths¶
For a first-time user, prefer the canonical PyPI release:
Restart the agent host after this first install so the newly delivered workflow skills become active.
PyPI owns normal release acquisition and dependency resolution. loopx update
apply uses that same owning environment and then refreshes LoopX host material
and readbacks; it does not switch channels.
Use the same explicit intent flow for PyPI and archive installations:
loopx update check
loopx update plan
loopx update apply
loopx doctor
loopx extension doctor --all-enabled --execute
After loopx update apply, revalidate enabled extensions with
loopx extension doctor --all-enabled --execute. Stale extension readiness
is already revalidated during a successful apply; the explicit command above
is an independent readback and recovery entry point. A provider that still
fails remains closed until its per-extension doctor result is repaired and the
command passes. See Extension lifecycle.
Do not collapse package acquisition, host-material delivery, core runtime activation, and enabled-extension readiness into one "installed" claim. The installation guide's active-layer checklist names the readback and recovery command for each layer.
For a pip or pipx distribution, apply delegates to that owner. For an archive
snapshot, apply uses the public stable ref by default and preserves atomic
snapshot rollback. Use loopx update plan --ref main and loopx update apply
--ref main only for maintainer/dev archive qualification. Re-running the curl
installer remains a repair path when an archive wrapper is too broken to run
its own updater.
For contributors, keep the clone-plus-canary path:
git clone https://github.com/huangruiteng/loopx ~/loopx
~/loopx/scripts/install-local.sh
loopx doctor
loopx-canary doctor
The PyPI path is the user default. The clone-plus-canary path is the maintainer validation path, and the no-clone archive is the recovery fallback.
Before promoting a stable install/update recommendation, maintainers must move
the public stable ref to the release commit that passed this gate. Do not
claim stable-channel readiness while stable is missing or stale.
Atomic Local Promotion Failure Matrix¶
Local clone installs promote through scripts/install-local.sh. Default
executable swaps are atomic symlink replaces that run only after a candidate
release directory passes deep loopx doctor validation and any required
workflow-skill preflight. Contributors should treat the matrix below as the
safe failure contract; do not invent a second promotion path or claim that a
failed candidate became the live default.
Shipped coverage lives in
examples/release/release-promotion-concurrency-smoke.py (lock, wait, and
pre-swap rejection) and
examples/release/local-install-promotion-boundary-smoke.py (canary-only
boundary, explicit override, and skill preflight stop).
| Case | When it happens | Before default symlink swap? | Waiter / recovery behavior | Contributor stop |
|---|---|---|---|---|
| Promotion guard held | Another install holds releases/.install-guard |
Yes: waiter has not reserved or swapped yet | Waiter polls the flock; it must not create a competing .install-lock while blocked. After the owner unlocks, the waiter acquires the guard and completes |
Retry is safe. Do not delete a live guard or force-promote around it |
| Live legacy lock owner | releases/.install-lock names a live PID |
Yes: timed-out waiter never reaches candidate build or swap | Waiter times out with timed out waiting for another local install; the live owner lock and PID file stay untouched |
Stop and wait for the live installer, or ask a maintainer. Do not reap a live owner's lock |
| Empty or dead legacy lock | Lock directory has no valid live PID | Yes: reaped before a new owner publishes its PID | Waiter reaps the interrupted lock, then acquires ownership and continues | Safe automatic recovery. No maintainer action required |
| Concurrent same-second install | Two promoted installs race with a shared release-id seed | Partial: each waiter serializes under the guard/lock before its own swap | Each run gets a distinct release directory (id, id-2, …); one audited default symlink remains after both finish |
Treat distinct release ids as expected. Do not hand-edit release directory names mid-install |
| Incomplete candidate (doctor fail) | Candidate package fails deep doctor or required package-root checks | Yes: candidate directory is removed; previous default target is preserved | No waiter swap occurs. Re-run only after the checkout is complete and doctor-clean | Stop promoting. Fix the checkout; do not set LOOPX_PROMOTE_DEFAULT=1 to bypass doctor |
| Skill preflight blocked | Exact-host entry skill cannot be materialized (for example a user-owned colliding skill) | Yes: release candidate is removed; existing default binary stays unchanged | Failure is local to the install attempt; no partial default promotion | Stop. Resolve the skill ownership collision or install without that skill surface before retrying |
| Untrusted checkout (auto mode) | Checkout is dirty, not on the approved default ref, or otherwise untrusted | Yes for default: installer never builds a promoted release snapshot | Installer exits canary-only (promotion mode: canary_only_untrusted_checkout), leaves the existing default executable alone, and may refresh loopx-canary |
Use loopx-canary for validation. Do not set LOOPX_PROMOTE_DEFAULT=1 unless you are explicitly approving this checkout as a maintainer-owned default |
| Explicit override | LOOPX_PROMOTE_DEFAULT=1 on an otherwise untrusted checkout |
No: this is the intentional swap path after candidate validation | Promotion is auditable as explicit_override in release.json and doctor provenance |
Contributor boundary ends here. Explicit default promotion, moving public stable, tagging, and PyPI publish remain maintainer-only |
Contributor-safe defaults:
- Prefer canary-only installs from ordinary feature checkouts.
- Treat any failure listed as "before default symlink swap" as proof that the previous default must still be live.
- When a waiter times out on a live owner, stop; recovery belongs to that owner finishing or a maintainer reclaiming a truly dead lock.
- Do not document, script, or smoke a contributor path that moves
stable, publishes packages, or claims default promotion withoutLOOPX_PROMOTE_DEFAULT=1plus an explicit maintainer approval.
Merged Is Not Runtime-Active¶
A post-merge check proves behavior on the tested source commit. It does not
prove that an installed LoopX runtime contains that commit. This distinction
matters when a fix reaches main after the latest named release: package
versions may still match while the installed source commit is behind.
Use loopx update check --ref main for archive maintainer qualification. Its
runtime_activation_qualification result compares the release-manifest source
commit with the trusted source lineage reported by loopx doctor:
runtime_activemeans the installed commit is the target commit or contains it;release_or_install_successor_requiredmeans the installed commit is behind or diverged, so a release/install successor must remain explicit;activation_qualification_requiredmeans commit lineage is unavailable or belongs to a differentrepo/ref; the runtime-active claim must fail closed until identity is refreshed.
A pinned full commit SHA is its own trusted target, so
loopx update check --ref <40-hex-commit> qualifies against the installed
manifest source commit without waiting for a branch lineage lookup. Installed
and pinned commits match: the receipt is runtime_active. They differ: the
receipt stays activation_qualification_required and names the installed
commit difference instead of the generic lineage message.
Closing a PR monitor after latest-main validation is valid, but the closeout
must not say the fix is active in the installed runtime unless this receipt is
runtime_active. Publishing a release remains a separate maintainer action.
When the qualification command itself runs from newer source code, pass a local
snapshot from the older installed CLI with --installed-doctor-json; this
option is read-only and accepted only by update check.
Named Version Contract¶
LoopX releases are tagged and built from GitHub. The release workflow
publishes artifacts to GitHub Releases and, when its Trusted Publisher gate
passes, PyPI; each stable promotion still needs one package version name. The
version source is loopx.__version__, mirrored by pyproject.toml; the
expected public tag is vX.Y.Z for that version.
Before moving stable, maintainers should:
- bump
loopx.__version__andpyproject.tomltogether when user-visible release behavior changes; - create or verify the matching Git tag, for example
v0.1.3; - for host Goal/prompt changes, explicitly run the
release-only native Goal regression
in a supported Codex environment; record an unavailable environment as
skipped, not a live pass. Never enable paid model execution in default PR CI; - fast-forward
stableto that tagged commit after the release canary passes; - confirm
release.json,loopx doctor, andloopx update checkreport the same package version and tag; - tell existing users to run
loopx update check, thenloopx update applywhen the check recommends or when they want to refresh to the named stable release.
The release workflow builds a wheel and source distribution from the tagged
commit. Its release assets include a canonical SHA256SUMS file, and GitHub
records build-provenance attestations for both packages and the checksum
manifest. Verify a downloaded bundle before installation:
sha256sum --check SHA256SUMS
gh attestation verify loopx-X.Y.Z-py3-none-any.whl --repo huangruiteng/loopx
gh attestation verify loopx-X.Y.Z.tar.gz --repo huangruiteng/loopx
The checksum proves that the downloaded bytes match the release manifest. The attestation separately binds those bytes to the repository, workflow, commit, and build event; neither mechanism claims that the package is vulnerability free.
PyPI publication is an explicit, fail-closed extension of the same build. The release workflow publishes only when maintainers have configured all of these:
- a PyPI project named
loopxwith a Trusted Publisher forhuangruiteng/loopxand.github/workflows/release-artifacts.yml; - a protected GitHub environment named
pypithat matches the Trusted Publisher configuration; - the repository variable
PYPI_PUBLISH_ENABLED=true.
Do not add a long-lived PyPI token. Without every condition above, GitHub Release packages and their verification material are still produced, while the PyPI job remains skipped.
Public Release Timeline¶
The public GitHub release timeline starts at v0.1.3. Earlier work should be
treated as pre-public bootstrap for the local control plane, installer, update
path, and canary route rather than as a user-facing release baseline.
v0.1.3on 2026-07-02 14:45 +08:00: initial public stable-channel release at commit10509b06. This release made LoopX explainable as a no-clone, local-first control plane for long-running AI agents: install, update, doctor, named version reporting, and the first public status/quota/todo/gate surfaces were ready to recommend together.v0.1.4on 2026-07-03 00:24 +08:00: fast-follow release at commit07d0a753. This release tightened product-capability monitor projection, release-readiness checks, and canary evidence so the first public baseline was easier to diagnose and refresh.v0.1.5on 2026-07-03 13:28 +08:00: long-horizon execution hardening at commitc036d60e. This release improved quota/status/runtime routing, monitor and scheduler projection, release packaging coverage, and outcome-floor recovery for stuck or low-progress loops.v0.1.6on 2026-07-03 17:07 +08:00: visible multi-agent startup hardening at commit1e3df9df. This release made auto-research startup easier to see and trigger, clarified decentralized pane routing, tightened monitor and scheduler projection, and expanded the Codex CLI first-run release checks.v0.1.7on 2026-07-04 12:52 +08:00: command-entry integration release at the matchingv0.1.7tag. This release made the supported entry layer explicit: Codex installs LoopX command-facade skills such as$loopx, Claude Code gets matching skill entries, legacy prompt shims are retired, and the rich workflow skills remain available for implicit LoopX behavior.v0.1.8on 2026-07-04 16:53 +08:00: deterministic host-loop activation release at the matchingv0.1.8tag. This release gives new agent hosts an explicitagent-onboardcontract for choosingcodex-app,codex-cli,claude-code,opencode,manual, orother-agent, rejects ambiguous inputs such ascodex, and makes/loopx <task>activate or gate the correct host loop after todo writeback.v0.1.9on 2026-07-05 21:45 +08:00: real auto-research and agent-scoped evidence release at the matchingv0.1.9tag. This release removes fake auto-research demo metrics, makes the KNN preset use a real benchmark workspace with public-safe evidence writeback, exposes role-named visible research panes, wires agent-scoped evidence read hints into replan, and hardens successor/frontier recovery when completed advancement has no next executable todo.v0.1.10on 2026-07-06 11:50 +08:00: scoped user-gate and agent-management release at the matchingv0.1.10tag. This release makes blocking owner todos explicitly typed asuser_gateor non-blockinguser_action, scopes per-agent gates withblocks_agent, adds read-only live agent-management status projections, and continues moving quota, todo, scheduler, review packet, and handoff rules into bounded control-plane contexts with focused canary coverage.v0.1.11on 2026-07-06 19:38 +08:00: vision-replan and recovery-routing release at the matchingv0.1.11tag. This release makes goal-vision gaps participate in the quota/replan decision plane, preserves continuation audits in quota and interaction contracts, supersedes stale vision checkpoint gaps when newer evidence closes them, and adds judge guidance for when a vision gap is real work versus stale state. It also promotes the latest control-plane bounded-context cleanup, auto-research successor/evidence fixes, connector source-map packets, structured run-index classification, and Codex CLI/TUI recovery fixes.v0.1.12on 2026-07-08 02:05 +08:00: presentation/read-model and frontier recovery release at the matchingv0.1.12tag. This release moves large status, goal-channel, dashboard, and Lark rendering paths into bounded presentation/read-model modules, fixes monitor-only plus open-vision frontier replan gaps, makes installer reruns overwrite stale wrappers/files safely, exposes premerge canary progress earlier, and promotes auto-research visible worker/successor routing plus selected public benchmark route/profile and SkillsBench helper hardening.v0.1.13on 2026-07-08 18:15 +08:00: guided onboarding and multi-agent control-plane release at the matchingv0.1.13tag. This release makes new project setup more repairable with guided start-goal previews (#1631, #1633), non-destructive write-scope migration (#1636), delivery-scale aliases, and clearer refresh-state diagnostics (#1641); routes primary controllers toward subagent orchestration (#1622) behind an explicit default-off feature switch (#1643); improves scheduler ACK/backoff recovery and heartbeat migration (#1626, #1639); splits quota/status fixture hot paths, Lark projection row helpers, and content-ops markdown renderers into narrower modules (#1640, #1642, #1644, #1646); adds public-safe external ML task ledgers (#1627); hardens SkillsBench source/countability/launcher evidence (#1612, #1620, #1621, #1625); and relaxes localnext_action/recommended_actiontext to allow local project routing references while still rejecting inline credentials (#1645).v0.1.14on 2026-07-09 11:49 +08:00: developer-contributed exploration topology and monitor/quota recovery release at the matchingv0.1.14tag. This release promotes the software exploration result layer (#1546): public explore node/edge/finding records, Lark presentation mapping, graph exports, router/load-profile planning primitives, and deny-by-defaultexplore_harnessworker/todo branch planners gated by each goal'sspawn_policy. It also ships the monitor scheduler cadence repairs that keep quiet monitor polls from collapsing back to short intervals (#1699 and related scheduler fixes), plus quota/status/todo read-model hardening for user-gate counts, completed-todo successors, evidence-log counts, delivery lineage, and compact agent-lane status summaries (#1707-#1716).v0.1.15on 2026-07-10: actionable routing and long-run reliability release at the matchingv0.1.15tag. This release makes the agent-facing current action and quota-selected todo more explicit, centralizes primary-action resolution, and preserves replan acknowledgements, filtered resumes, vision lifecycle state, and due monitors across bounded progress (#1720, #1731, #1751, #1757, #1764-#1766, #1769-#1770). It hardens external monitor and multi-agent continuation through quiet-timeout handling, identity/capability gates, no-handoff lane fidelity, and typed continuation policies (#1722-#1724, #1745, #1747, #1754, #1773). Experimental issue-fix and SkillsBench routes gain feasibility, lifecycle, evidence, failure-attribution, cache/proxy, prewarm, and ledger-closeout improvements (#1726, #1734, #1738-#1744, #1748-#1750, #1753, #1756, #1759-#1763, #1767-#1768, #1771-#1772). The release also adds and repairs the parallel full-public smoke sweep, fixes direct-install doctor behavior, clarifies Explore's measurable-metric fit, and closes the todo CLI ownership-budget regression (#1721, #1725, #1727-#1730, #1735, #1743, #1752, #1774).v0.1.16on 2026-07-10: archive-install provenance hotfix at the matchingv0.1.16tag. This release isolates release-manifest generation from the caller's working directory and inherited Python path, so running an update from an older LoopX checkout cannot stamp that checkout's package version into the new stable snapshot. The no-clone release gate now covers this stale-checkout invocation directly (#1776). No product capability or state migration changes in this hotfix.v0.2.0on 2026-07-11: peer-agent runtime and issue-fix control-plane release at the matchingv0.2.0tag. This release completes the v0.2 runtime cutover from hierarchical agent ownership toward equal peer agents: task claims are soft routing signals, independent handoff usescontinuation_policy=independent_handoffplusexcluded_agents, and stale legacy review continuation paths are rejected or migrated. It also promotes the issue-fix capability from feasibility planning into a fuller public maintainer loop with caller-repo branch preparation, acceptance artifacts, reviewer request fallback, PR lifecycle observation, and domain-state writeback. Explore Harness and long-run benchmark projections gain stronger public result contracts, while install/update, release provenance, quota, todo, scheduler, and protocol-action smokes were swept under the full-public suite for the 0.2 release cut.v0.2.1on 2026-07-12: agent-facing quality and long-run reliability fast-follow at the matchingv0.2.1tag. This release makes bounded turn context explicit through TurnEnvelope contracts, adds trajectory-hygiene and packet-duplication measurements, and preserves action contracts while trimming repeated hot-path material. Issue-Fix gains repository snapshots, decision-useful memory, Explore projection, reviewer/CI receipts, impact metrics, and guarded promotion of newly discovered public defects. Optional Explore planning now preserves independent experiment lanes and supports resource-aware portfolio decisions. Peer routing is hardened across task lease validity, advisory agent profiles, deferred successor exclusions, and non-blocking user actions. The repository also establishes parallel pytest, Ruff, strict typing, import-boundary, coverage-floor, and release-promotion concurrency checks so these broader capabilities remain maintainable.v0.2.2on 2026-07-12: visible execution and projection reliability fast-follow at the matchingv0.2.2tag. Explore gains recoverable execution episodes and ReplayPoint-based counterfactual branches, plus an optional owner-facing visual sink and real graph examples in the public entry surfaces (#1892, #1962, #1965-#1966, #1971). Visible multi-agent runs now wake only lanes whose runnable state changed and freeze the newest compatible host Codex CLI before launch (#1967, #1973). Diagnose capability projection, terminal PR-gate reconciliation, and vision replanning under monitor load are repaired (#1963-#1964, #1969). Benchmark comparison, report, learning-ledger, and result read models move into their control-plane runtime owner while preserving compatibility imports and restoring the full-public smoke shard (#1961, #1968, #1970, #1972). No persisted-state migration is required; Explore execution and visual sinks remain explicit opt-ins.v0.2.3on 2026-07-13: control-plane truthfulness and maintainer-surface release at the matchingv0.2.3tag. LoopX adds a provider-neutral model-behavior qualification contract with public-safe corpus and decision receipts plus an optional direct provider actor (#1994, #1998-#1999, #2001, #2003). Optional capability discovery and the Lark event inbox/collector become clearer product surfaces without adding mandatory first-run configuration (#1978, #1986, #1997, #2000). Monitor, todo, quota, and vision routing now preserve capabilities and attribution, prefer advancement over stale monitor pressure, keep future waits quiet, and correlate material transition receipts (#1989-#1993, #2008, #2011, #2013-#2015). Explore graph activation now respects run-scoped sink authority (#1995, #2016), while deterministic update notes and project governance make the public repository easier to maintain (#1983, #1996, #2012). No persisted-state migration is required; optional provider, Lark, semantic-preference, and Explore surfaces remain opt-in.v0.2.4on 2026-07-14: Explore presentation and delivery-reliability release at the matchingv0.2.4tag. Explore board layout is now a first-classboard_styleproduct parameter with two supported values:auto_flowuses Mermaid's automatic graph layout for topology-oriented views, whilesemantic_lane_columnsemits deterministic stage SVGs for operator boards with meaningful parallel lanes (#2062). The Lark visual sink can publish one managed board per evidence stage, project the selected style into every stage, keep labels inside lane nodes, retry eventual visual readback, and reconcile generated document sections so stale or duplicate stages do not accumulate (#2051, #2063, #2065-#2066, #2068). The same canonical Explore result graph remains authoritative for both styles, and existing Mermaid-only configs continue to resolve asauto_flow. This release also includes same-source canonical/executive views, explicit issue-fix semantic-preference call sites, provider diagnostics, and further monitor, scheduler, installer, onboarding, and public-smoke hardening (#2002, #2005-#2006, #2018-#2021, #2027-#2028, #2032, #2036, #2052-#2061). No persisted-state migration is required; Explore and its Lark visual sinks remain opt-in.v0.2.5on 2026-07-15: reward-memory and cross-runtime reliability release at the matchingv0.2.5tag. LoopX now ships a provider-neutral Reward Memory path from reviewed corpus and health contracts through candidate review, opt-in recall/application, evaluation, dogfood controls, and explicit actor-peer routing at the Issue-Fix planning boundary (#2076-#2085, #2096, #2100, #2103, #2128). Runtime projection routes become a first-class source of truth for material events, refreshes, and Explore commands across shared runtimes, with source-mirror ambiguity and compact diagnostics repaired (#2091, #2094, #2097, #2099, #2102, #2129). Issue-Fix gains stronger commit evidence, evidence-backed close counts, candidate dedupe, reviewer fallback, and delivery-window queuing (#2071, #2087, #2098, #2105, #2107, #2111). Monitor, scheduler, peer-replan, Lark inbox, Explore readback, and long-running SkillsBench paths are hardened against repeated host failures, scoped gates, transport loss, setup drift, and countability ambiguity (#2101, #2104, #2108-#2127, #2130-#2131). No persisted-state migration is required; Reward Memory and advanced fixer execution remain explicitly activated and bounded.v0.2.6on 2026-07-16: typed interaction authority and isolated Turn runtime release at the matchingv0.2.6tag. Scheduler decisions now follow the typed interaction contract, exact blocked successors can trigger bounded autonomous replanning, and user gates no longer deadlock unrelated agent lanes (#2136, #2177, #2187, #2188, #2198, #2203, #2204). LoopX Turn becomes a shipped isolated-headless route with executable envelopes, session recovery, independent validation, real CLI qualification, and a SkillsBench integration (#2158, #2166, #2169, #2171, #2173, #2193, #2199, #2202). New-user onboarding is protected by deterministic lifecycle canaries and repeated one-arm Doubao qualification of the actual default packet, while CLI output budgets and release outcome contracts make semantic regressions visible before promotion (#2144, #2148, #2153, #2157, #2159, #2167, #2168, #2201). Explore source reconciliation, optional Reward Memory experiments and reviewer gates, and Lark delivery are also hardened without making them first-run requirements (#2200). No persisted-state migration is required; advanced capabilities remain explicitly activated.v0.2.7on 2026-07-18: control-plane convergence and exact-release-evidence release at the matchingv0.2.7tag. Scheduler, quota, and todo decisions share one agent/runtime/capability/ACK scope; monitors converge independently without resetting one another; blocking user gates use one typed response plan; and Reward Memory v1 ships project corpus configuration with bounded Issue-Fix recall.v0.2.8on 2026-07-19: typed Codex App automation contract and periodic report control plane at the matchingv0.2.8tag. Agent-scoped scheduler, quota, todo, monitor, user-gate, and frontier decisions become typed runtime contracts, and a provider-neutral periodic-report control plane ships for scheduled or material-progress reports without granting external-write authority.v0.2.9on 2026-07-20: lane-isolated scheduling and OpenCode host support at the matchingv0.2.9tag. One agent lane can no longer consume or suppress another lane's frontier, OpenCode becomes a first-class Turn-backed host, and periodic reports gain a dense self-contained HTML presentation.v0.2.10on 2026-07-20: in-session weekly report quick start at the matchingv0.2.10tag. A normal project session can request a local report without profiles, RRULE, host Automation, providers, or external sinks; owner pause stays authoritative for monitor-only quota work.v0.2.11on 2026-07-20: packaged weekly report preset at the matchingv0.2.11tag.loopx periodic-report inspect-profile --preset weeklyexposes the built-in provider-neutral preset; it creates no schedule, invokes no external sink, and grants no external-write authority.v0.2.12on 2026-07-24: heartbeat receipt and review-quality release at the matchingv0.2.12tag. One quota receipt is persisted per heartbeat turn, monitor/replan routing stays fresh,loopx pr-reviewgains a code-volume and simplification lens, and adaptive multi-turn live-worker lifecycle phases stay visible through compact run and ledger views.v0.2.13on 2026-07-24: monitor follow-through release at the matchingv0.2.13tag. Material monitor writeback resolves the exact todo before target-key fallback, exposes newly runnable successors immediately, and returns a structured stale-projection warning instead of reporting a failed write when only projection reload failed. Continuous-monitor todos may no longer carryresume_when.v0.3.0on 2026-07-30: capability and control-contract release at the matchingv0.3.0tag. LoopX promotes simplify-first change qualification, provider-neutral decision context, governed material lifecycle workflows, managed-project delivery, and Ark Managed Agent host support while ordering quota rules and making recoverable Turn stages explicit.v0.4.0on 2026-08-02: onboarding and turn-authority release at the matchingv0.4.0tag. Goal startup projects capability-owned admission routes, replan acknowledgements require canonical agent-visible evidence, the defaultquota should-runJSON stays inside a bounded model-facing budget, and the README foregrounds two inspectable 200+ hour loop trajectories.v0.4.1on 2026-08-04: durable work selection and Goal-host continuation release at the matchingv0.4.1tag. Capability-admitted Todo routes persist across turns, Goal hosts wake on the earliest material frontier transition, grouped Issue Fix PR monitors materialize explicitly, and default-off Agent Turn Recall ships with agent/goal/project/Todo/authority scoping.v0.4.2on 2026-08-07: host and workflow surface release at the matchingv0.4.2tag. Pi and TraeX become first-class host paths, adaptive child admission enforces domain/capability/repository/write-scope readiness, provider-neutral PR queue observation and PR program workflows ship, and Issue Fix pins work to an approved base snapshot.v0.4.3on 2026-08-09: effect-interpreter evolution release at the matchingv0.4.3tag. A second realEffectTurninterpreter consumes turn results, data-encoded execution and an ordered effect program shape land, the runtime plan is replacement-first, and a unified bilingual Dev Book adds an independent Control-Plane Course chapter.v0.4.4on 2026-08-09: M6 effect-program quality-gate completion at the matchingv0.4.4tag. Hot control-plane modules are bounded,EffectTurn/EffectProgramare consumed by real runtime paths, and the M6 RFC is marked Complete with audit evidence.v0.4.5on 2026-08-13: security-hardening and control-plane release at the matchingv0.4.5tag. LoopX fixes five privately reported security advisories, adds caller-approved completion validation, ships a durable-smoke review gate, and continues replan/evidence/settlement hardening with community contributions across 16 contributors.v0.4.6on 2026-08-13: replan and notification hardening release at the matchingv0.4.6tag. Replan closeout becomes semantic, quota/heartbeat notification correctness is repaired, refresh-state writeback guards land, and two architecture RFCs document the effect-program direction.v0.4.7on 2026-08-15: governed-host continuation release at the matchingv0.4.7tag. OpenCode 1/2 goal loops stop interrupting on user messages or task closeout, DeepSeek Harness connects through a managed Turn connector, per-goal handoff mode gates claim/lease authority in state files, and Explore can publish multiple Feishu visual boards in one automated step.v0.4.8on 2026-08-16: open-core packaging and qualification release at the matchingv0.4.8tag. LoopX adopts Apache-2.0 for the open core, ships as a first-class PyPI distribution, adds per-Todo validation budgets, and tightens benchmark integrity qualification and Content Ops presentation density.v0.4.9on 2026-08-19: cross-platform host and long-loop reliability release at the matchingv0.4.9tag. LoopX makes PyPI the default complete install path, adds native Windows PowerShell and KunlunCode Goal Pro support, ships an opt-in repository change-window provider with a durable pending-change ledger, and hardens heartbeat settlement, Todo validation, PR review scheduling, native Goal benchmark isolation, and public repository signal providers.v0.5.0on 2026-08-20: personal control-plane workspace release at the matchingv0.5.0tag. LoopX promotes the dashboard as the supported browser/PWA workspace, adds a source-built native desktop shell over the same local authority, makes Goal stop/resume and repository change windows operator-visible, and admits goal-bound external capability providers.v0.5.1on 2026-08-21: operator workflow and collaboration hardening at the matchingv0.5.1tag. LoopX adds downloadable macOS and Windows desktop previews, first-class DeepSeek Harness packaging, botmux Goal Channel turns, three Agent-scoped Lark ingress modes, and fixes Goal lifecycle, Todo defer, quota settlement, replan closeout, and event-sourced freshness paths.v0.5.2on 2026-08-23: transaction and multi-source workspace reliability release at the matchingv0.5.2tag. LoopX moves the core Turn settlement path behind typed effect transactions, makes local/SSH source changes generation-fenced, adds a native DeepSeek Harness Goal workspace and Agent-scoped external Connector providers, and hardens long Todo chains, prepared-effect recovery, benchmark admission, and public-smoke release gates.v0.5.3on 2026-08-27: host reach and autonomous-continuation reliability release at the matchingv0.5.3tag. LoopX adds ZCode and Antigravity CLI Goal surfaces, a bounded citation-led deep-research workflow, and an explicit Pi task-lease facade; it also strengthens Lark inbox routing and catch-up, typed Todo/quota/scheduler settlement, repository delivery admission, and runtime startup recovery.v0.5.4on 2026-09-03: typed control-plane and governed-workflow release at the matchingv0.5.4tag. LoopX moves more Todo, task-lease, quota, scheduler, Vision, and replan transactions behind TypeScript owners; advances staged file, PostgreSQL, and NoKV shared-authority providers; completes the periodic-report lifecycle; makes the DSH plugin one-step ready; and adds public-safe benchmark study projection without granting upload authority.v1.0.0on 2026-09-06 20:44 +08:00: the Workspace milestone release at the matchingv1.0.0tag (merged6e8387e). The desktop companion gains signed in-app updates with a paired runtime and a recovery path for interrupted installs (#3994); Todo claim and update authority finishes its claim-neutral correction through the TypeScript transaction (#4005, with promoted claim retry identity from #3987); multi-agent Goal Channels ship with per-agent connection resolution (#3969); and reward-memory recall guides outbound messages behind a digest-bound review loop (#3968).v1.0.1on 2026-09-08 06:51 +08:00: post-1.0 reliability release at the matchingv1.0.1tag (7f2a020b). Goal Channels gain resumable multi-Agent onboarding and Agent-authorized typed report requests; Desktop recovery gains bounded diagnostics and verified signed updates; Todo ownership, projection recovery, and Stage 2C management use stronger typed transaction boundaries; and frozen bundles install the same version-bound workflow skills as package distributions. The exact-tag Python, PyPI, macOS, Windows, signed-update, public-smoke, and live-model gates passed beforestablefast-forwarded.v1.0.2on 2026-09-09 11:22 +08:00: single-owner Todo authority and recovery release at the matchingv1.0.2tag (a5374d5b). Promoted Todo terminal transitions commit through one TypeScript-owned provider transaction; missing generated Todo projections recover without making Markdown authoritative; and long-history, Desktop, DSH, and managed-skill paths gain bounded reads and clearer recovery diagnostics. The published wheel, source distribution, macOS, Windows, checksum, update, and PyPI artifacts were verified against the exact release source before promotion.v1.0.3on 2026-09-11 11:53 +08:00: native monitor observation and consumer closure release at the matchingv1.0.3tag (0496975e). Native monitor observations and their successors commit atomically through one typed transaction, and completed history stays out of target-key selection (#4187); quota unifies typed scope selection without erasing user gates, and the scheduler hint accepts canonical Base64 transport; archived history preserves decision and resume semantics (#4184); the manager keeps concrete Core findings in progress reports behind scoped evidence reads (#4213, #4218); Goal Channels extract runtime command ownership (#4154) and deliver manager terminal failure receipts (#4217); and iteration-fresh host dispatch plus typed upstream terminal errors land through #4126 and #4215. The published wheel, source distribution, macOS, Windows, checksum, update, and PyPI artifacts were verified against the exact release source before promotion.v1.0.4on 2026-09-15 14:19 +08:00: bounded local authority storage, human-confirmed operations, and a wider typed kernel release at the matchingv1.0.4tag (b6d877b0c). The opt-in SQLite authority provider keeps its retained state log bounded with compact operation deltas plus periodic checkpoints, separates storage, head, and continuity integrity, and migrates V1 -> V2 as one idempotent, fail-closed transaction with a plan/execute operator command (#4408, #4328, #4121); PostgreSQL authority admission becomes a service-owned boundary whose authority ladder runs against a real server in CI (#4334, #4399). Goal Channel operations ship as human-confirmed typed actions whose review decision travels with the operation instead of being re-derived per surface (#4275, #4364, #4132), and Todo, quota, lease, monitor, and decision-scope rules converge on shared typed owners (#4273, #4289, #4292, #4348, #4351). The published wheel, source distribution, macOS, Windows, checksum, signed-update, and PyPI artifacts were verified against the exact release source beforestablefast-forwarded.v1.0.5on 2026-09-16 03:14 +08:00: first-connect registration and explicit host selection hot-fix release at the matchingv1.0.5tag (0c3971fea).connect/bootstrapregister the goal and write the active state only, so a freshly connected goal is immediately eligible instead of parking on a generated owner gate, and the eight first-connect bootstrap options plus theonboarding_*payload fields and theadapter.connection_validationannotation are removed (#4465). Managed execution is selected rather than inferred: the managed Turn host (#4443, #4451) and the steward channel endpoint (#4446, #4419) come from explicit configuration, PR-review CI waiting is configurable per machine or goal (#4452) under a documented review frame (#4434), and update activation is qualified from an immutable source commit (#4460) while the serving runtime publishes its identity with a restart path (#4423). Quota window-slot spend clamps against the voids that target it (#4384), the held coordination fence survives an authority-source change (#4429), and a goal frontier missing its final-outcome claims is diagnosed (#4341). Community contributions cover text-mode subprocess decoding (#4396), stale executor revisions rejected before persisting (#4398), CLI dash options (#4428), manager delegation reconciliation (#4372), window-slot clamping (#4384), the semantic vocabulary registry and its governance (#4433, #4453), and the Codex App autonomous goal guide (#4442). The published wheel, source distribution, checksum, and PyPI artifacts were verified against the exact release source beforestablefast-forwarded.
When a new public release is promoted, add it here only after the matching tag, release note, stable ref, update path, and focused release canary agree.
Compatibility Gate¶
Before a release snapshot is promoted or a public guide tells users to depend on a new surface, run the smallest gate that covers the touched surface:
python3 -m py_compile loopx/*.py
python3 examples/release/codex-cli-no-clone-release-verification-smoke.py
python3 examples/fresh-clone-quickstart-smoke.py
python3 examples/loopx-update-smoke.py
python3 examples/release/release-version-contract-smoke.py
python3 examples/release/release-readiness-doc-smoke.py
python3 examples/repository-hygiene-smoke.py
git diff --check
loopx check --scan-path README.md --scan-path docs/ --scan-path examples/
This is not a universal full suite. Add focused smokes for the changed command, projection, or workflow. Do not require benchmark raw logs, raw task text, trajectories, verifier output, credentials, or local private artifact paths as release evidence.
After the individual lanes pass, bind their compact receipts to the exact clean
release checkout before tagging or moving stable:
The exact_release_commit_qualification_manifest_v0 contract requires the
same Git commit, Git tree id, package version, and version tag across pytest,
Ruff, mypy, risk-based canary, full-public, install/upgrade/host,
public-boundary, and actual-default one-arm Doubao receipts. The command also
checks the current checkout and rejects dirty or rebased source. It only
reduces existing bounded receipts: it does not execute tests, call a provider,
move refs, create tags, or publish a release.
Canary Model¶
A release canary is a catalog-informed readiness slice. It is near-E2E in the sense that it follows a real promotion or operator path across several seams, but it is intentionally smaller than a full end-to-end test suite. Its job is to answer "can the touched public surfaces be promoted under this declared boundary?" rather than "is every LoopX path correct?"
Choose the canary group from existing interaction pattern families; do not add new IPs solely to describe a validation bundle:
- status/quota/scheduler changes should include Work Routing checks such as
quota should-run, scheduler hints, and hot-path interface budget; - state projection or public/private changes should include State And Boundary
checks such as
loopx check, task graph or todo detail cold-path contracts; - dashboard/frontstage changes should include catalog or fixture route checks, with browser smokes only when the visual surface itself is being promoted;
- release/install changes should include installer, update, wrapper, doctor, and public-boundary checks;
- benchmark or external-evidence changes should use compact lifecycle evidence only, never raw task text, raw logs, trajectories, or verifier tails.
The default promotion canary is:
The default dashboard policy is --dashboard-mode=auto: source checkouts run
dashboard demo-readiness when apps/presentation/dashboard is present, while installed
release snapshots that omit the dashboard app skip that optional surface and
keep the omission visible in the canary output. Use --dashboard-mode=require
when the dashboard/frontstage itself is being promoted, and
--dashboard-mode=skip only when the release boundary intentionally excludes
the dashboard app.
Use the writeback form only when you intentionally want to append fresh promotion-readiness evidence:
For broader source-checkout regressions, keep loopx canary smoke-suite as the
source of truth. Local and LoopX automation should continue to use the runner
payload directly:
python3 examples/run-smokes.py --suite default-public --module canary
loopx canary smoke-suite --suite default-public --module canary
For larger source-checkout sweeps, use the runner's bounded parallelism instead
of moving smoke semantics into a second test framework. --jobs keeps the
LoopX runner payload as the source of truth while preserving serial execution
for smokes that declare a scheduling-sensitive surface:
python3 -m loopx.cli canary smoke-suite --profile public-smoke-watch --jobs 4 --timeout-seconds 60
python3 examples/run-smokes.py --suite full-public --jobs 4 --timeout-seconds 60
For repeatable canary/refactor batches, prefer named smoke-suite profiles over
hand-curated script lists. Profiles expand to the same runner payload as
--module, --script, catalog selectors, and the pytest facade:
loopx canary smoke-profiles
loopx canary smoke-suite --profile core-control-plane --no-execute
loopx canary smoke-suite --profile core-control-plane --offset 20 --limit 20 --timeout-seconds 60
loopx canary smoke-suite --profile canary-runner --timeout-seconds 60
python3 examples/run-smokes.py --profile public-entry-install-release --no-execute
Use --offset with --limit to sweep large profiles in stable windows without
rerunning the same prefix batch on every heartbeat.
Default pytest is the fast unit and contract lane. The smoke-suite facade is
explicitly opt-in so a normal PR test run does not silently expand into the
canary matrix. CI may wrap an explicit runner selection in pytest when JUnit
reporting is useful. The facade still executes each selected
examples/**/*-smoke.py through a subprocess; it is not a migration of legacy
smokes into pytest unit tests:
python3 -m pytest tests/test_smoke_suite.py \
--loopx-smoke-suite default-public \
--loopx-smoke-profile canary-runner \
--loopx-smoke-offset 0 \
--junitxml smoke-suite.xml
The required Python test workflow owns the Ruff namespace selection and package coverage floor. The floor is a regression guard, not a claim of sufficient coverage; raise it as durable behavior moves from subprocess smokes into focused tests.
Architecture tests
reject outward control-plane dependencies and forbidden status dependencies
without migration exceptions, and protect presentation ownership of quota
Markdown. See the dependency policy
for the boundary rationale. Existing source-wide lint debt is characterized
separately. Strict mypy scope is the [tool.mypy].files list in
pyproject.toml; use python -m mypy to check that exact
scope. Expand each protected namespace only after a bounded cleanup rather
than duplicating changing file counts or mass-fixing unrelated code to make a
broad gate green.
If the source checkout has optional frontend dependencies installed, dashboard readiness can be included in the same canary. If a release snapshot omits the dashboard app, the canary should degrade gracefully and record that boundary rather than failing unrelated CLI/install promotion or silently treating the dashboard path as covered.
What Is Safe To Depend On¶
Treat these v0.x surfaces as stable enough for user guides, examples, and host integrations when their focused smokes pass:
loopx doctor,loopx update,loopx check, and the no-clone installer;loopx extension doctorfor enabled-extension readiness after install or update apply;- project lifecycle commands:
bootstrap,connect,status,refresh-state,registry, andsync-global; - todo lifecycle commands:
todo add,todo claim,todo update,todo complete,todo list,todo supersede, andtodo archive; - control-plane read paths:
quota should-run,quota spend-slot,review-packet,heartbeat-prompt --thin, task graph projection, and cold todo detail references; - public slash command names:
/loopx,/loopx <goal>,/loopx-global-summary,/loopx-global-gates,/loopx-global-todos, and/loopx-global-risks; - ignored local state boundaries under
~/.codex/loopx, project-local registry files, and project-local active-state workbench files recognized byloopx doctor,loopx status, andloopx check.
Treat these as experimental until their contract docs say otherwise:
- benchmark runner behavior, scoring, upload, and raw task execution routes;
- host-plugin command registry implementations beyond the published protocol contract;
- frontstage/dashboard presentation details that are not part of the public status data contract;
- monitor scheduler cadence fields while they are still rolling out across todo creation, quota projection, writeback, and migration.
Release Note Checklist¶
Start the final GitHub release body from the canonical
release note template. Its first substantive
section is a compact ## Release Decision block that answers the five
questions a reader needs before inspecting the detailed changelog:
| Field | Required decision |
|---|---|
**Who should upgrade:** |
Name the affected users or operators, the reason to upgrade now, and who can remain on the current version. |
**What this release solves:** |
State the concrete failure, missing workflow, or reliability gap in user-outcome language. |
**Breaking changes:** |
Start with No. or Yes.; when yes, give the migration path, and when no, still disclose changed defaults, deprecations, or experimental boundaries. |
**How to verify:** |
State the expected post-upgrade result and include a minimal runnable bash block that proves package identity and the affected behavior. |
**Contributors:** |
Name the release maintainer and community contributors from the tag range, or explicitly say that the release has no community contribution. |
Mirror the same decisions under ### 升级决策 in the Chinese summary with
**谁需要升级:**, **解决了什么:**, **是否有破坏性变更:**,
**如何验证:**, and **贡献者:**. The summary is a decision aid, not a
replacement for the detailed product groups, per-claim PR evidence, optional
capability lifecycle, or exact-commit validation evidence below it.
Keep user-visible product changes first. When merged pull requests between the
previous and current tags include community contributors other than project
founder @huangruiteng, add a prominent ## Community Contributors section
after the English product groups and before compatibility, validation, or
update material. Link each eligible GitHub handle and relevant pull requests,
summarize the concrete contribution, and explicitly call out external or
first-time contributors when applicable.
Do not list or thank @huangruiteng in this section; founder stewardship is
implicit in each LoopX release. Omit the section when the tag range contains no
eligible community contribution. Contributor recognition must complement the
release narrative, not replace or precede its product highlights.
Build the list from the tag-to-tag Git range and merged pull-request metadata, not commit display names or an unreviewed generated changelog. Attribution is part of the release contract even when the same pull request is linked again under a product group.
Organize the remaining release note into the following stable groups. Omit an empty product group instead of inventing filler:
- State Kernel & Control Plane for state, todo, quota, scheduler, gate, peer-routing, and runtime authority changes.
- Capabilities & Workflows for shipped user workflows such as Issue-Fix, Explore, Reward Memory, onboarding, and LoopX Turn.
- Quality & Testing for deterministic tests, canaries, output budgets, model-behavior qualification, and release gates.
- Benchmarks & Integrations for benchmark adapters, Lark, host runtimes, and other external boundaries.
- Documentation & Compatibility for public contracts, install/update guidance, migrations, defaults, and intentional exclusions.
Bilingual releases with eligible community contributions must add
### 社区贡献者 after the Chinese product groups and before Chinese
compatibility or validation material, with the same people, pull-request
links, and concrete contribution scope as the English section. Omit both
language sections together when no eligible contributor exists. Bilingual
releases must preserve these same group boundaries in both languages. Use the
matching headings 状态内核与控制面, 能力与工作流, 质量与测试,
基准与集成, and 文档与兼容性. The Chinese copy may be shorter, but it
must not collapse several groups into a generic highlights list, omit a
non-empty English group, or weaken contributor attribution.
Within each non-empty group, every material claim must carry one or more direct
GitHub pull-request links such as
[#2051](https://github.com/huangruiteng/loopx/pull/2051). A compare link is
still useful at the end, but it does not replace per-claim PR attribution.
Avoid bare PR ranges as the only evidence because ranges can hide omitted or
unrelated changes.
After the decision summary and product groups, every public release note should also record:
- What package version and public tag name this stable release uses?
- Which install/update path should a new user follow?
- Which surfaces are still experimental or intentionally excluded?
- For every new or materially changed experimental, default-off, or opt-in capability, include an Optional capability activation entry in both languages: name its scope, read-only preview, exact enable and disable commands, prerequisites or safety gates, and canonical docs. If no persistent switch exists, say that opt-in is per command or preset instead.
- Did the public/private scan run on the changed docs, examples, and workflow files?
- Did full
pytest, focused release/install contracts, risk-based canary, and promotion-readiness/public-boundary checks pass on the exact release commit? - Did
loopx canary release-qualificationconfirm that every required compact receipt matches the same clean commit, Git tree, package version, and tag? - Did the low-frequency live model gate run against the actual default agent-facing packet with at least two repeats? Record the model id, behavior decisions checked, call count, failures, and skips, but never retain raw prompts, packets, responses, credentials, or local paths. This remains a local/manual release gate rather than ordinary CI.
- If the release claims benchmark or long-horizon outcome improvement, did a matched stable-versus-candidate outcome baseline pass? If no outcome claim is made, state that this expensive gate was not required rather than implying it ran.
- For Chinese-speaking operators, include a compact
## 中文摘要section that mirrors the English group structure and material claims in neutral product language. Keep each group shorter than its English counterpart while preserving direct PR attribution and compatibility boundaries.
Final Release Body Usage Gate¶
The release-note PR is not sufficient evidence. Before publishing, save the complete final GitHub release body to an ignored or temporary Markdown file and validate that exact file:
python3 examples/release/release-readiness-doc-smoke.py \
--release-notes <final-release-body.md> \
--surface "<new-or-materially-changed-surface>" \
--surface "<another-surface>"
Derive the repeated --surface values from the tag diff, merged PR inventory,
and release claims. Each named surface must have a dedicated English
### <surface> entry under ## Optional Capability Activation & Use and a
matching Chinese #### <surface> entry under ### 可选能力启用与使用. Both
entries must include these explicit fields:
| English | Chinese | Required content |
|---|---|---|
**Activation:** |
**启用:** |
Exact install/enable command, or the exact per-command/profile opt-in when no persistent switch exists. |
**Validation:** |
**验证:** |
Minimum runnable status, readback, or verification command. |
**Disable / rollback:** |
**停用 / 回退:** |
Exact disable, uninstall, envelope removal, or rollback path. |
**Authority boundary:** |
**权限边界:** |
Write, merge, provider, privacy, and host limits that activation does not grant. |
**Docs:** |
**文档:** |
Canonical versioned documentation link. |
Every entry needs at least one runnable bash block. A release with no new or
materially changed optional capability, workflow, or host surface must instead
run the gate with --expect-no-optional-capability-changes and include the
exact bilingual declarations required by the validator. Omitting both a
surface list and the explicit no-change decision fails closed.
After publishing, read the complete remote body back with jq -rj, compare its
hash with the reviewed local file, and run the same validator against the
readback. Do not validate a draft and then publish a different body.
Capability Narrative Gate¶
For every new or materially changed capability, write the release claim in three explicit layers:
- User outcome: say what a user can now accomplish in product language, before naming protocols, providers, renderers, or other implementation mechanisms.
- Shipped layer: identify whether the release provides a control-plane or protocol kernel, a built-in adapter or presentation layer, or a complete end-to-end workflow. Name the commands, docs, or smokes that prove that layer.
- Last-mile boundary: name any default profile, collector, scheduler, destination, credential setup, or publication step that is still absent or explicitly opt-in. Do not overclaim a complete workflow, but do not hide a shipped core behind mechanism-only wording either.
A built-in capability is not an optional extension merely because some of its collectors, renderers, sinks, or providers are optional. Describe the built-in outcome and its lifecycle separately from provider activation. When a release ships successive layers of one outcome, such as a report kernel followed by an HTML presentation layer, attribute and explain each layer instead of folding both into a generic integrations bullet.
The Chinese summary must preserve the same user outcome, shipped layer, and last-mile boundary. Translation may be shorter, but it must not replace the user-facing outcome with architecture-only terminology.
The release PR and final GitHub release body must use the same grouping and contributor attribution, plus the same validation receipt. Re-run the gates after rebasing or merging any additional runtime change; results from an earlier commit do not qualify a later tag. Public git history, merged PR metadata, and shipped CLI behavior remain the source of truth.