Skip to content

skills(experiment): the laboratory — per-record entry and the design-before-data walk - #1071

Merged
leeovery merged 13 commits into
feat/experiment-enginefrom
feat/experiment-skills
Sep 1, 2026
Merged

skills(experiment): the laboratory — per-record entry and the design-before-data walk#1071
leeovery merged 13 commits into
feat/experiment-enginefrom
feat/experiment-skills

Conversation

@leeovery

Copy link
Copy Markdown
Owner

PR2 of the experiment-phase stack, on #1070. Built fresh against design/experiment-phase.md (#1057); replaces the skills layer of the closed #1061.

What this is

The two skills of the laboratory:

  • workflow-experiment-entry — internal, per-record: the epic menu routes /workflow-experiment-entry epic {wu} {topic} {E-id}; linear callers arrive without an id and pick from the register via the engine-rendered experiment-pick menu. Validates the series (missing/cancelled → terminal blockers) and the record (concluded/abandoned → the verdict stands; a new spawn is the reopen), then hands off. Blockers, the picker, and the resolve loop live in references — the backbone is a table of contents.
  • workflow-experiment-process — the linear walk: guidelines + initialization (a conceived record reads the problem file and the spawning conversation's document on disk, in full — it is mid-flight and unindexed; a record in flight reads its own frozen design instead), collaborative design against the template, the briefing whose approve freezes the design (experiment approve), the mostly-autonomous run (execution shape chosen for dependable results; no custom workflow agents; harness code is instrument, living with the record), the report in scientific-method order, the one-line verdict, and the bridge back — the menu is the router.

The amendment protocol governs the freeze's one escape: dated amendments re-confirmed while no results are visible; frozen for good after. Splits (E{n}.{m}) are the run leg's internal walk — each sub designs, freezes, runs, and concludes on its own row; the parent synthesises and releases the wait once. Abandonment is first-class at every leg and terminal branches route themselves, including engine refusals (a parent conclude over live subs routes back into the split walk).

No knowledge-base contact, no triage, no session loop, no off-topic machinery — the remit is the experiment; the spawning conversation owns everything else.

Supporting edits

Engine (on the PR1 layer): the experiment-pick render surface; menu labels take the verb + italic-tail form (Enter E1 window-placement — *Topic · experiment*); the approve option's label cut to a terse clause. Periphery: the bridge's epic-continuation gloss covers the experiment route's fourth positional; seed/brief shared references name the experiment consumer; the conventions-lint carve-out for in-flight process skills is gone — the presence-hook requirement binds in full.

Two adversarial review passes (conventions incl. progressive disclosure, and routing/reachability with live-engine reproduction) ran over this layer; every verified finding is folded in.

Gates: npm test 2665/2665 · npm run test:cli green · npm run test:migrations green · npm run typecheck clean.

🤖 Generated with Claude Code

leeovery and others added 13 commits September 1, 2026 17:34
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ort, verdict

The linear per-record walk: initialization reads the problem file and the
spawning conversation on disk, the design freezes at the user-confirmed
briefing, the run measures as designed with splits walked in miniature,
and the verdict routes back through the bridge. The conventions lint's
in-flight carve-out empties — the presence-hook requirement now binds in
full.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Section-body conditionals are H4, each branch routes itself, and the
abandon load carries its return footer — a sub put down mid-run resumes
the measurement instead of falling off the step. The approved branch
starts measuring on entry: the freeze's approve option was the go, and
a later sitting re-enters through the menu.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Terminal blockers take the two-section shape (plain fence, guidance as
a rendered signpost, no phase title), the no-id path renders the
engine's picker beneath the register, and the handoff's Record path
drops its trailing slash. The speculative $2-as-id parse leaves — no
caller produces that shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sub walk is self-contained in the run leg — advance before the
sub's measurement, verdict inline, an abandoned sub skips its
remaining legs, and the parent binding is never rebound. The run's
opening re-reads the record (stale-status fix) and gains the resume
and terminal edges; the live-sub refusals in conclude and abandon
route back to the run; the amendment protocol gets its Load edge and
one exit per answer; guidelines take the corpus name; the recovery
protocol re-derives the record directory and fetches the register at
the announce it serves.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… lint carve-out retires

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ndonment

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The put-down loads defer to their reference's own routing — a parent's
abandonment never resumes measurement; the record picker's sub-redirect
carries its routing line; the split walk states its bindings honestly
(the parent's hold in the file, a loaded leg binds the sub for its
duration) and a sub's measurement commits name the sub. Initialisation
draws the boundary at the freeze: an unfrozen record — conceived or
designed — reads the spawning conversation's ground, and only an
approved or running one takes the design-is-the-ground read. The design
and briefing legs meet an engine refusal as what it is — the record
moved beneath the session — and route to the close; the cancelled-series
blocker speaks the triangle (rows stand; a new spawn starts the next
experiment); the guidelines drop the triage vocabulary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
"Park" and "put down" leave the laboratory prose — both read as a
resumable pause the record never offers, and park is the roadmap's word.
The briefing branch keys on the gate's b/abandon, and every abandonment
route says abandon.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…record resolves inside the phase

Step 1 parses work_type, work_unit, topic — identical to every sibling
entry; no record id travels in routing. select-record.md becomes the
resolver: one live record auto-selects, several render the register and
the picker (the sub-to-parent redirect and the re-ask now handle picker
responses alone — a terminal or unknown pick re-asks), and a finished
series meets a terminal blocker in the validate-series shape.
validate-record.md folds into the resolver's tail — resolution only
yields live records, so its terminal blockers were unreachable; the
status routing (conceived silent, in-flight Resuming) survives as its
C section. The process's Step 6 becomes the return leg's loop:
next-experiment.md reads the series after a terminal transition, offers
the engine-rendered next-or-menu gate while live records remain — on
next it re-runs select-record.md (one home for the resolution) and
loops to initialization; on menu, or over a finished series, the bridge
exit runs. The bridge's positional gloss returns to the uniform
three-positional statement.

The resolver's auto-select one-liner joins the ratchet pins — the
Auto-Select convention's line is prose-authored at every sibling site
(view-plan, display-single, check-dependencies), and this entry mirrors
that family rather than inventing a one-off engine surface for it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s back-out routes clean

The entry's Workflow Context gains the sibling pipeline table with the
laboratory bolded in its slot. select-record handles b/back — no record
resolves, and each caller routes the back-out: the entry ends on a clean
terminal (the menu is the way back), the return leg's next pick exits
through the bridge the way m/menu does.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rded, the shapes the conventions name

The picker's resolution guards the resolved id first — a sub answer
resolves to its parent, and unknown or finished records re-ask alike.
A terminal record entering initialization is caught before any ground
is read. Conclude, abandon, and the split's sub-conclude gain the
general refusal branch design already carried: nothing recorded, say
why in one line, fix and re-run — no commit, no false release. The
return leg opens neutral (a record ended, or moved beneath the
session) and its next pick self-routes both outcomes. The run leg's
embedded arrows go bare; the design leg's double-nested conditionals
promote to H4; the merged-span headings take the value form; the
pipeline table renders the phase's slot as the sibling entries do.
The cancelled-series blockers and the engine's reactivate refusal
name the reopen-first recovery.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@leeovery
leeovery force-pushed the feat/experiment-skills branch from fe82558 to 293cdc7 Compare September 1, 2026 17:27
@leeovery
leeovery merged commit e754631 into main Sep 1, 2026
@leeovery
leeovery deleted the feat/experiment-skills branch September 1, 2026 17:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant