Added
-
Anticipatory appraisal for confirmed-goal planning and inline outbox messages:
owner-bound commitments, verification and cost evidence derive guilt,
embarrassment, regret, disappointment, anxiety and curiosity assessments.
run --appraisal-evidencesupplies invocation evidence;outbox anticipate
records exact-argument predictions with optional release guidance, and
outbox outcomelinks owner feedback to confirmed delivery. Supported
exposed-error and impact records produce retrospective embarrassment and guilt.
Revised predictions and superseded outcomes retain their history; affected
replay/probe paths explicitly report unsupported evidence reproduction. -
Ground mismatch learning in verified criterion/check failures; owner-bound task diagnostics can carry relevant count constraints without exposing expected answers. Forecast overruns remain observations and no longer justify behavioral rules by themselves.
-
run --mismatch-caseand registered experiment fixtures enable independent JSON-artifact validation of clean planning mismatches in isolated file-only tasks. Validation and rule proposals retain ungraded outcomes for missing evidence or policy refusals; each executed arm records an audit receipt.--no-goal-guidancenow works before or after a subcommand. -
mecha run --goal KIND:IDexplicitly confirms a goal, including on resume; experiments can register per-task confirmed goals. Completed todo steps now retain and execute a previously declared check when the completing update omits it. -
A paired appraisal pilot with twelve independently graded artifact tasks,
synthetic charter and sensor fixtures, and reporting that preserves missing
measurements. Explicit experiment planning levers now enable disabled settings. -
Goal-aware planning feedback: confirmed goals persist across turns and resume;
declared checks execute through the normal guards; failed criteria/checks and
frozen-check changes can produce bounded mismatch reflections. Forecast
overruns remain observations. Trace replay explicitly refuses recordings with
harness checks until their observations can be reconstructed. -
goal_contextretrieves applicable goal-linked rules and recent, clean examples
with passing checks. Optionalagent.goal_guidancegives fixed planning advice
from task progress, confirmed goals and charter sensor discrepancies. -
Event-time goal attribution preserves task and charter relationships. Owner task
closure remains a separate verdict; global queue movement earns no causal credit. -
Explicit per-task fixture clocks and recorded rubric judges for assistant
experiments; answer checks receive actual tool evidence and fail on grading errors. -
Durable workflows link task conversations, questions, drafts and dependencies;
owner-specified completion checks inspect artifacts and confirmed delivery. -
A Today view groups urgent items, decisions, verified work and waiting, with
commitments, quiet hours, coalesced reminders and snoozing. Refreshes share
source reads across workflows; finished work can be explicitly reopened.
Failed chat recording preserves prior workflow completion evidence. Blocked
question resumes leave the question open and create no running marker. -
Batch outbox rejection continues past uncertain deliveries, preserving their
records and reporting partial failures with a nonzero exit status. -
Explicit structured-output provider capabilities for quarantined extraction,
plus stable research, assistant and coding tool profiles. -
Repeated assistant lifetime fixtures check actual sent messages and calendar
events after review, detect duplicates, and record owner-action counts. -
Outbox delivery reconciliation in the CLI and web, with durable attempts that
prevent automatic retry after an uncertain outcome. -
A learned rule can be scoped to a surface. The front-end that owns
a run tellsprepareits kind (GlobalOpts::surface, never a flag),
the learned-rules block is matched against it, and the run record keeps
what was matched (RunConfig::rules_surface) for the miner to stamp —
neverSessionMeta::kind, which the board's task door onserve
records as a task while the block was matched as web. A rule learned
from reflections all on one surface loads only there, widens by
restatement from another, and narrows by conviction, as the workspace
does; the reflect pass reconciles rows stamped with a kind before the
field existed. A question continuation restores the asking run's
surface off its record rather than asserting one, and the miner stamps
the keys of the run record covering each intervention. A stored scope
naming a surface this build cannot read is kept verbatim, matches
nothing rather than everything, and is reported at startup, and the
front door and mail now append the run record that keeps the surface
they declare. Rules from before the key carry no surface and load on
every surface as they did. -
The TUI's task edit form carries the project.
tasks set --project
existed in the terminal and not in the modal; the edit form now
prefills the project and re-files only when the field changed (clearing
it clears), so the two surfaces offer the same correction. -
mecha rulessays when a scope loads nowhere. A rule scoped to a
workspace or surface no run record ever presented is dark with nothing
warning — the corpus-shaped half of the never-loads check, which named
tools only; the roster printsLOADS NOWHEREbeside it and the JSON
carriesloads_nowhere, read off every run record in the session store
and only when a scope names such a key. -
The fixture board can be asked to truncate (
MECHA_FIXTURE_BOARD_CAP=N),
and the cross-process fixture test measures the flag every board reader
keys off against the fixture rather than a literal. -
A learned rule can be scoped to a workspace. The workspace a run
is jailed to joins the tool set as a scope key (Situation::scope,
Situation::matches,Situation::key): a rule learned from
reflections that all came from one workspace loads only in runs jailed
there, a verbatim restatement from a second workspace's batch widens it
by dropping the key, and a conviction in one workspace narrows it to
the one it held in — the same harness arithmetic tools already had
(GOAL-SYSTEM-DESIGN.md§17.4). The run record keeps the workspace
the block was matched against (RunConfig::rules_workspace), and the
miner stamps a reflection with that rather than the session's jail —
onserveand Slack the two differ, and a lesson scoped to a jail no
match presents would be dark forever. Everymecha reflectpass now
reconciles each recorded workspace against the run record before
anything is mined — to the matched one, or to none where the record
carries none; never adding a key, and leaving a row whose session
cannot be read — since reflections stamped with a jail before the
field existed were inert until the workspace became a key, and the
nightly'slearnfollows that pass. Rules from before the key carry no
workspace and load everywhere as they did. The surface stays recorded
and unmatched, sinceprepareis not told the session kind. -
A project closes when the owner closes its last task, and its
appraisal is the fold over every session that worked one. The board
row now carriesproject_idbeside the project's name (mecha-graph
PR #10, unreleased when written), the closure appraisal inmecha tasks setrecords
project:<id>on the appraisal's goals after the task, and closing the
last open task under a project prints the project's reading on stderr —
labels counted, valence summed, tasks never delegated or unreadable
counted rather than dropped. No follow-up is staged for a project and no
record is written; a board that names a project without identifying it
is said once rather than read as no project
(docs/GOAL-SYSTEM-DESIGN.md§17.7 item 5, finished).mecha tasks set --projectre-files a task by name or node id, or clears it with""—
the correction path a cited pointer needs, through the graph's own
resolver. -
The goal pointer crosses to the graph whole; the sentence stays
home. A distilled episode'smetacarriesgoaland
serves_charteraskind:idpointers and the pointer on each goal
error, where the kind word alone used to cross — resolved first: a
charter id against the charter, a task or project id against the board
(onekg_task_listper distill run), and what does not resolve falls
back to the kind word ongoaland on each error'sgoalalike, so a
run that named a setpoint is not read as one that named nothing
(serves_charteris the join key alone, absent when no line resolves).
The goal hypothesis, the owner's answer and the charter line's text
never ride (§17.7 item 8).
Changed
-
Refreshed the documentation for current CLI commands and configuration, Today
and workflows, automatic learning, outbox delivery recovery, and replay limits.
Goals and appraisal now covers confirmation and drift, project closure, step
metrics, current labels, and the features consuming appraisal evidence. -
The knowledge graph is named as the graph everywhere in the tree.
Comments, tests and onemecha distillwarning still called it by the
retired server's name; nothing calls that server, and the words now say
so. Three places changed what somebody does (found on review): the
published evaluation page named a fixture file that does not exist, the
landing page's[[mcp]]snippet named a binary that is not shipped (and,
once it named a shipped one, lacked the[mcp.capabilities] untrusted_input = truethat arms the interlock over the graph — the
overrideTRIFECTA.mdcalls load-bearing; found on review), and
prompts/agent.mdtold the model to callpkg__kg_*tools that are not
on the surface — it now names the barekg_*the documented wiring
(prefix_tools = false) exposes.
Fixed
-
Stopping the web service preserves active turns. SIGTERM and Ctrl-C
close pending questions, cancel chat and mounted voice work cooperatively,
and wait for partial transcripts and outcomes before exiting. A second
Ctrl-C or SIGTERM forces termination if needed. Idle event streams and voice
clients no longer prevent shutdown. Updated serve/voice service units signal
the daemon first, and MCP cleanup finishes before it exits. -
Chat input appears on every connected device. Typed messages and steering
are broadcast with request IDs, avoiding duplicate echoes on the sender and
preserving separate messages with identical text. Steering distinguishes
queued, delivered, and too-late input instead of claiming everything was sent. -
Chat transcript and event-stream reads no longer create sessions. The app
explicitly opens chats and repeats that step when reconnecting; scripted
clients must firstPOST /api/chat/{key}withX-Mecha-Request: 1.
Mode changes now reject invalid keys before creating a workspace.
Permanent opening refusals stop retries; transient failures back off. -
Docker-confined MCP clients now own and remove their containers when the
last client drops, including failed or cancelled startup and servers that
ignore stdin EOF. Cleanup also works after the async runtime shuts down;
mecha runreleases clients before refusal and empty-output exit codes,
as doesmecha batchbefore a failed-batch exit.
Daemon failures are retried and reported with bounded Docker diagnostics. -
Browser mutations now require a same-origin request header, including
bodyless actions, uploads, and voice offers. Reload the web app after
upgrading; scripted API clients must sendX-Mecha-Request: 1on writes. -
Chat uploads reserve filenames atomically and refuse symlinked inboxes;
resumed conversations use their recorded workspace for attachments.
Downloads stream from confined file handles instead of buffering whole files. -
MCP clients terminate their spawned child process and abort reader tasks
when the last client is dropped, including after an unsuccessful handshake. -
fs_readapplies line selection and its byte ceiling while reading, so a
small selection does not allocate or decode an entire large file. -
Graph route updates and charter drag state now use Svelte's reactive state
correctly, removing the corresponding build warnings.