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
15 changes: 15 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,21 @@ submission behavior, permission boundaries, or launch new benchmark jobs.
After self-merging, sync local `main`, leave unrelated untracked local artifacts
alone, and continue with the next safe project batch.

## First-Screen Review Gate

Treat the first visible screen of public product surfaces as owner-reviewed
presentation, not as ordinary copy. Before committing, pushing, or self-merging
changes that alter the first viewport, hero block, primary CTA, or opening
navigation of README, hosted frontstage, showcase index pages, product home
pages, or similarly prominent public entry points, show the user a preview
first and wait for approval.

The preview should be concrete enough to judge the presentation: provide the
local URL and, when the surface is visual HTML, a screenshot or browser view of
the first viewport. Do not move the review gate into a PR comment, todo note, or
final summary after the fact. It must happen before the public first-screen
change is finalized.

## Public And Private Boundary

Do not commit internal department, team, customer, meeting, reporting,
Expand Down
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,23 @@ points:
For more cases, open the [showcase catalog](docs/showcases/README.md). For a
full presenter material, see the experimental notes below.

### Experimental: Today Value Path

This is not replacing the first screen. It is an experimental entry point for
users who already understand the control-plane idea and want to pick one useful
LoopX capability today:

| Capability / path | Expected output | User value metric |
| --- | --- | --- |
| PR review/comment -> fix loop | Branch-ready fix packet with repro, smoke result, and remaining review owner. | Fewer dropped review threads; faster path from comment to validated patch. |
| Overnight PR-sized refactor | Reviewable slice list, validation notes, successor todo, and merge boundary. | More merged commits without turning the next morning into a giant diff audit. |
| P0 blocked -> safe fallback | Kernel projection of the exact user gate, safe fallback todo, quota decision, and evidence boundary inside an active goal. | Less idle agent time while preserving human judgment on the blocked path. |

Start the goal normally with `/loopx <goal text>`. The PR review and refactor
paths can be requested directly in plain language; the P0 safe-fallback path is
a repository kernel behavior that appears when an active goal has a concrete
blocking user gate and safe P1/P2 work remains.

## User Mental Model

LoopX has more kernel concepts than a user should have to think about every
Expand Down
15 changes: 15 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,21 @@ loopx bootstrap \
完整案例目录见 [docs/showcases/README.md](docs/showcases/README.md)。
更完整的演示材料放在文末实验性能力里。

### Experimental: Today Value Path

这不会替代首屏。它先作为实验性入口放在案例区下面,给已经理解控制面价值的用户
快速选一个今天就能用的 LoopX 能力:

| 能力 / 路径 | 预期产物 | 用户价值指标 |
| --- | --- | --- |
| PR review/comment -> fix loop | 可复核的修复包:repro、smoke 结果、剩余 review owner。 | 更少遗漏 review 线程,更快从 comment 走到 validated patch。 |
| Overnight PR-sized refactor | 可 review 的 slice 列表、验证记录、后续 todo、merge 边界。 | 增加可合并 commit,而不是第二天早上面对一个巨型 diff。 |
| P0 blocked -> safe fallback | 在已有 goal 内由 kernel 投影具体 user gate、安全 fallback todo、quota 决策和证据边界。 | 等人决策时减少 agent 空转,同时保留人类判断。 |

正常用 `/loopx <goal text>` 启动目标即可。PR review 和 refactor 路径可以用自然语言
直接描述;P0 safe fallback 不是单独命令,而是已有 goal 出现具体阻塞 user gate、
且还有安全 P1/P2 工作时触发的仓库 kernel 行为。

## 它是什么

LoopX 不是另一个 agent runtime,也不是要替代 Codex、Claude Code、
Expand Down
63 changes: 63 additions & 0 deletions apps/dashboard/src/views/frontstage-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -839,6 +839,67 @@ const showcaseMotionTones = [
},
];

const todayValueWorkflows = [
{
workflow: "PR review/comment -> fix loop",
output: "Branch-ready fix packet with repro, smoke result, and remaining review owner.",
metric: "Fewer dropped review threads; faster path from comment to validated patch.",
start: "/loopx fix this PR feedback",
},
{
workflow: "Overnight PR-sized refactor",
output: "Reviewable slice list, validation notes, successor todo, and merge boundary.",
metric: "More merged commits without turning the next morning into a giant diff audit.",
start: "/loopx split this refactor into reviewable slices",
},
{
workflow: "P0 blocked -> safe fallback",
output: "Kernel projection of the exact user gate, safe fallback todo, quota decision, and evidence boundary.",
metric: "Less idle agent time while preserving human judgment on the blocked path.",
start: "Appears inside an active /loopx goal when a concrete P0 gate blocks one lane and safe P1/P2 work remains.",
},
];

