Skip to content

fix(tools): shorten tool descriptions, and point Errors entries at messages that carry their remedy - #713

Merged
aliasunder merged 32 commits into
mainfrom
worktree-error-prose-text-sweep
Oct 30, 2026
Merged

aliasunder merged 32 commits into
mainfrom
worktree-error-prose-text-sweep

Conversation

@aliasunder

@aliasunder aliasunder commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

Summary

The tool definitions get 7,177 characters shorter in total, which every conversation loads; 28 of the 33 tools shrink. Errors entries point at the error messages that already carry their remedy, descriptions gain the facts a caller was missing, and a tool turned off with DISABLED_TOOLS is no longer named in any other tool's text. The change is description text, tests and docs: no handler, error message or schema shape changes, apart from one reply that drops a tool name when that tool is disabled.

  • Shorter descriptions. Each description and parameter text drops claims that restate another sentence, the Returns line or the parameter's own description, describe how the server carries out the call, or give advice a calling agent follows anyway. Remedies, state facts such as "nothing was written", and every fact a caller acts on stay. The implementation facts that left the descriptions now live in ARCHITECTURE.md.
  • Errors entries that point at their message. When the message a client receives already gives the fix (it lists the available headings, names the allowed characters, or states the expected date format), the entry now says so in a few words instead of restating it. Each entry keeps its quoted message, how to read it, and every fact about what was or wasn't written.
  • One copy of each shared Errors entry. An Errors bullet that two or more tools carried word for word now comes from one constant, so a wording change is made once. The served text of those bullets is unchanged.
  • Disabled tools are never named. With DISABLED_TOOLS set, no served tool's description or input schema names a tool the server no longer serves. Where the named tool was the remedy, the entry falls back to one that needs no tool, such as checking the path's spelling and letter case. vault_update_memory's reply for a new memory file names vault_replace_in_note only while it is served. A new test disables each tool in turn and checks every other tool's text.
  • vault_move_note. The four "move aborted" messages share one entry, and the three "move incomplete" messages another, since each message names its own state and next step. The opening sentence names the Canvas cards a move updates.
  • Facts callers were missing. Results that lag a file change by a few seconds now say so on vault_search, vault_recent_notes, vault_search_by_property, vault_find_orphans, vault_memory_recall and vault_list_tasks. vault_search_by_folder says there is no offset, vault_find_orphans names its 994-folder limit, and Returns lines state when a field is null.
  • Result fields. vault_list_tasks says what status_char, folder, is_kanban_task and done_lanes hold. vault_search says folder is a note's top-level folder and a file's full parent folder, which a new test pins.
  • Routing. vault_write_note points partial edits at vault_patch_note and vault_replace_in_note from When to use. vault_list_tags points at vault_list_property_values for a folder or limit.
  • Image-fit remedy. "image cannot be fitted" now names MAX_IMAGE_OUTPUT_BYTES, the setting that causes it, instead of asking for a smaller export.
  • A tighter size cap. CHARS_PER_TOOL_ALLOWANCE drops from 4,198 to 3,997, the default list's average plus 2%, so the snapshot test fails if the list grows back.

Tool text

All 33 tools change in the default configuration. Definition size counts the description and the input schema. Glama grades are the ones it published under its "0.55.3" label, which grades this branch's base, read 2026-10-29.

