0.0 / 30
What changed in the harness
Selection accuracy 98→98, token cost up 9%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
20.3 / 30
03Economics
19.2 / 20
04Discoverability
13.5 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
16 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
remember |
params_unexplained no_return_description |
Persist a memory (content) for later recall. kind: note | chat | fact | preference | constraint | mission; importance 1-5, where 0 = auto-derive from content with no LLM; provenance: planning | action | observation | user_confirmation (external actions may rely only on user_confirmation). session groups memories within a conversation, actor names the source, namespace scopes the store. Returns the stored memory including its assigned id and metadata. |
capture |
params_unexplained no_return_description |
Submit a turn (content) to memory; Midas decides whether to keep it with no LLM: it scores importance, enforces the relevance floor, skips duplicates, and returns its decision with the reason. kind: note | chat | fact | preference | constraint | mission; provenance: planning | action | observation | user_confirmation. session groups turns within a conversation, actor names the source, namespace scopes the store. |
recall |
params_unexplained no_return_description |
Search stored memories matching query and return the most relevant ones (up to limit) with deterministic, source-traceable evidence: the exact stored text plus provenance/source/timestamps and score components. kind and min_importance filter which memories are candidates; set hybrid=true for exact-identifier queries; namespace scopes the store. |
inspect_memory |
params_unexplained no_return_description |
Return the full stored memory identified by memory_id, without search, mutation, or embedding exposure. memory_id is the id of an existing stored memory (as returned by recall or remember). |
build_context |
params_unexplained no_return_description |
Assemble a budgeted, prompt-ready context block from memories matching query and return it as lean dated lines plus a "Today is" anchor, capped at token_budget tokens. limit caps the number of lines; set hybrid=true for exact-identifier queries; namespace scopes the store. Use recall/inspect_memory for full provenance. |
check_memory_use |
params_unexplained no_return_description |
Decide whether recalled memories matching query may justify an intended_use and return the verdict. intended_use: planning | answer | external_action | destructive_action (the last two require user_confirmation provenance). limit caps how many memories are considered; acting_agent identifies who requests the use; namespace scopes the store. |
forget |
params_unexplained no_return_description |
Delete the single stored memory identified by memory_id and return confirmation. Supersession chains are relinked, not orphaned. memory_id is the id of an existing stored memory (e.g. from recall). |
forget_matching |
params_unexplained |
Topic-level erasure with a reviewable audit: find memories matching query, keep those meeting min_relevance (0-1), consider at most limit, and by default (dry_run=true) return what WOULD be deleted; repeat with dry_run=false to erase. Bypasses durability protections on purpose. namespace scopes the store. |
forget_all |
no_return_description |
Clear all stored memories for a fresh start and return the number of memories deleted. |
resume |
params_unexplained no_return_description |
START OF SESSION: return everything needed to pick up where the last session left off, in ONE call — pinned directives, forbidden rules, what changed in the last hours (default 168 = a week), current state, open commitments, and unresolved conflicts. project and namespace filter the store; token_budget caps the returned prompt-ready context. |
memory_conflicts |
params_unexplained no_return_description |
Return live beliefs that CONTRADICT each other with neither superseding the other — the multi-agent failure mode — as ranked candidate pairs using the same-slot heuristic (value swap / numbers disagree / one side negates). namespace scopes the store; limit caps the number of pairs returned. Verify with the user, then forget the wrong one or capture the corrected value. |
open_loops |
params_unexplained no_return_description |
Return unresolved commitments — work someone said WOULD be done but never closed — oldest (most overdue) first, up to limit. project and namespace filter the store. Record one with remember_commitment; close it with close_loop. |
remember_commitment |
params_unexplained no_return_description |
Record a commitment (an OPEN LOOP) with content text so promised work stays visible in open_loops/resume until closed with close_loop, surviving across sessions; returns the stored loop. project tags the related project; due is an optional due date; session groups it within a conversation; namespace scopes the store. |
close_loop |
params_unexplained no_return_description |
Close an open commitment identified by loop_id, recording resolution text and superseding the open loop while keeping the promise -> resolution history auditable; returns confirmation. loop_id comes from open_loops; resolution describes what actually happened. |
maintain |
params_unexplained |
Run a no-LLM memory-maintenance pass — bound to max_records and/or a drop below min_value, optionally applying ttl — and return the deletion audit. Durable kinds and supersession chains are protected. |
stats |
name_restates_behavior params_unexplained no_return_description |
Report memory statistics: the total count, broken down by kind, provenance, and namespace, and across short/medium/long temporal tiers. namespace optionally restricts the report to a single namespace. |
Selection evidence
Confusable tool pairs.
6 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
forget |
forget_matching |
high | Natural deletion requests reference content ('forget what I said about X'), not ids; forget requires a memory_id while forget_matching queries by text, so an agent commonly picks the wrong one. |
remember |
remember_commitment |
high | Tasks like 'remember to finish the report by Friday' are the canonical open-loop trigger; an agent may store via remember as a note instead of creating a tracked commitment, since both 'store this' intents overlap. |
forget |
forget_all |
medium | A request like 'forget all that stuff I told you' is ambiguous about scope; an agent may pick forget_all (nukes everything) when the user meant a single memory, or pick forget before knowing the id. |
forget_matching |
forget_all |
medium | 'Delete everything about topic X' sits on the boundary between topic-scoped erasure (forget_matching) and full clear (forget_all); the agent may over-select the destructive all-memories wipe. |
open_loops |
close_loop |
medium | Tasks like 'close out my open commitments' couple the two: close_loop needs a loop_id retrieved via open_loops, so an agent may pick the listing tool instead of the closing tool or vice versa. |
check_memory_use |
memory_conflicts |
low | 'Check my memory for problems' is weakly ambiguous between validating a memory's permitted use (check_memory_use) and surfacing contradictory beliefs (memory_conflicts); usually disambiguated by the query shape. |
Compare the field