function ExperimentalTodayValuePanel() {
return (
<Panel icon={ListChecks} title="Experimental Today Value Path">
<div className="space-y-4 p-4" data-testid="frontstage-today-value-experiment">
<div className="flex flex-wrap items-start justify-between gap-3">
<div>
<h3 className="text-base font-semibold text-slate-950">Pick one capability that earns value today</h3>
<p className="mt-1 max-w-3xl text-sm leading-6 text-slate-600">
This lower-priority module does not replace the first screen. It gives evaluators three concrete
LoopX capabilities with expected output and user-facing value metrics.
</p>
</div>
<Badge variant="info">experimental</Badge>
</div>
<div className="grid gap-3 lg:grid-cols-3">
{todayValueWorkflows.map((item) => (
<div className="rounded-md border border-slate-200 bg-slate-50 p-4" key={item.workflow}>
<div className="text-[11px] font-semibold uppercase tracking-normal text-slate-500">capability</div>
<h4 className="mt-2 text-sm font-semibold leading-6 text-slate-950">{item.workflow}</h4>
<div className="mt-3 space-y-3 text-xs font-medium leading-5 text-slate-600">
<p>
<span className="font-semibold text-slate-950">Output: </span>
{item.output}
</p>
<p>
<span className="font-semibold text-slate-950">Value metric: </span>
{item.metric}
</p>
<code className="block rounded-md border border-slate-200 bg-white px-2 py-1.5 text-[11px] text-slate-700">
{item.start}
</code>
</div>
</div>
))}
</div>
</div>
</Panel>
);
}

