Backend now streams native thinking tokens via StreamEvent.Reasoning.
The no-op scratchpad tool is redundant.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
system prompt: require task list for multi-step work
agents: remove preTurn hook; rely on agentSpawn prime + system prompt
backend: require OLLIE_BACKEND/OLLIE_MODEL env vars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move inline JSON prompt strings to prompts/agent-*.md files, referenced
via $OLLIE/x/prime in the new executable prompt array. Move all
prime calls (tools-*, beads) from hooks.agentSpawn into prompt.
Rename greybeard to sysarchitect.
preTurn now has two branches: no plan → remind task_add; open tasks → remind
task_check. Blank/whitespace-only arguments to task_add are silently skipped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removing it caused the model to fall back to reasoning_think for planning.
The preTurn reminder is necessary to override that behavior.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
printf format string starting with '-' was treated as a flag; use '--' to
terminate option parsing. Agents reading individual tool scripts to understand
them should use $OLLIE/t/idx instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Agents must not read $OLLIE/s/*/chat or similar to reconstruct context
— the conversation is already in the context window. memory_recall is
the right tool for cross-session facts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace 'task prime' hook with inline .beads walk in all agent configs —
no wrapper script needed. Drop 'prime' subcommand from scripts/x/task.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All agents now run `bd list --status open` after each turn. Output is
injected into session history (not stdout) so the model is aware of open
tasks on the next turn without triggering autonomous continuation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tool primes (tools-file, tools-reasoning, tools-memory, tools-subagent,
tools-elevate) moved from preTurn to agentSpawn across all agent configs.
Context is now injected once at session refresh points (start, post-clear,
post-compaction) rather than repeated on every turn.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add x/elevate-adapter-start: checks if the adapter is already listening
(connect test), starts it in the background if not. Exits 0 always so it
never blocks session startup. Wire it into agentSpawn in all agent configs
and install it via mkfile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Python adds the script directory to sys.path[0] at startup and tries to
create a FileFinder for it. When the script lives on a 9P FUSE mount the
FileFinder init fails before any stdlib import can succeed. sys is a
builtin and loads without filesystem access, so strip the path first.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both x/elevate and elevate-adapter-superpowerd now default the socket
path to $XDG_RUNTIME_DIR/ollie/elevate.sock (falling back to
/run/user/<uid>/ollie/elevate.sock) when OLLIE_ELEVATE_SOCKET is unset.
Add OLLIE_ELEVATE_SOCKET to env sections of both sandbox configs.
Add {XDG_RUNTIME_DIR}/ollie to restricted sandbox filesystem rw rules
so x/elevate can reach the socket. Update README env block and
scripts/README socket path docs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
x/elevate is now a generic client: reads OLLIE_ELEVATE_SOCKET, sends
{cmd,cwd}, reads back {stdout,stderr,exit_code}. All backend-specific
logic moves to adapters. Add elevate-adapter-superpowerd as the
reference adapter: owns the socket lifecycle, translates the ollie
protocol to superpowerd JSON-RPC ExecuteCommand. Add OLLIE_ELEVATE_SOCKET
to env docs. Update scripts/README.md with protocol spec, adapter
setup, and guide for writing custom adapters.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The purpose is to run steps outside the Landlock sandbox, not to gain
privileges. Clarify the constraint (kernel-enforced, must reach an
external process), reframe the minimal example and superpowerd walkthrough
accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sudo/doas don't work: Landlock is kernel-level and applies regardless
of user privileges within the sandboxed process. The backend must hand
the command to a process spawned outside landrun entirely. The
superpowerd Unix socket pattern is the right model.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
x/elevate handles token acquisition itself via the re-exec through
superpowers run-session when SUPERPOWERD_SESSION_TOKEN is absent.
No manual injection is needed; the paragraph was wrong.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document the plugin interface contract (args, cwd, stdout/exit code),
plugin path resolution (OLLIE_PLUGINS_PATH / ~/.config/ollie/scripts/x/),
a minimal exec-only example, a step-by-step walkthrough of the default
superpowerd implementation including session token injection, and custom
backend examples (sudo, doas, disable).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add x/ to the namespace list and add an x/elevate section describing
its role as the elevation plugin for execute_code elevated steps, the
calling convention, the default superpowerd implementation, and how to
replace or disable it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sandboxing is not layered. It is applied specifically to execute_code:
each step is wrapped with landrun using a named config from
~/.config/ollie/sandbox/<name>.yaml (default: "default"). Steps marked
elevated:true bypass the sandbox via x/elevate. Remove superpowerd
reference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>