Persistent AI partner substrate. Survives every model swap. Cryptographically yours. Provides autonomous run management, bash execution with safety walls, hashline editing, and caching capabilities.
Troth exposes 12 tools with mixed quality. Tool names follow verb_noun convention (troth_run, troth_list, troth_status, troth_kill, troth_clean, jobs_status, run, cd, pwd, open_ground). Descriptions are present and detailed for most tools (100-300 chars), explaining WHEN to use them and what they return. However, input schemas are inconsistently visible in source code. troth_run, troth_list, troth_status, troth_logs, troth_diff, troth_kill, troth_clean, jobs_status, run, cd, pwd, open_ground all show explicit schema objects with type definitions and parameter descriptions. Error handling guidance is present in descriptions (e.g., 'ask the operator and carry the answer back in permission'). However, output schemas are NOT documented, no tool specifies what fields are returned or their types. This forces LLMs to infer structure from descriptions alone. The 'run' tool accepts a 'permission' object with nested properties but lacks clear documentation of the response format. Security is partially addressed: the 'acknowledge_danger' parameter and 'permission' object suggest permission gating, but no explicit audit trail or scope declaration is visible. Composition is strong, tools chain well (troth_run → troth_status → troth_logs → troth_diff), and each has a single responsibility.
Change the persistent working directory used by subsequent `run` calls.
Status of autonomous background runs (jobs). Without run_id: list recent runs (id, short task, state, started_at). With run_id: that run's state plus a real multi-line tail of its log. Operators may reference a run as @job:<run_id> in their message — pass that id here. Use whenever the operator asks how a background job / autonomous task is going, from ANY conversation.
Open a folder of the operator's own work as opened ground for THIS session: commands there run with the operator's environment instead of confined walls. Requires a one-line purpose (kept on record), and the tree is photographed for undo before the grant applies. Refused for partner project ground (the workspace) and for the tree holding the substrate. The grant dies with the session; the permanent registry stays the operator's own road (`troth open`).
Return the current persistent working directory.
USE INSTEAD OF Bash. Compresses output >4KB (git/grep/find-aware), archives raw to SQLite for recall. Persistent cwd. A wall that stops a command names the OK it needs; ask the operator and carry the answer back in `permission`.
Output schemas not documented. No tool specifies what fields are returned, their types, or structure. LLMs must infer response format from descriptions alone, risking misinterpretation and failed downstream tool chaining.
Tool 'run' has ambiguous name. 'run' is a generic verb that does not clearly convey 'execute shell command'. LLMs may confuse it with troth_run (dispatch autonomous worker). Rename to 'execute_command' or 'shell_exec' for clarity.
Permission/authorization model is implicit. No explicit scope declarations (e.g., 'read:logs', 'write:fs') visible. Audit trail requirements and permission gate enforcement are mentioned in descriptions but not formally specified.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Permanently delete a troth run's worktree, container, and metadata directory. Use this after merging a run's changes (or deciding to throw them away) to free disk space and unclutter the run list. Cannot be undone.
Fetch the git diff a troth run produced — the changes the dispatched worker made on top of the parent branch. Use this when a run is done to review what was actually changed before deciding whether to merge it. Returns the unified diff as text.
Stop a running troth worker container immediately. The worktree and run metadata are preserved so you can still inspect logs/diff afterwards. Use this when a run is stuck, taking too long, or going down the wrong path.
List all troth runs (running, done, failed, killed) with their state and task. Use this to see what background workers exist before deciding what to check on.
Fetch the captured stdout/stderr logs from a troth run. Use this when a run has finished (or is in progress) to read what the dispatched agent actually did. Pass tail_bytes to get only the most recent N bytes if the log is large.
Spawn an autonomous troth worker that runs in its own context window, completely separate from this chat. Returns immediately with a run id. Use this tool when the user explicitly asks to dispatch, OR when ALL of these are true: - The task is self-contained (doesn't need clarification or back-and-forth) - The task will take 10+ tool calls (large refactors, full test suites, implementing a whole feature) - The task doesn't depend on context from the current conversation Do NOT dispatch for: reading a few files, quick research, small edits, anything faster to do directly in this chat. A dispatch takes 2-5 minutes to complete — only use it when that time is justified. The worker has its own filesystem (git worktree of current branch), its own Gemini routing, and reports back via logs and git diff. Your context stays clean.
Get the detailed status of one troth run by id. Returns metadata (task, branch, started_at), current state (running/done/failed/killed), and a brief log summary (line count + last line). Use this to check whether a dispatched worker is still running or has finished.
Error recovery guidance is sparse. Most tools lack explicit error classification (retryable vs. fatal) or recovery hints. E.g., troth_status does not document what happens if run_id is invalid.
Parameter 'tail_bytes' in troth_logs lacks constraints. No minimum/maximum specified. LLMs could pass absurd values (negative, gigabytes). Add: 'tail_bytes: integer, 0 - 10485760 (10 MB max)'.