crucible 0.38.0
Fixed
-
The prompt no longer draws
window unknown. Before a model has said how
much of its window a session has used, the reading row keeps its place and
says nothing; the bare status row ends at the session facts. The box that
takes a key is its own screen and carries none of the prompt's chrome. -
A command's answer is no longer clipped by the mark it hangs under. An
answer that reached the window's edge lost its last word once the corner
mark was put in front of it; it now folds short of the mark, so the/logout
answer about an environment key and the/loginanswer about a store that
cannot be written are read whole. -
Unsupported sandbox errors no longer recommend a removed setting. The
native-backend refusal no longer suggests the rejectedsandbox.modekey. -
Protected names remain protected across macOS filesystem aliases. The
Seatbelt policy matches repository and Crucible metadata names without case,
so a case-only APFS directory rename cannot make their contents writable or
move them outside the protected namespace. -
Sandbox reports preserve fractional time limits. Command and session
ceilings retain their exact duration instead of rounding down to whole seconds. -
A drag scrolls the transcript. A drag resting at the top or foot of the
transcript carries it a row at a time, and the wheel scrolls it while the
button is held. The highlight stays on the words it began on, and a release
copies what scrolled off the window along with what is still on it. -
Long call, result and table lines wrap instead of ending in an ellipsis.
A tool call's arguments, the row its result hangs on, a command's answer and
a table cell now wrap under their first row, indented to where their words
began.toolDetailis the measure they wrap at rather than where they are cut. -
Links, bullets and references are drawn the way a reader finds them. A
link is its underlined words carrying the address, without the address in
brackets after them; a list bullet is heavier than the dot that parts two
things on one row;PR #435andissue #12are one link, the word included. -
Command answers hang off the line that asked. A slash command's answer
starts directly under the command with the corner mark in front of it, the
opening card no longer draws anauthentication:row, a successful/login
sayslogin successful, and a failed turn is drawn red without the mark. -
Replay draws tool calls as they were drawn live. A resumed session names
calls to tools the model had looked up, such as web search and fetch, with
their arguments rather than as bare names, and draws each call line as its
result comes past rather than every line of a batch before any result. -
Failed server startup keeps cleanup failures visible. MCP handshake and
catalogue failures stop the process explicitly; optional servers are skipped
only when cleanup is confirmed. Missing-pipe failures in the MCP and RPC
hosts preserve the original cause and stop error inUnstarted::Unreaped. -
MCP servers are replaced only after confirmed cleanup. An unconfirmed
stop remains a disposal failure and prevents another preparation or restart.
Failed partial preparation retains cleanup failures for the runner to report,
while disposal still attempts every started server. -
MCP sandbox audit records reach the session journal. Preparation, restart
and cleanup retain their run attribution, including lifecycle failures.
Audit delivery happens before the next provider request and after disposal;
a delivery error preserves the original operation and cleanup failures. -
Failed sandbox startup keeps uncertain cleanup visible. Startup errors
stop and reap a spawned command within bounded waits. If cleanup cannot be
confirmed, Crucible retains staging data, Linux projection evidence and the
command slot instead of reporting successful cleanup or deleting the evidence. -
Unavailable audit collectors no longer discard earlier records. If one
collector cannot be read, the registry retains every undelivered sandbox fact
and returns an error. -
Background commands remain reachable when cleanup fails. Their rows and
command slots stay held until cleanup succeeds, including when the original
result was abandoned. A failed stop keeps the panel open with
Stop failed; x retries; the next press retries the same command. -
Failed local process cleanup remains visible. Compatibility-mode stops
retry unfinished cleanup, and a cached exit status cannot hide a prior
supervisor failure. Unconfirmed cleanup retains staging data and its command
slot instead of admitting more work on an unproved cleanup result. -
Windows command cleanup confirms job membership. After requesting
termination, Crucible checks that the command's job has no active processes
before reporting completion. Unavailable job state is an error, and an
explicit stop bounds its wait for an empty job.
Changed
-
/loginasks for a key in a labelled box that takes a paste. The first
panel offers the ChatGPT and Kimi Code plans and Provide your own API key,
which replaces Console account; the provider list names each provider with
the variable it reads from,set ANTHROPIC_API_KEYand so on. The key box is
framed and labelled with the provider, takes a pasted key whole, draws a dot
per character, and saves on Enter only once something is held. A store that
cannot be written is answered withthe key could not be savedand the way
back in for what stopped it — the permissions, another crucible holding the
store, or a store that cannot be read and should be moved aside — never with
a path. Leaving the box sayscancelled, nothing signed in; a window too
short to stand the box says so and asks for a taller one. -
OS sandboxing is now opt-in through
sandbox.enabledonly. Set it to
trueto require confinement; omitted settings default to off, and project
settings cannot disable it. Breaking:sandbox.modeis rejected; replace
requiredwithenabled: trueandoffwithenabled: false, and choose
either explicit behavior if you previously useddegraded.
Added
-
Native Windows can now enforce the opt-in sandbox. After the explicit
Administrator setup, commands run as a dedicated low-privilege account under
path-capability ACLs, persistent WFP network denial, a privilege-stripped
write-restricted token, a private desktop, exact standard-handle inheritance,
and a kill-on-close Job Object with an aggregate CPU ceiling. Native x86_64
and ARM64 Windows CI provision the real backend and test workspace/protected
writes, loopback denial, input forwarding, exit status, identity and
descendant cleanup. Each command also receives a privateTEMP/TMP
directory. Windows retains the sandbox account's ordinary ACL access so the
protected Win32 loader and developer tools can start; Crucible grants only
declared roots, but ACLs that already grant the sandbox account orEveryone
can remain writable. Explicit unreadable paths and patterns fail closed rather
than claiming a read boundary Windows cannot apply with these stable APIs. -
Windows sandbox setup is explicit, repairable, and account-scoped. Run
crucible sandbox setuponce from an Administrator PowerShell to create a
dedicated local identity, protect its random credential with machine-scope
DPAPI, and install persistent outbound-deny WFP rules. Setup does not
auto-elevate, can target another developer with--owner, and
crucible sandbox uninstalldisables the identity before removing it. -
macOS can now enforce the opt-in sandbox with Seatbelt. The native
backend denies network access and writes outside declared roots, protects
repository metadata, closes inherited descriptors, applies the open-file
limit, and uses a private temporary directory. Intel and Apple silicon CI
now require its native confinement tests to pass. The security guide records
the trusted macOS code-validation metadata effect and the authority checks
that remain mandatory before release. -
Windows cleanup tests exercise failed observation and recovery. Native
job tests cover a refused state query after termination, a live job that
reaches the stop deadline, and successful observation after that job ends. -
Sandbox admission is tested before workspace materialization. Concurrent
preparations and cloned services share the requested command ceiling and the
absolute sixteen-command limit, and dropping a session releases its slot.
These regression tests run against compatibility and the enforcing backend;
the enforcing CI job fails if its backend is missing. -
A sandbox backend's capability claims are now checked against what it
does.crucible_tools::conformanceis published for adapters outside this
repository: it offers each backend the smallest policy that requires one
feature and reads the claim and the answer together, so a backend that takes
a policy it says it cannot hold, or refuses one it says it can, is a fault
rather than a passing table. Answers are grouped into the families a backend
is chosen by — isolation, materialization, network, resources, terminal,
persistence, accounting and cost — and a feature no policy can name is
reported as untested rather than kept. -
crucible --sandboxprints the confinement a command here would run
under. Which backend enforces it and at what version, every feature that
backend can and cannot hold, the reach and ceilings a command would get with
each ceiling beside the claim it rests on, and whether anything was given up.
The inspection record already held all of this; there was no way to read it
without running something. Nothing is run to produce the report, and every
path in it except your workspace root is a digest, so it can be pasted into an
issue. -
The sandbox now holds a process ceiling. The broker is PID 1 of the
namespace and caps the processes beneath it at 1024 whether or not a policy
mentions one, the way it already zeroes the core-dump ceiling. A workload that
forked in a loop was previously bounded by nothing the sandbox owned: the
processor and descriptor ceilings do not help, because each new process gets
its own. A policy may state fewer and the lower of the two applies.Stating a ceiling is a separate claim, and the Linux backend makes it only
where the kernel counts processes per user namespace — 5.14 and newer. On an
older kernel the count is the real user's across the whole machine, so
requiredrefuses a stated ceiling rather than applying a number that would
bound the host's other work. The broker's own 1024 applies either way.