Polish text and lint writing with shared preservation rules using Vertex AI and optional TypeSafe AI judgment
Two tools with identical, overly long descriptions (>1000 chars) that bury key details. Both lack proper input/output schemas in visible code. Descriptions are disclosure-heavy rather than LLM-optimized. Tool names are verb-based (polish_text, lint_text) but descriptions do not clearly distinguish when to use each. No parameter descriptions visible in schema definitions. Error handling guidance is absent. Tool annotations present but descriptions fail to guide agent behavior.
copyeditor sends polish_text body and context/background to Vertex AI. This server does not persist body, candidates or judgments; providers govern retention. Use text or items [{id,text,context?}], never both; html uses text only. Set language when known; otherwise the server detects it without a default. lint_text calls no provider. Compare results before applying them manually. Keep originals on errors and flags. Judgment may cause one shared retry; it is not proof of correctness.
copyeditor sends polish_text body and context/background to Vertex AI. This server does not persist body, candidates or judgments; providers govern retention. Use text or items [{id,text,context?}], never both; html uses text only. Set language when known; otherwise the server detects it without a default. lint_text calls no provider. Compare results before applying them manually. Keep originals on errors and flags. Judgment may cause one shared retry; it is not proof of correctness. Body, permitted context/background and candidates may also be sent to TypeSafe AI. Provider retention and processing region follow its own policy.
Input and output schemas not visible in source code. edit_input_schema() and output_schema() are called but their definitions are not provided, making it impossible to verify parameter types, descriptions, or constraints.
Descriptions exceed 1024 characters and are dominated by legal/disclosure text rather than actionable guidance. The 'INSTRUCTIONS' constant (>400 chars) is reused verbatim, burying the actual tool purpose. Descriptions do not explain WHEN to use polish_text vs lint_text or what each returns.
No error recovery guidance. Descriptions mention 'Keep originals on errors and flags' but do not tell the LLM what to do if the tool fails (retry, ask user, try alternative). Error responses are generated by error_payload() but guidance is not visible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | 2025-06-18+ | v2 |
Parameter descriptions missing. The 'language' parameter is mentioned in code but no description is visible for what values are valid, what happens if omitted, or how detection works. Users cannot infer parameter semantics from names alone.
Identical descriptions for two distinct tools (polish_text vs lint_text). The description for lint_text incorrectly states 'copyeditor sends polish_text body' and does not clarify that lint_text performs local linting without calling a provider. LLMs will conflate the two tools.