Deterministic legal deadline engine for Singapore. Rules as data, every answer with a derivation trace. Library, CLI and MCP server.
Strong domain-specific tool design with clear naming (verb_noun pattern), comprehensive parameter descriptions, and well-documented schemas. All 7 tools have explicit descriptions and input schemas with type definitions. Output schemas are documented via .to_dict() returns. However, error handling lacks recovery guidance (e.g., 'unknown rule id' returns bare error dict without suggesting list_rules), and some parameter descriptions could be more prescriptive about format constraints. No tool annotations (readOnlyHint, etc.) despite all being read-only operations. Composition is excellent, tools are single-responsibility and chain well (list_rules → compute_deadline). Naming is consistently strong (list_rules, compute_deadline, working_days_between, etc.).
Date that is n working days after (or before, if negative) start.
Apply a procedural rule to a trigger date (ISO yyyy-mm-dd). Returns deadline + trace.
Deemed receipt of a contractual notice. Express the clause as parameters; sent_at is an ISO datetime; cutoff is HH:MM. Include the clause wording in `verbatim` for the audit trail.
Whether a date is a working day; if not, why.
Last day to commence proceedings under a limitation rule, from accrual/knowledge date.
List procedural rules (Rules of Court etc.) and limitation rules with their ids.
Error responses lack recovery guidance. compute_deadline and limitation_deadline return {'error': '...'} without suggesting next steps (e.g., 'call list_rules to find valid rule_id'). LLMs cannot self-correct without actionable guidance.
No tool annotations despite all 7 tools being read-only. Adding readOnlyHint=true to all tools would help clients optimize caching and retry logic. Current spec (2026-07-28) supports tool annotations.
Parameter descriptions for date/time inputs lack explicit format constraints. 'ISO date format (yyyy-mm-dd)' is stated but not enforced via JSON Schema pattern or minLength/maxLength. LLMs may pass malformed dates.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Working days strictly after start up to and including end.
deemed_receipt_date has 10 parameters, 6 optional. No documentation of parameter interdependencies (e.g., cutoff only applies if method is email/portal). Undocumented dependencies cause silent misuse.
Output schemas are implicit (via .to_dict() calls). No explicit JSON Schema documentation in tool definitions or docstrings. LLMs cannot plan downstream calls without knowing response structure.