function ShowcaseMotionBoard() {
const [activeCaseId, setActiveCaseId] = useState(frontstageShowcases[0]?.id ?? "");
if (!frontstageShowcases.length) {
Expand Down Expand Up @@ -1994,6 +2055,8 @@ function FrontstageRoute({

{!isDeveloperMode ? <ShowcaseMotionBoard /> : null}

{!isDeveloperMode ? <ExperimentalTodayValuePanel /> : null}

{!isDeveloperMode ? <ShowcaseCasePackPanel /> : null}

{isDeveloperMode ? <DeveloperOnboardingPanel /> : null}
Expand Down
18 changes: 14 additions & 4 deletions docs/showcases/cases/0617-blocked-p0-safe-rotation.en.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,25 @@
.metric{border:1px solid rgba(255,255,255,.1);border-radius:10px;padding:17px 19px;background:#0c0c0e}
.metric strong{display:block;font-size:24px;letter-spacing:-.02em;color:#fafafa}
.metric span{display:block;margin-top:5px;font-family:'Geist Mono',ui-monospace,monospace;font-size:10.5px;color:#62666d;text-transform:uppercase}
.mini-metrics{display:flex;flex-wrap:wrap;gap:8px;margin-top:13px}
.mini-metrics span{font-family:'Geist Mono',ui-monospace,monospace;font-size:10.5px;color:#aeb3ba;border:1px solid rgba(255,255,255,.1);border-radius:5px;padding:4px 8px;background:#0b0b0c}
.search{width:100%;height:42px;margin:22px 0 16px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:#0e0e10;color:#f1f2f3;padding:0 12px;font:14px 'Geist',system-ui,sans-serif}
.cards{display:flex;flex-direction:column;gap:12px}
.card{display:block;text-decoration:none;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:#0e0e10;padding:18px 20px}
.card:hover{border-color:color-mix(in srgb,var(--accent) 55%,transparent)}
.card .meta{font-family:'Geist Mono',ui-monospace,monospace;font-size:10.5px;color:#62666d;margin-bottom:8px}
.card p{font-size:14px;margin-top:9px}
.hide{display:none}
.experiment{margin-top:24px;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:#0e0e10;padding:20px}
.experiment h3{font-size:18px}
.experiment p{font-size:14px;margin-top:8px}
.experiment-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
.experiment-card{border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#0b0b0c;padding:14px}
.experiment-card strong{display:block;font-size:14px;line-height:1.45}
.experiment-card span{display:block;margin-top:9px;font-size:13px;line-height:1.55;color:#9ea3aa}
.experiment-card em{display:block;margin-top:10px;font-style:normal;font-family:'Geist Mono',ui-monospace,monospace;font-size:10.5px;line-height:1.55;color:var(--accent)}
footer{margin-top:76px;color:#62666d;font-family:'Geist Mono',ui-monospace,monospace;font-size:10.5px;line-height:1.7}
@media(max-width:720px){article{padding:52px 18px 90px}.panel-row{grid-template-columns:1fr}.panel-key{border-right:0;border-bottom:1px solid rgba(255,255,255,.07)}.metric-grid,.evidence-grid{grid-template-columns:1fr}.source-ref{grid-template-columns:1fr;gap:6px}}
@media(max-width:720px){article{padding:52px 18px 90px}.panel-row{grid-template-columns:1fr}.panel-key{border-right:0;border-bottom:1px solid rgba(255,255,255,.07)}.metric-grid,.evidence-grid,.experiment-grid{grid-template-columns:1fr}.source-ref{grid-template-columns:1fr;gap:6px}}
</style>
</head>
<body>
Expand Down Expand Up @@ -110,15 +120,15 @@ <h1>Blocked P0 with safe P1/P2 rotation</h1>


<div class="section-head"><span>01</span><h2>Case context</h2></div>
<div class="text-stack"><p>This case shows what should happen when a P0 route is blocked by a user decision: the system should neither keep forcing that lane nor stop the whole goal. The original shape was a benchmark rotation where one lane needed a large local image while other no-upload benchmark work remained safe.</p><p>The public repository does not expose raw benchmark tasks or local image names. It reproduces the control-plane behavior with a synthetic smoke.</p></div>
<div class="text-stack"><p>This case shows what should happen when a P0 route is blocked by a user decision: the system should neither keep forcing that lane nor stop the whole goal. The original shape was a benchmark rotation where one lane needed a large local image while other no-upload benchmark work remained safe.</p><p>The public repository does not expose raw benchmark tasks or local image names. It reproduces the control-plane behavior with a synthetic smoke. The user-facing value is seeing one concrete P0 decision while safe fallback work can continue and the gated lane does not burn automated progress budget.</p></div>

<div class="section-head"><span>02</span><h2>Repository evidence</h2></div>
<div class="panel">
<div class="panel-row"><div class="panel-key">Proof</div><div class="panel-val"><p>A user decision should not block all safe work.</p></div></div>
<div class="panel-row"><div class="panel-key">LoopX intervention</div><div class="panel-val"><p>concrete user todo, safe fallback, quota control</p></div></div>
</div>

<div class="evidence-grid"><div class="evidence-card"><div class="evidence-label">Synthetic fixture</div><p>`examples/showcase-0617-blocked-p0-safe-rotation-smoke.py` creates a P0 user gate, a P0 agent todo blocked by that gate, and a P1 no-upload fallback.</p></div><div class="evidence-card"><div class="evidence-label">Quota contract</div><p>The smoke asserts `should_run=True`, `requires_user_action=True`, `safe_bypass_allowed=True`, and `safe_bypass_kind=scoped_user_gate_fallback`.</p></div><div class="evidence-card"><div class="evidence-label">Selected fallback</div><p>The fixture selects `terminal_bench_no_upload` while preserving the `ale_image` gate as the user-visible blocker.</p></div><div class="evidence-card"><div class="evidence-label">Rendered evidence</div><p>The smoke checks markdown for `scoped_user_gate_fallback` and safe no-upload Terminal-Bench rotation.</p></div></div>
<div class="metric-grid"><div class="metric"><strong>1</strong><span>concrete P0 user decision</span></div><div class="metric"><strong>1</strong><span>safe fallback lane</span></div><div class="metric"><strong>0</strong><span>gated-lane auto-progress</span></div><div class="metric"><strong>0</strong><span>private upload dependency</span></div></div>
<div class="evidence-grid"><div class="evidence-card"><div class="evidence-label">Synthetic fixture</div><p>`examples/showcase-0617-blocked-p0-safe-rotation-smoke.py` reproduces a P0 user gate, a P0 agent lane blocked by that gate, and a P1 no-upload fallback.</p></div><div class="evidence-card"><div class="evidence-label">Quota contract</div><p>The smoke pins `should_run=True`, `requires_user_action=True`, `safe_bypass_allowed=True`, `safe_bypass_kind=scoped_user_gate_fallback`, and related fallback evidence.</p></div><div class="evidence-card"><div class="evidence-label">Selected fallback</div><p>The fixture selects `terminal_bench_no_upload` while preserving the `ale_image` gate as the user-visible blocker.</p></div><div class="evidence-card"><div class="evidence-label">Rendered evidence</div><p>The smoke checks markdown for `scoped_user_gate_fallback` and safe no-upload Terminal-Bench rotation.</p></div></div>

<div class="section-head"><span>03</span><h2>LoopX behavior</h2></div>
<ul class="flow"><li><span class="flow-num">1</span><div class="flow-body"><div class="flow-title">The user todo names the concrete P0 decision instead of saying only owner gate.</div></div></li><li><span class="flow-num">2</span><div class="flow-body"><div class="flow-title">The agent does not spend compute on the gated lane; it selects fallback work that does not depend on the decision.</div></div></li><li><span class="flow-num">3</span><div class="flow-body"><div class="flow-title">State records both the blocker and the fallback reason so P0 can resume later.</div></div></li></ul>
Expand Down
Loading
Loading