Skip to content
Agentmart
Submit a tool

lazyriver

Goal-seek loop — probe, judge sufficiency, steer, journal; emits a plan or answer

Skill by Wave-Engineering

IndexedMIT★ 1
Write a review

Chalk Labs

Need help deploying lazyriver?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/wave-engineering-lazyriver

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Goal-seek loop — probe, judge sufficiency, steer, journal; emits a plan or answer

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Node.js package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/lazyriver

What's inside

Skill name
lazyriver
Description
Goal-seek loop — probe, judge sufficiency, steer, journal; emits a plan or answer
License
MIT
Instructions
347 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts

Files (5)

  • SKILL.md
  • bundle.mjs
  • lazyriver-workflow.bundled.js
  • lazyriver-workflow.js
  • river.js

SKILL.md (first lines)

<!-- introduction-gate: If introduction.md exists in this skill's directory AND
     the marker file /tmp/.skill-intro-lazyriver does NOT exist, read introduction.md,
     present its contents to the user, then create the marker: touch /tmp/.skill-intro-lazyriver
     Do NOT delete introduction.md — it lives in a protected directory.
     Do this BEFORE executing any skill logic below. -->

# LazyRiver — Goal-Seek Loop

Run a **goal** — not a plan — to **sufficiency**. `/lazyriver` is the goal-seek half of
the executor model: give it an insight to reach, a hypothesis to test, or a design to
converge on, and it runs a `probe → journal → judge → steer` loop until the goal is met,
then emits either a **plan** (hand to `/devspec`) or a **direct answer** (hand to the user).

**See Also:** `docs/executor-model-devspec.md` (Plan #822 — the two-mode executor: this
skill is the goal-seek activity, distinct from the plan-execution activity that
`/wavemachine` / `/nextwave` run).

> **This is NOT a variant of `/wavemachine` or `/nextwave`.** Those execute a *known DAG to
> completeness* (plan-execution). `/lazyriver` seeks a *goal to sufficiency* (goal-seek).
> Different termination condition, different parallelizability, different agency profile.
> Conflating the two is the exact conceptual error Plan #822 fixes — see
> **Epistemic vs Artifact Dependency** below.

---

## Invocation

```
/lazyriver <goal statement>
```

Optional:

```
/lazyriver <goal statement> --resume <journal-path>
```

`<goal statement>` is a goal, not a task list. It terminates on a **judgment** ("are we
there?"), not a checklist:

| Goal type | Example |
|-----------|---------|
| Understand | `/lazyriver "understand why merges stall on the kahuna branch"` |
| Test a hypothesis | `/lazyriver "is the 1.18× pool advantage real or measurement noise?"` |
| Converge a design | `/lazyriver "get to an executor model we trust"` |
| Root-cause | `/lazyriver "find the root cause of the reseed fidelity loss"` |

`--resume <journal-path>` reopens a prior session's **findings journal** (see below) and
continues the loop from the accumulated state — the loop never starts cold if a journal
exists. This is what makes a cord-fire (escalation) recoverable rather than terminal.

---

## Core Loop

Each **leg** of the loop is one recorded, resumable unit. A leg runs four steps in order:

```
Loop (each leg):
  1. Probe   — run the current leg: research, experiment, implement-a-spike, or analyze.
               The probe is chosen by Step 4 of the *previous* leg (or the goal, on leg 1).
  2. Journal — append this leg's findings to the durable per-session journal.
  3. Judge   — sufficiency gate: "are we there yet?"
                 SUFFICIENT       → emit output (plan | answer) → TERMINATE
                 DIMINISHING/CAP  → escalation cord fires → ESCALATE to user
                 NOT YET          → continue to Step 4
  4. Steer   — formulate the next probe *from what this leg just taught*:
               "given what we now know, what is the single most informative next probe?"
               → set it as leg N+1's Probe → goto 1
```

The order is load-bearing: **journal before judge** (so the sufficiency call is made
against a durable record, and a cord-fire never loses the leg it just ran), and **judge
before steer** (so you never formulate a next probe for a goal that is already met).

This is a `ralph-wiggum` loop *unrolled*: a raw `while not done: try()` retry is agency ≈ 0.
Unrolling upgrades it three ways — **+ agency** (Step 4 judges the result and steers the
next probe), **+ memory** (Step 2's journal accumulates; the loop gets smarter each leg),
and **+ durability** (each leg is a recorded, resumable unit). LazyRiver = ralph-wiggum
**with a brain and a notebook.** Without the sufficiency gate and the escalation cord it
would just be an *expensive infinite loop* — the characteristic ralph failure mode.

---

## Execution Modes — in-session vs. background Workflow

The `probe → journal → judge → steer` loop above runs two ways; the *logic is
identical*, only *where it runs* differs:

- **In-session (synchronous).** The main agent runs the loop directly in its own
  context — the original mode. Best for a short goal-seek you want to watch, or
  when you are already the agent doing the probing.
- **Background Workflow (detached, #844).** The loop runs as a **background
  Workflow** — `skills/lazyriver/lazyriver-workflow.bundled.js` — so the
  operator's session stays interactive while the goal-seek floats. Same
  architecture the wave engine uses (`per-wave-workflow.js`); it completes the
  executor model's symmetry — both plan-execution *and* goal-seek run as
  background Workflows sharing the substrate, keeping their distinct logic.

**Launching the background Workflow** — invoke the Workflow tool with
`scriptPath: skills/lazyriver/lazyriver-workflow.bundled.js` and `args` (a JSON
object):

| arg | meaning |
|-----|---------|
| `goal` | the goal statement (required) |
| `journalPath` | durable markdown path the leg agents append to and `resume` reopens (**required** — the Workflow script has no filesystem, so the launcher supplies the path; all journal I/O + timestamps happen inside the leg agents, which have Bash/Write) |
| `maxLegs` | leg-count cap (default 10) |
| `resume` | `true` to rehydrate from an existing `journalPath` — the loop never starts cold if a journal exists. Resume is a "keep probing" signal: the diminishing cord counter **resets** (fresh legs, not an instant re-fire); raise `maxLegs` to resume past a leg-cap |

**The verdict** the Workflow returns — the driver *surfaces* it; it is **never a
silent background stall**:

- `{ outcome: 'sufficient', output: { kind: 'plan' | 'answer', content }, journalPath, legs }`
  — the goal is met; hand `output` to `/devspec` (plan) or the user (answer), per the Output Contract.
- `{ outcome: 'escalated', reason, journalPath, legs }` — the **escalation cord**
  fired (`cord:diminishing` = 2 consecutive zero-finding legs, or `cord:leg-cap`).
  The driver surfaces the journal + the sufficiency question to the operator,
  exactly like a wave HOLD. The journal is intact and `resume`-able (CT-04).

From Wave-Engineering/claudecode-workflow, MIT.

More from Wave-Engineering/claudecode-workflow

Signals

Stars
1
Forks
1
Open issues
85
Last commit (this folder)
Jul 6, 2026 (3 months ago)
Last release
Oct 24, 2026 (5 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from Wave-Engineering

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get lazyriver running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying lazyriver?

CallGet help
Cite this page

lazyriver skill. Agent Mart. https://agentmart.dev/skills/wave-engineering-lazyriver (last updated 2026-10-24)