Harness spec 3.2.0 in the CLI: effort levels, reasoning round-trip, no absolute paths
ci / check (push) Waiting to run

Levels (models/schema.json levels): provider/effort.ts levelsOf/levelFields/
readLevel — `off` only with thinking_switch and sends enable_thinking false
and no effort, `default` for a model that takes no efforts and sends
nothing, a level not offered is read as the start level. The engine's
effort is a level; /effort shows nothing for one level, a Thinking switch
for [off, X], a list otherwise; the status bar follows. /v1/models'
thinking_switch, efforts [] and capacity.parallel are read
(lembas/webui.ts); session/capacity.ts counts parallel slots.

Reasoning (context.md §8): an assistant message of the current turn
carries reasoning_content (provider/common.ts turnReasoning,
openai-chat.ts); step-boundary deliveries, nudges and the wrap-up are
marked turn: false and do not start a turn.

Paths (context.md §11): the <env> block names the project and, started
below the root, that directory relative to it (assemble.ts envLines);
instruction files and @ attachments are named from the root or as ~/…;
file tools and bash resolve relative paths against the project root.

The team rules (team/team.ts) and conformance runners for levels,
reasoning, paths and team; the team runtime follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-11-09 08:36:55 +00:00
1 parent 5c23087cef
commit fbefe7f844
36 files changed
+1168 -153

No files matched your search

+7 -6
View File
@@ -3,7 +3,8 @@ import { useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
import { createEffect, createMemo, createSignal, onCleanup, Show } from "solid-js"
import { stricterMode, type App as Runtime } from "../app.ts"
import { isLocal } from "../config/paths.ts"
import type { Effort, Mode } from "../config/schema.ts"
import type { Mode } from "../config/schema.ts"
import { levelLabel, type Level } from "../provider/effort.ts"
import { COMMANDS, findCommand, type CommandCtx } from "./commands.ts"
import { Dialog, type DialogSpec } from "./components/dialog.tsx"
import { Messages } from "./components/messages.tsx"
@@ -58,7 +59,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
const refresh = () => setRev((n) => n + 1)
const mode = () => (rev(), app.engine.mode)
const model = () => (rev(), app.engine.model.ref)
const effort = () => (rev(), app.engine.effort ?? "")
const effort = () => (rev(), levelLabel(app.engine.model, app.engine.effort))
const busy = () => view.state.phase !== "idle"
const branch = () => (rev(), app.project.gitRoot ? currentBranch(app.project.gitRoot) : undefined)
// A word in the status bar that goes by itself (a copy): it says something happened without
@@ -223,8 +224,8 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
setMode(m: Mode) {
app.settings.set("mode", m)
},
setEffort(e: Effort | null) {
app.settings.set("effort", e ?? "off")
setEffort(e: Level) {
app.settings.set("effort", e)
},
setTheme(name: string) {
try {
@@ -246,7 +247,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
confirmStop("reload", () => {
// Back on this session, with what it was using; everything else comes from the files again.
const e = app.engine
const args = [...(isLocal() ? ["-l"] : []), ...(e.sessionId ? ["-s", e.sessionId] : []), "-m", e.model.ref, "--mode", e.mode, "-e", e.effort ?? "off"]
const args = [...(isLocal() ? ["-l"] : []), ...(e.sessionId ? ["-s", e.sessionId] : []), "-m", e.model.ref, "--mode", e.mode, "-e", e.effort]
void app
.close()
.catch(() => {})
@@ -402,7 +403,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
const id = view.shellStart(command)
const t0 = performance.now()
bashTool
.run({ command }, { ...app.engine.o.toolCtx, signal: new AbortController().signal, bashTimeline: false })
.run({ command, cwd: app.engine.o.toolCtx.cwd }, { ...app.engine.o.toolCtx, signal: new AbortController().signal, bashTimeline: false })
.then((r) => {
view.shellEnd(id, r, performance.now() - t0)
app.engine.pendingContext.push(`<shell command="${command.replaceAll('"', "'")}">\n${r.output}\n</shell>`)