Tool Glama before Definition chars (before → after) Errors: chars (before → after)
vault_create_task 4.8 10,466 → 9,565 (-901) 3,072 → 2,858
vault_delete_memory 4.8 3,677 → 3,458 (-219) 1,648 → 1,375
vault_delete_note 4.8 3,627 → 3,517 (-110) 1,441 → 1,331
vault_delete_span 4.8 3,739 → 3,671 (-68) 970 → 943
vault_find_orphans 5.0 2,442 → 2,342 (-100) 288 → 293
vault_get_backlinks 4.7 1,718 → 1,899 (+181) 410 → 410
vault_get_daily_note 4.8 2,057 → 1,981 (-76) 817 → 662
vault_get_memory 4.8 3,261 → 2,920 (-341) 946 → 806
vault_get_outgoing_links 4.6 2,573 → 2,534 (-39) 381 → 410
vault_insert_at_anchor 4.6 3,507 → 3,428 (-79) 966 → 938
vault_list_files 4.4 2,924 → 2,602 (-322) 650 → 603
vault_list_memory_files 4.8 2,117 → 1,868 (-249) 360 → 385
vault_list_notes 5.0 2,226 → 2,220 (-6) 430 → 430
vault_list_property_keys 4.8 1,737 → 1,689 (-48) 164 → 164
vault_list_property_values 5.0 2,424 → 2,190 (-234) 170 → 170
vault_list_tags 4.9 1,053 → 1,105 (+52) 168 → 168
vault_list_tasks 4.8 8,888 → 8,778 (-110) 551 → 559
vault_memory_recall 4.9 2,741 → 2,738 (-3) 264 → 263
vault_move_note 4.8 5,918 → 5,191 (-727) 2,696 → 1,998
vault_patch_note 4.9 6,270 → 5,992 (-278) 1,561 → 1,509
vault_read_file 4.9 6,975 → 6,321 (-654) 2,648 → 2,500
vault_read_note 4.9 5,775 → 5,147 (-628) 1,369 → 1,279
vault_recent_notes 5.0 1,993 → 2,093 (+100) 183 → 183
vault_replace_in_note 4.9 3,919 → 3,798 (-121) 913 → 879
vault_replace_span 4.7 4,478 → 4,133 (-345) 1,085 → 1,025
vault_search 5.0 6,404 → 6,318 (-86) 833 → 715
vault_search_by_folder 4.6 2,250 → 2,308 (+58) 199 → 199
vault_search_by_property 4.9 2,962 → 3,202 (+240) 202 → 202
vault_search_by_tag 4.8 2,625 → 2,479 (-146) 334 → 334
vault_update_memory 4.8 4,734 → 4,175 (-559) 1,839 → 1,447
vault_update_properties 4.8 2,754 → 2,659 (-95) 849 → 873
vault_update_task 4.9 14,923 → 14,028 (-895) 4,505 → 4,275
vault_write_note 4.8 3,482 → 3,113 (-369) 1,295 → 1,004

The default tool list goes from 136,639 to 129,462 characters (-7,177, 5.3%), and its Errors: text from 34,207 to 31,190. No tool's Errors: text is more than half its description.

Tool-definition review:

  • The first round read every changed tool in the default list and in each configuration whose wording differs (disabled tools, file tools off, memory off, read-only, embeddings off). Its findings are applied in this branch.
  • Later rounds re-read each tool whose text changed again. Their findings on text this branch wrote are fixed here, among them a claim in vault_delete_memory that a PROTECTED_PATHS setting could make false and a reranking condition in vault_memory_recall that the code does not hold.
  • A pass on a second model read all 29 tools changed at that point, both on their own and against main. Its two findings: cutting vault_list_memory_files' example output dropped the heading fields' names, now named in Returns; and vault_update_memory lists no entry for its "would shrink content" refusal, which gets none because only a file made almost entirely of blank Windows-style lines can trigger it.
  • The shortening pass was reviewed tool by tool against the text before it, tracing each tool's error paths in the handlers. It restored four facts a caller acts on: vault_list_property_keys saves reading notes one by one and shows folder in an example; a broken markdown link's path in vault_get_outgoing_links has its %-escapes decoded; and daily_note_forward_ref is false when the daily notes folder is the vault root or blank. Every other cut was confirmed to leave the fact elsewhere in the definition, in the error message, or to change no call.
  • Every disabled-tool variant was rendered against the default text and read. One gap was fixed: with memory off, vault_delete_note's protected-path entry had no remedy and now says to ask the vault owner to delete the note in Obsidian.

