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
37 changes: 19 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

**Start with one goal. Keep long-running agent work verifiable.**

Tell the Agent you already use what you want done. LoopX keeps the goal,
work, approvals and evidence durable behind the scenes, so the next session can
continue without making you learn LoopX internals first.<br>
<sub>Work with Codex, Claude Code, DeepSeek Harness and other runtimes. Advanced docs still expose the local-first semantic kernel, ownership model and research workbench.</sub>
Tell the Agent you already use what you want done. LoopX keeps the goal, work,
needed decisions and verifiable results durable behind the scenes, so the next
session can continue without making you learn LoopX internals first.<br>
<sub>Work with Codex, Claude Code, DeepSeek Harness and other runtimes. Advanced docs still expose the local-first architecture, ownership model and research workbench.</sub>

[![Release](https://img.shields.io/github/v/release/loopx-project/loopx?color=brightgreen)](https://github.com/loopx-project/loopx/releases/latest) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![TypeScript core](https://img.shields.io/badge/core-TypeScript-3178C6?logo=typescript&logoColor=white)](docs/architecture/rfcs/typescript-control-plane-migration-v0.md) [![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](pyproject.toml)

[![Local first](https://img.shields.io/badge/control--plane-local--first-brightgreen.svg)](docs/public-private-boundary.md) [![Loop Agents](https://img.shields.io/badge/status-loop%20agents%20supported-brightgreen.svg)](docs/product/release-readiness.md) [![GitHub contributors](https://img.shields.io/github/contributors-anon/loopx-project/loopx?color=blue)](https://github.com/loopx-project/loopx/graphs/contributors) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/XmGgQyCFZd) [![Listed on dsh-plugin.org](https://dsh-plugin.org/badges/listed.svg)](https://dsh-plugin.org/plugins/loopx-project/loopx)
[![Local-first state](https://img.shields.io/badge/local--first-state-brightgreen.svg)](docs/public-private-boundary.md) [![Loop Agents](https://img.shields.io/badge/status-loop%20agents%20supported-brightgreen.svg)](docs/product/release-readiness.md) [![GitHub contributors](https://img.shields.io/github/contributors-anon/loopx-project/loopx?color=blue)](https://github.com/loopx-project/loopx/graphs/contributors) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/XmGgQyCFZd) [![Listed on dsh-plugin.org](https://dsh-plugin.org/badges/listed.svg)](https://dsh-plugin.org/plugins/loopx-project/loopx)

[Get started](#quick-start) · [Why LoopX](#why-loopx) · [See it in action](#see-loopx-in-action) · [Evidence](#evidence) · [Contribute](#contributing) · [Docs](https://loopx-project.github.io/loopx/docs/) · [简体中文](README.zh-CN.md)

Expand Down Expand Up @@ -41,9 +41,10 @@ then send one natural-language goal:
$loopx speed up this project's slowest workflow; compare approaches and verify the gains
```

LoopX turns that into visible tasks, gates and evidence as needed. Claude Code
uses `/loopx <complex task>`; see [host setup](#start-from-your-agent) for other
runtimes. Prefer a guided first run? [Choose a task below](#try-loopx).
LoopX turns that into a visible plan, decisions that need you, and verification
as needed. Claude Code uses `/loopx <complex task>`; see
[host setup](#start-from-your-agent) for other runtimes. Prefer a guided first
run? [Choose a task below](#try-loopx).

## 📰 News

Expand All @@ -54,10 +55,10 @@ runtimes. Prefer a guided first run? [Choose a task below](#try-loopx).
dates (UTC). -->

- **2026-10-25 · 🤝 [Long-horizon agent research: collaborators welcome](https://loopx-project.github.io/loopx/blog/edgebench-feedback-and-memory/)** — Exploring **breakthroughs in long-horizon outcomes under equal budgets**, through feedback, replanning and reproducible evaluation on EdgeBench and real-world tasks. Academic labs and industry teams are welcome to collaborate, comparing outcomes and total cost. [Discuss collaboration](https://github.com/loopx-project/loopx/discussions).
- **2026-10-20 · 🚀 [LoopX 2.0](https://github.com/loopx-project/loopx/releases/tag/v2.0.0)** — A shared TypeScript control plane and long-horizon research workbench. [Migration guide](docs/product/releases/v2.0.0.md) · [Engineering story](https://loopx-project.github.io/loopx/blog/typescript-control-plane-refactor/).
- **2026-10-20 · 🚀 [LoopX 2.0](https://github.com/loopx-project/loopx/releases/tag/v2.0.0)** — A shared TypeScript state layer and long-horizon research workbench. [Migration guide](docs/product/releases/v2.0.0.md) · [Engineering story](https://loopx-project.github.io/loopx/blog/typescript-control-plane-refactor/).
- **2026-10-14 · 🤖 [Agentic software](https://loopx-project.github.io/loopx/blog/semantic-software-development/)** — Connecting goals, evidence and human feedback to engineering delivery.
- **2026-10-02 · 🧠 [Long-horizon bootstrapping & RSI](https://loopx-project.github.io/loopx/blog/long-horizon-rsi/)** — Four months of developing LoopX with LoopX: public project history and a design perspective on system-level self-improvement.
- **2026-09-18 · 🧪 [LoopX × LHTB](https://loopx-project.github.io/loopx/benchmarks/lhtb/)** — A 46-task, same-model study provides empirical support for **trading more compute for better outcomes**: LoopX Heartbeat mean reward is 17.3% above Plain Codex and 10.6% above native Goal.
- **2026-09-18 · 🧪 [LoopX × LHTB](https://loopx-project.github.io/loopx/benchmarks/lhtb/)** — A 46-task, same-model study provides empirical support for **trading more compute for better outcomes**: LoopX 1.0.3 Heartbeat continued runs reach mean reward 17.3% above Plain Codex and 10.6% above native Goal.
- **2026-09-06 · 🎉 [LoopX 1.0](https://github.com/loopx-project/loopx/releases/tag/v1.0.0)** — A Personal Agent Workspace to follow agent work, act on decisions, and inspect delivered results across sessions. [Workspace guide](https://github.com/loopx-project/loopx/blob/v1.0.0/docs/guides/personal-workspace-user-guide.md).
- **2026-08-02 · ⏱️ [200+ hour trajectories shared on X](https://x.com/huangruiteng/status/2083904257494024425)** — Early owner-run examples spanning 200+ elapsed hours drew broad attention on X, showing work across execution, waits, human decisions and recovery. [Trajectories and limits](#open-source-issue-fix).

Expand All @@ -78,12 +79,12 @@ hand work to peers. A timer can keep a loop running without making it useful.

- **Continue without starting over.** Keep the Goal, accepted requirements,
decisions and evidence across sessions and restarts.
- **[Coordinate without losing ownership.](https://loopx-project.github.io/loopx/blog/agent-facing-kanban/#walkthrough)** Connect delegated work, dependent
- **[Coordinate without dropping context.](https://loopx-project.github.io/loopx/blog/agent-facing-kanban/#walkthrough)** Connect delegated work, dependent
artifacts, review and returned results while keeping responsibility explicit.
- **Judge progress by what changed.** Inspect deliverables, supporting and
refuting evidence, costs and the next decision—not just activity.

Your Agent runtime supplies the model and tools. LoopX’s semantic control plane
Your Agent runtime supplies the model and tools. LoopX’s durable state layer
preserves goals, acceptance, decisions, ownership and evidence across sessions
and runtimes for engineering, research and operations. Agents and people use
those facts to reassess what to do next. Human authorization still governs
Expand All @@ -97,25 +98,25 @@ protected actions.
| Manage personal projects, schedules and decisions in one place | [Personal Agent Workspace](#meet-the-personal-agent-workspace) |
| Let agents collaborate and deliver verifiable results | [Agent collaboration guide](docs/product/use-cases/cross-runtime/README.md) |

LoopX keeps the durable control state in one compact layer:
LoopX keeps the durable work state in one compact layer:

<picture>
<source media="(max-width: 640px)" srcset="docs/assets/harness-neutral.en.mobile.svg">
<img src="docs/assets/harness-neutral.en.svg" alt="Your harness runs the turn. LoopX carries the work." width="1200">
</picture>

Agent runtimes execute the work. LoopX governs the state that lets engineering,
Agent runtimes execute the work. LoopX keeps the state that lets engineering,
research, discovery, and operations loops continue across runs. It is not
another agent framework or a provider-specific orchestration runtime.

<details>
<summary>Advanced: how the control layer works and where it fits</summary>

<picture>
<source media="(max-width: 640px)" srcset="docs/assets/control-plane-board.en.mobile.svg">
<img src="docs/assets/control-plane-board.en.svg" alt="One turn is a governed state transition—not just a timer." width="1200">
<img src="docs/assets/control-plane-board.en.svg" alt="Advanced view of a governed state transition, not just a timer." width="1200">
</picture>

<details>
<summary>How the control plane works and where it fits</summary>

A useful mental model is an
**[agent-native Kanban for long-running work](docs/development/control-plane-course/00-concept-primer.md)**.
Cards carry identity, authority, evidence, and continuation. Moves are validated
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ export function ResearchAnalysisPanel({analysis: a, onHistory}: {analysis: Contr
return <div className={`research-analysis${result?.synthesis ? " has-synthesis" : ""}`} ref={a.panel} tabIndex={-1} role="region" aria-label={zh ? "轨迹深度分析" : "Trajectory analysis"} onKeyDown={event => {if (event.key === "Escape") {event.stopPropagation(); a.close();}}}>
<header><div>{result?.synthesis ? <><div className="analysis-report-title"><h3>{zh ? "研究汇报" : "Research report"}</h3>{scopeHelp}</div>
<div className="analysis-report-meta">{p?.title ? <p>{p.title}</p> : null}<span>{scope}</span></div></>
: <><h3>{zh ? "轨迹深度分析" : "Trajectory analysis"}</h3>{p?.title ? <p>{p.title}</p> : null}</>}</div><div className="analysis-header-actions">{result?.synthesis && onHistory ? <button type="button" onClick={onHistory} aria-label={zh ? "Goal 研究历程" : "Goal research history"} title={zh ? "Goal 研究历程" : "Goal research history"}><History size={16} aria-hidden/></button> : null}{result ? <button type="button" onClick={() => void a.read().catch(() => undefined)} aria-label={zh ? "刷新分析结果" : "Refresh analysis result"}><RefreshCw size={15} aria-hidden/></button> : null}<button type="button" onClick={a.close} aria-label={zh ? "关闭分析" : "Close analysis"}><X size={16} aria-hidden/></button></div></header>
: <><h3>{zh ? "轨迹深度分析" : "Trajectory analysis"}</h3>{p?.title ? <p>{p.title}</p> : null}</>}</div><div className="analysis-header-actions">{result?.synthesis && onHistory ? <button type="button" onClick={onHistory} aria-label={zh ? "研究历程" : "Research history"} title={zh ? "研究历程" : "Research history"}><History size={16} aria-hidden/></button> : null}{result ? <button type="button" onClick={() => void a.read().catch(() => undefined)} aria-label={zh ? "刷新分析结果" : "Refresh analysis result"}><RefreshCw size={15} aria-hidden/></button> : null}<button type="button" onClick={a.close} aria-label={zh ? "关闭分析" : "Close analysis"}><X size={16} aria-hidden/></button></div></header>
{a.error ? <div className="analysis-error" role="alert">{zh ? "分析请求未完成,已保存结果保留。" : "The analysis request did not complete; saved results are preserved."} <button type="button" onClick={() => void a.read().catch(() => undefined)}>{zh ? "重试读取" : "Retry reading"}</button><ContextHelp label={zh ? "失败详情" : "Failure details"}><p>{a.error}</p></ContextHelp></div> : null}
{a.snapshot?.catalog.unreadable_pack_ids?.length && !p?.continuation_unavailable ? <p className="analysis-warning">{zh ? "部分历史分析暂不可读" : "Some historical analyses cannot be read"} · {a.snapshot.catalog.unreadable_pack_ids.length}</p> : null}
<AnalysisReadState analysis={a}/>
Expand Down
29 changes: 16 additions & 13 deletions apps/presentation/dashboard/src/views/dashboard-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3923,18 +3923,22 @@ export function DashboardPage() {
function selectGoal(goalId: string, view?: WorkspaceGoalTab) {
void navigate({
hash: search.goalId === goalId ? keepCaseChapterHash : undefined,
search: (current) => ({
...current,
...("goalId" in current && current.goalId === goalId ? {} : clearedResearchSearch),
goalId,
workspace: undefined,
conversationBinding: undefined,
conversationSession: undefined,
messageSession: undefined, message: undefined,
workAgent: undefined, workSession: undefined,
todo: undefined,
view: view === "chat" ? "conversation" : view,
}),
search: (current) => {
const currentSearch = current as Partial<typeof search>;
const keepResearch = Boolean(currentSearch.research_goal) || currentSearch.goalId === goalId;
return ({
...current,
...(keepResearch ? {} : clearedResearchSearch),
goalId,
workspace: undefined,
conversationBinding: undefined,
conversationSession: undefined,
messageSession: undefined, message: undefined,
workAgent: undefined, workSession: undefined,
todo: undefined,
view: view === "chat" ? "conversation" : view,
});
},
});
}

Expand Down Expand Up @@ -3976,7 +3980,6 @@ export function DashboardPage() {
onChangeGoalRoot={rootGoalId => void navigate({
hash: !rootGoalId || rootGoalId === search.goalId ? keepCaseChapterHash : undefined,
search: current => ({...current,
...(!rootGoalId || ("goalId" in current && current.goalId === rootGoalId) ? {} : clearedResearchSearch),
workAgent: undefined, workSession: undefined, messageSession: undefined, message: undefined,
rootGoalId: rootGoalId ?? undefined, goalId: rootGoalId ?? ("goalId" in current ? current.goalId : ""), workspace: undefined}),
})}
Expand Down
Loading
Loading