Tests

  • New tests: no served tool's description or input schema names a tool DISABLED_TOOLS turned off; vault_update_memory's new-file reply names no editing tool when vault_replace_in_note is disabled; vault_find_orphans accepts 994 excluded folders and refuses 995; vault_list_files returns an empty listing for a folder that names a file; a canvas backlink's title is the file name without .canvas; a search result's folder is a file's full parent folder and a note's top-level folder.
  • tool-definitions.test.ts pins whole description lines, and checks that each cross-reference appears while its target tool is served and disappears when that tool is disabled.
  • The tool-surface snapshots are regenerated for all 18 configurations.
  • npm run lint, npm run build:server and npm run knip pass.
  • npx vitest run src/vault-mcp src/__tests__/integration src/utils scripts/__tests__ src/__tests__/install-deps.test.ts passes 5,360 tests, with 2 skipped. Two file-watcher timing tests timed out locally under machine load, a different pair on each run; this branch changes no watcher code, and CI runs them on a clean runner.

Live Test Results

Test deploy of f275ee75 (run 40970832799): the container was re-created from image revision f275ee75b0daab6f0fe0d73b37ff520c4e1cc7db and reported healthy. A fresh MCP client read the served tools/list and compared it with the committed obsidian-sync.json snapshot, the configuration the test instance runs.

Probe Against main's snapshot Against this branch's snapshot
Tools that differ 33 (47 fields) 0
Server instructions and prompts match match

This PR is releasable on its own.

🤖 Generated with Claude Code

@umm-actually

umm-actually Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

umm-actually re-reviewed at f275ee7

No new findings (15 tracked finding(s) across all runs).

Context notes
  • Priority docs already in context: ARCHITECTURE.md, SECURITY.md
  • 18 changed file(s) excluded from review: src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/default.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/disabled-tools.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/file-tools-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/file-tools-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/memory-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/memory-off+file-tools-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/memory-off+file-tools-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/memory-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/obsidian-sync.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+file-tools-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+file-tools-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+memory-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+memory-off+file-tools-off+embedding-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+memory-off+file-tools-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly+memory-off.json (diff_exclude_paths input), src/vault-mcp/mcp-core/__tests__/__snapshots__/tool-surface/readonly.json (diff_exclude_paths input)

umm-actually · z-ai/glm-5.3-flash

aliasunder and others added 16 commits October 29, 2026 16:09
… and polish descriptions

- Shorten Errors entries whose message already gives the fix, keeping each
  entry's reading and every state fact.
- Merge vault_move_note's abort and partial-move entries, name the Canvas
  cards a move updates, and send its daily-notes config remedy to the owner.
- Fix the six tools graded below 4.8: list_files, get_outgoing_links,
  search_by_folder, get_backlinks, move_note, list_memory_files.
- Apply the second polish batch: lag lines, no-offset notes, null rules,
  tie-breaks, routing lines, and repeated facts cut.
- Name the image-fit remedy MAX_IMAGE_OUTPUT_BYTES, and pin the 994-folder
  orphan exclusion limit with a test.
- Share the memory-name Errors entry across the three memory tools.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- vault_read_note: drop a remedy the schema repeats, say there is no size cap, and give "start line past the end" an action
- vault_write_note: route partial edits from When to use instead of the "note already exists" entry
- vault_get_backlinks, vault_get_outgoing_links: state the path rule and the index delay once each
- vault_search_by_property, vault_find_orphans: drop "There is no offset" and an unneeded tie order
- vault_read_file: merge the library-error entry into the damaged-file entry
- vault_create_task: give the duplicate-block_id entry its own remedy
- vault_move_note: note that new parent folders may remain after a failed write
- Errors entries that point at a message say "the message", not "the error"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lete_memory

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ED_PATHS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efuses protected paths

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restore vault_write_note's single vault_update_properties disable case,
cover a vault_list_files folder that names a file, and assert a canvas
backlink's title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The image-fit entry no longer promises a 64-pixel attempt, the daily-note
format entry lists LT and LTS among the refused localized formats, and
vault_update_task's changes line covers the on_completion delete entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…get_daily_note's token list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… fallback chain

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stated

vault_list_tasks says what folder and is_kanban_task hold, vault_search
says what folder holds for notes and for files, vault_list_files names
what vault_read_file cannot read, and vault_memory_recall's any-term
fallback is tied to reranking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t_tasks' repeated sort fact

The any-term fallback also runs when no vector hit exists, and without a
reranker the distance cut always keeps a hit, so "When reranking runs"
implied an empty result that cannot happen. sort_direction already says
each fallback in a date sort uses its own direction, so sort_by stops
repeating it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…list_tasks' lane and cascade wording

A 🏁 delete with nested lines reports a count ("task and N children
removed"), not their names. sort_direction now calls the date-sort
fallback a cascade, as sort_by does, and done_lanes describes the lanes
as holding a **Complete** line, as vault_update_task does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…top-level folder

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion's cascade as plain verbs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rule the server applies

A done lane is one whose first line is **Complete**, so the three
sentences that said a lane "holding" the line now say so.
vault_list_tasks' opening no longer lists the Returns fields, and
vault_update_task's Recurring bullet leaves the indented-line rule to its
Errors entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aliasunder
aliasunder force-pushed the worktree-error-prose-text-sweep branch from eb5250d to 92aff1d Compare October 29, 2026 20:19
…and test asset-tools' gated references

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aliasunder and others added 3 commits October 29, 2026 16:40
vault_list_files leaves image shrinking to vault_read_file,
vault_insert_at_anchor says a failed save leaves the note unchanged,
vault_replace_span and vault_replace_in_note break their line-break rules
into bullets, vault_get_memory states each return shape once, and
vault_list_memory_files' example no longer repeats the Returns fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e_task's spawn follow-up

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@umm-actually

umm-actually Bot commented Oct 29, 2026

Copy link
Copy Markdown

Pin the full empty-recall payload the description now promises
Low severity · tests · medium confidence

src/vault-mcp/mcp-core/__tests__/tool-definitions.test.ts:2480 — beyond the diff's line ranges, in code the changes touch or depend on.

Pre-existing: the no-match recall test picks entries, total, and truncated off the parsed payload instead of asserting the whole object, while the PR's updated Errors entry now explicitly promises the empty shape carries search_mode and reranked. The exact payload is deterministic in this harness (no embedder, so fts and reranked false), so the missing keys or a wrong value would pass silently.

Failure scenario: A handler change drops search_mode or reranked from the empty-recall response (or emits reranked: true on a no-match query); the description promises both fields in the empty contract, but the test passes because it never reads them, and an agent relying on the documented shape hits an undefined field.

Suggested fix
Replace the three property picks with one whole-value assertion: expect(payload).toEqual({ entries: [], total: 0, truncated: false, search_mode: "fts", reranked: false }).

umm-actually · z-ai/glm-5.3-flash

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aliasunder

Copy link
Copy Markdown
Owner Author

Responding to umm-actually's PR-level finding "Pin the full empty-recall payload the description now promises" (comment 6508421940):

Fixed in df9dd98: the no-match recall test now asserts the whole payload, { entries: [], total: 0, truncated: false, search_mode: "fts", reranked: false }, so a dropped or wrong search_mode or reranked fails it.


🔍 ship-check · pr-monitor · claude-opus-5-5

@umm-actually

umm-actually Bot commented Oct 29, 2026

Copy link
Copy Markdown

Stale error-boundary passage now contradicts the new tool description
Low severity · subtle bugs · medium confidence

ARCHITECTURE.md:1907 — beyond the diff's line ranges, in code the changes touch or depend on.

Pre-existing: ARCHITECTURE.md states that a damaged PDF or undecodable image “each return the server’s own message, with the library’s error kept as the cause”, while the vault_read_file description this PR rewrites asserts client-facing errors surface “in the reading library’s own words”. The two authoritative surfaces now state opposite behavior; since the PR changes no handler, the tool description is the side that is wrong, and this passage is the evidence the claim was never verified against the code path.

Failure scenario: A reviewer or maintainer cross-checking the vault_read_file definition against ARCHITECTURE.md finds the two contradicting each other on whether raw library error text reaches clients; whichever they trust, one surface misleads — and if the description is trusted, a client-visible path leak of install-path-quoting pdf.js errors would go unnoticed as “documented”.

Suggested fix
Align the two: correct the vault_read_file entry (see the companion finding) and, if desired, leave this passage as the statement of record — it already matches the safeHandler design.

umm-actually · z-ai/glm-5.3-flash

@aliasunder

Copy link
Copy Markdown
Owner Author

Responding to umm-actually's PR-level finding "Stale error-boundary passage now contradicts the new tool description" (comment 6508527766):

Not changing this: the two passages describe different errors. ARCHITECTURE.md lists the library errors that come back as the server's own message (a password-protected or damaged PDF, an image sharp cannot decode, a PDF reader that fails to start). vault_read_file names those messages and says any other PDF or image error comes back in the library's own words, which matches asset-operations.ts:198 and :216: only pdf.js's PasswordException and InvalidPDFException are reworded, and everything else is rethrown unchanged.


🔍 ship-check · pr-monitor · claude-opus-5-5

aliasunder and others added 6 commits October 29, 2026 17:25
…ry tool's vault_list_files fallback

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-write Errors entries

Twelve, ten and seven tool descriptions typed these bullets out word for
word; they now reference constants beside FILESYSTEM_ERROR_ENTRY, so a
wording change is made once. vault_get_daily_note's vault_write_note
pointer uses whenToolEnabledText like its siblings. The served text is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… it served

Every sentence or clause in a tool description or input schema that names another tool now renders only while that tool is served. Error bullets whose remedy was that tool fall back to a check that needs none, and routing lines drop out without leaving an empty lead-in. A new test disables each tool in turn and fails if any served tool's text still names it. With every tool enabled, the text is byte-identical, so the tool-surface snapshots are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ile reply only while it is served

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ut word for word

The plain-retry concurrent-write entry joins the shared constants in
tool-helpers.ts; entries repeated inside one module (heading lookups,
task ids, recurrence rules, dates, control characters, span anchors,
memory sections, link-graph extensions) become module constants. No
Errors bullet is now typed out twice, and the served text is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…en vault_delete_memory is off

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@umm-actually

umm-actually Bot commented Oct 29, 2026

Copy link
Copy Markdown

Update the durable-cross-reference claim the availability sweep just retired
Low severity · correctness · medium confidence

ARCHITECTURE.md:138 — beyond the diff's line ranges, in code the changes touch or depend on.

This paragraph still documents a surviving class of durable API-level references, citing error-section alternatives that name sibling tools. This PR gates every one of those mentions behind whenToolEnabledText and adds a sweep test asserting that no served tool description or schema names a disabled tool, so the documented exception no longer exists on the tool surface.

Failure scenario: A maintainer adding a new error entry reads this paragraph, treats 'durable API-level references remain' as an accepted class, hard-codes a sibling tool name in the entry, and the new 'no served tool's text names a tool DISABLED_TOOLS turned off' test fails CI — or, without running it, a served description directs agents to a tool DISABLED_TOOLS removed.

Suggested fix
Reword the sentence to state the current invariant: cross-references in tool descriptions and prompt text are availability-keyed with no durable exceptions, enforced by the served-and-disabled sweep in tool-definitions.test.ts.

umm-actually · z-ai/glm-5.3-flash

@umm-actually

umm-actually Bot commented Oct 29, 2026

Copy link
Copy Markdown

Update the Read-only mode note that still cites durable sibling-tool references
Low severity · correctness · medium confidence

SECURITY.md:113 — beyond the diff's line ranges, in code the changes touch or depend on.

The Read-only mode section states that a small number of durable API-level references remain, citing error-section alternatives that name sibling tools. After this PR, every such mention in the tool descriptions is availability-keyed and a sweep test asserts none survive a DISABLED_TOOLS removal, so the documented exception is stale.

Failure scenario: A contributor using this section as the spec for read-only/DISABLED_TOOLS behavior hard-codes an error-section sibling-tool mention; the new sweep test fails, or the shipped description directs agents at a tool the configuration removed.

Suggested fix
Reword the bullet to state that all cross-references in surviving descriptions and prompts are availability-keyed, with no durable exceptions.

umm-actually · z-ai/glm-5.3-flash

aliasunder and others added 4 commits October 29, 2026 18:18
…th the test that checks it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each tool's description and parameter text drops claims that restate
another sentence, the Returns line or a parameter's own description,
describe how the server carries out the call, or give advice a calling
agent follows anyway. Remedies, state facts and the gating keep their
place. The implementation facts that left the descriptions move to
ARCHITECTURE.md. The default tool list goes from 136,621 to about
129,100 characters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and pin the trimmed descriptions

The re-read concurrent-write entry moves into vault-crud-tools.ts as CONCURRENT_WRITE_REREAD_ERROR_ENTRY, Errors bullets two tools typed out from the same template become closure constants, the vault_read_note remedies sit with the other not-found remedies, and helper names, doc comments and blank lines follow the repo conventions. vault_update_task's line parameter says "note" instead of "file" when vault_list_tasks is disabled. The tool-definition tests now pin the trimmed descriptions. The default served text is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e allowance to 3,997

vault_list_property_keys again says it saves reading notes and shows its
folder parameter in an example. vault_get_outgoing_links again says a
broken markdown link's path has its %-escapes decoded, and that
daily_note_forward_ref is false when the daily notes folder is the vault
root or blank. vault_find_orphans states its sort order once. The
per-tool allowance drops to the default list's average plus 2%, so the
cut cannot grow back unnoticed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aliasunder aliasunder changed the title fix(tools): point Errors entries at messages that carry their remedy, and polish descriptions fix(tools): shorten tool descriptions, and point Errors entries at messages that carry their remedy Oct 29, 2026
@aliasunder

Copy link
Copy Markdown
Owner Author

Both findings are fixed in 16e50fa:

  • Issue comment 6509543340 (ARCHITECTURE.md, durable cross-references): the Tool gating section now says every cross-reference in tool descriptions and prompts is availability-keyed, and names the test that disables each tool in turn and checks that no served tool's description or input schema still names it.
  • Issue comment 6509543561 (SECURITY.md, Read-only mode note): the bullet now states the same invariant and the same test.

A repo-wide search for "durable API-level" finds no other copy of the old claim.


🔍 ship-check · pr-monitor · claude-opus-5-5

@umm-actually

umm-actually Bot commented Oct 29, 2026

Copy link
Copy Markdown

Name the length check in the cannot-read-memory-file entry
Low severity · subtle bugs · medium confidence

src/vault-mcp/mcp-core/tools/memory-tools.ts:422 — beyond the diff's line ranges, in code the changes touch or depend on.

The shortened memoryFileReadErrorEntry replaces the old parenthetical '(a name longer than the filesystem allows fails here)' with 'check file's spelling and length', but the length half of the remedy is only rendered when vault_list_memory_files is disabled; with it served the entry reads 'check file against vault_list_memory_files', which drops the only hint that an over-long name is the cause — the fact ARCHITECTURE.md documents as the reason this message exists (no ENAMETOOLONG leaks).

Failure scenario: A client calls vault_update_memory with a 300-character file name; the store rejects with 'cannot read memory file …'; the entry directs the agent to vault_list_memory_files, which lists valid short names but never tells the agent its name was too long, so the agent re-guesses spellings instead of shortening the name.

Suggested fix
When vault_list_memory_files is served, append the length hint to that remedy, e.g. 'check file against vault_list_memory_files (a name longer than the filesystem allows fails here)'.

umm-actually · z-ai/glm-5.3-flash

… an update by line, and name an over-long memory file name in the read error

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aliasunder

Copy link
Copy Markdown
Owner Author

Fixed in f275ee7 (issue comment 6510557073, the cannot-read-memory-file entry): while vault_list_memory_files is served, the remedy now reads "check file against vault_list_memory_files and shorten an over-long name", so the three memory tools that carry the entry name the length cause again. On vault_update_memory a missing file is simply created, so this error there is almost always a name the filesystem rejects as too long. The fallback used when that tool is disabled already said "check file's spelling and length".


🔍 ship-check · pr-monitor · claude-opus-5-5

@aliasunder
aliasunder merged commit 3e86cf3 into main Oct 30, 2026
19 checks passed
@aliasunder
aliasunder deleted the worktree-error-prose-text-sweep branch October 30, 2026 00:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant