Axiom Meridian
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Axiom Meridianwhat rules apply to this Quarkus project?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Index
Related MCP server: MarkdownLM MCP Server
0. Project fact sheet
0.1. Your full name:
Juan Manuel Rojas González (abeljumanuel.rojas@gmail.com)
0.2. Project name:
Axiom Meridian — "Code drifts. Meridian doesn't."
0.3. Brief project description:
An MCP (Model Context Protocol) server that centralizes a team's institutional technical knowledge — coding rules and lessons learned — and delivers only the slice relevant to the current task, instead of forcing AI agents to read entire knowledge-base files on every session.
0.4. Project URL:
Not applicable (MCP) — Axiom Meridian is an MCP server for local use (stdio) or, optionally, HTTP/SSE bound to 127.0.0.1; there is no publicly reachable deployment URL.
0.5. Repository URL or compressed file
https://github.com/abeljumanuel/axiom-meridian-project
1. General product description
1.1. Objective:
Teams that work with AI coding agents accumulate institutional knowledge as long Markdown files: coding standards per language/framework, architecture decisions, and "lessons learned" from production incidents. This works while the files are small, but as they grow it creates three problems: every agent session re-reads the whole file even when only two or three rules apply to the current task (context and latency cost), relevance is all-or-nothing (there's no notion of "this project uses Quarkus, that one uses Spring Boot"), and there is no governance (anyone can edit the file directly, with no review or traceability).
Axiom Meridian solves this by indexing rules (RN-*) and lessons (LL-*) in an atomic block format, resolving a scope hierarchy (project → framework → language → global) to decide what applies to a given project, and serving only that filtered subset — optionally ranked by semantic relevance — through typed MCP tools. The Markdown files remain the single source of truth, and every change goes through explicit human approval.
More detail in Project Charter and Product Description.
1.2. Key features and functionality:
Scoped knowledge queries —
query_rules/query_lessonsresolve a project's effective scope chain, apply category/severity/tag filters, and return only active, matching entries.Atomic, traceable format — every rule or lesson is a self-contained Markdown block (
## RN-JAVA-011,## LL-PSP-003) with structured fields, deterministically parseable and indexable.Governed lifecycle — extraction and legacy-file migration never write directly to active knowledge; everything lands first in
pending_proposals, andapprove_proposalpromotes the change to the Markdown file and the SQLite index in a single transaction.PR and feature auditing —
audit_prsurfaces the relevant rules/lessons before a merge;check_feature_against_rulesdoes the same during the planning phase.Meeting transcript extraction —
extract_rules_from_transcript/extract_lessons_from_transcriptturn meeting notes into candidate proposals.Hybrid retrieval (SQL + RAG) — when embeddings exist, queries rank by semantic similarity (
BAAI/bge-small-en-v1.5via ChromaDB); when they don't, it transparently falls back to SQL filtering, without changing the tool's signature.Access control and audit log — every tool is gated by an access level (
read/analyze/write); every invocation is recorded, excluding sensitive parameters.Ecosystem skill generation —
generate_project_skillsemits.claude/skills/files following theagentskills.ioconvention.
Full list in Product Description § Core Capabilities.
1.3. Design and user experience:
By design, Axiom Meridian has no graphical interface of its own: it is an MCP server consumed programmatically by AI agents (Claude Code, VSCode, OpenCode, Kimi CLI) through tool calls, not by a human user navigating screens. The current "user experience" is that of an agent invoking a tool and receiving a scope-filtered JSON response.
A read-only visual panel for a human (knowledge curator or platform admin) to inspect the server's state without writing scripts — server health, scope hierarchy, rule/lesson counts, pending proposals, an embedding projector — is under construction: it is a component explicitly contemplated in the backlog, not part of the current baseline. See US-H1 — Inspect Meridian's status and contents visually (Epic H) and its associated ticket, TICKET-017.
1.4. Installation instructions:
Meridian is a Python 3.11+ package (axiom-meridian) installed with uv, which fetches a compatible Python on its own. Being a standard MCP server, it can be consumed by any protocol-compatible IDE or CLI (Claude Code, VSCode, Cursor, OpenCode, Kimi CLI), but it is optimized for and tested primarily against Claude Code.
macOS / Linux — one-line install:
curl -fsSL https://raw.githubusercontent.com/abeljumanuel/axiom-meridian-project/main/scripts/install.sh | bashAny OS, Windows included (PowerShell or a terminal with uv installed):
uv tool install axiom-meridian
meridian setup # detects and configures your MCP clients, creates the knowledge base
meridian doctor # read-only check of the installationOn Windows, install uv first with powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"; no installer script is needed there, since meridian setup is plain Python.
install.sh is a thin wrapper around those same commands: it installs uv if missing (after asking), runs uv tool install, and hands off to meridian setup, which asks before configuring each detected client (Claude Code, VSCode, Cursor, OpenCode, Kimi CLI), never overwrites existing knowledge-base files or registrations that point at a different install, and finishes with meridian doctor. Run from a clone (bash scripts/install.sh), it installs that checkout in editable mode.
Claude Code plugin (server + usage skill in one unit): /plugin install meridian --marketplace abeljumanuel/axiom-meridian-project.
Semantic search is optional: install axiom-meridian[rag] (~900 MB of ML libraries) to rank free-text queries by meaning; without it, queries fall back to SQL filtering and generate_embeddings returns a RAG_NOT_INSTALLED error.
KNOWLEDGE_BASE_PATH is optional — Meridian auto-creates the knowledge base directory if it isn't set (~/.local/share/meridian on Linux, ~/Library/Application Support/meridian on macOS, %APPDATA%/meridian on Windows). Per-client configuration, upgrading, installing from source, and troubleshooting: docs/installation.md.
2. System Architecture
2.1. Architecture diagram:
Meridian follows a layered architecture: MCP tool registration → domain tool layer → parsers/RAG/persistence, with a single write choke point (write_block) that keeps the SQLite index in sync with the Markdown files. This pattern was chosen because the project's non-negotiable requirement is that Markdown remains the source of truth while SQLite acts only as an index and state layer; a "database as source of truth" architecture would have been simpler to implement, but would have broken the human reviewability (diff-friendly, Git-versionable) that is the project's whole reason for being. The trade-off accepted in exchange is an extra freshness-validation layer (indexed_files, mtime + sha256) to avoid serving out-of-sync content.
graph TB
subgraph Clients["MCP Clients"]
CC[Claude Code]
VS[VSCode]
OC[OpenCode]
KC[Kimi CLI]
end
subgraph Meridian["Axiom Meridian (Python / FastMCP)"]
SRV["server.py<br/>tool registration + security pattern"]
subgraph Tools["tools/"]
KM[knowledge_management]
KCO[knowledge_consumption]
AF[audit_flows]
EX[extraction]
KT[knowledge_templates]
end
subgraph Parsers["parsers/"]
AP[atomic_parser]
LP[legacy_parser]
end
subgraph RAGL["rag/ (optional)"]
EMB[embedder]
VEC[vector_store]
end
DBC["db/ (schema, migrations, connection)"]
SEC["utils/security.py<br/>access levels"]
SR["utils/scope_resolver.py"]
RI["utils/read_index.py<br/>write_block + freshness"]
end
subgraph Storage["Storage (KNOWLEDGE_BASE_PATH)"]
MD["Markdown files<br/>knowledge-base/*.md, lessons/*.md<br/>(source of truth)"]
SQLITE[("SQLite<br/>meridian.db<br/>(index + state)")]
CHROMA[("ChromaDB<br/>(optional vector store)")]
end
CC & VS & OC & KC -->|MCP stdio / HTTP-SSE| SRV
SRV --> SEC
SRV --> Tools
KM --> AP
KM --> LP
KM --> RI
KCO --> SR
KCO --> RAGL
RAGL --> CHROMA
RI --> MD
RI --> SQLITE
Tools --> DBC
DBC --> SQLITE(Diagram inferred directly from the reference implementation's source code — src/meridian/ — and previously documented in docs/03-system-architecture.md.)
2.2. Description of main components:
Component | Technology | Responsibility |
| FastMCP | Registers every |
| Python |
|
| Python |
|
|
|
|
| SQLite (WAL) |
|
| Python |
|
2.3. High-level project description and file structure
Note: this repository (
axiom-meridian-project) is the capstone's documentation deliverable and hostsdocs/,openspec/, andprompts/. The source-code structure shown below corresponds to the server's reference implementation (working checkoutaxiom-meridian/), which evolves in parallel to this documentation and is what the already-delivered tickets (section 6) build on.
axiom-meridian/
├── src/meridian/
│ ├── server.py # MCP tool registration + security pattern
│ ├── config.py # Configuration loading (env vars, paths)
│ ├── db/
│ │ ├── schema.sql # Full schema + seed scopes
│ │ ├── migrations.py # Versioned migration runner
│ │ ├── migrations/ # NNN_*.sql files
│ │ └── connection.py # SQLite WAL-mode connections
│ ├── parsers/
│ │ ├── atomic_parser.py # Canonical RN-*/LL-* format parser
│ │ └── legacy_parser.py # Free-form file parser (migration)
│ ├── rag/
│ │ ├── embedder.py # Lazy loading of BAAI/bge-small-en-v1.5
│ │ └── vector_store.py # ChromaDB collection wrapper
│ ├── tools/
│ │ ├── knowledge_management.py # Indexing, proposals, promotion
│ │ ├── knowledge_consumption.py # Queries, context, timeline
│ │ ├── audit_flows.py # audit_pr, check_feature_against_rules
│ │ ├── extraction.py # Transcript extraction
│ │ └── knowledge_templates.py # Canonical block templates
│ └── utils/
│ ├── security.py # Access levels (read/analyze/write)
│ ├── scope_resolver.py # Scope hierarchy resolution
│ ├── read_index.py # write_block + freshness validation
│ ├── id_generator.py # Atomic IDs via id_counters
│ ├── privacy.py # Redaction of <private> tags
│ ├── serializers.py # JSON/TOON serialization
│ └── skill_generator.py # .claude/skills/ generation
├── tests/
│ ├── unit/ # Parsers, resolver, migrations, security...
│ ├── integration/ # Full flows (index+query, proposals...)
│ ├── contract/ # MCP tool signatures
│ └── benchmarks/ # Performance regression guards
├── scripts/
│ ├── install.sh # Linux/macOS installer
│ └── uninstall.sh
└── pyproject.tomlIn this repository (axiom-meridian-project), the structure reflects its documentation-first nature:
axiom-meridian-project/
├── docs/ # Baseline documentation (charter, architecture, data model...)
├── openspec/
│ ├── specs/ # Baseline of already-delivered capabilities
│ └── changes/ # Active change proposals (backlog)
├── prompts/ # Project working prompts
└── README.md2.4. Infrastructure and deployment
Meridian requires no cloud infrastructure: it is a local process invoked by the MCP client (stdio) or, optionally, an HTTP/SSE server bound exclusively to 127.0.0.1 (meridian serve <port>), never 0.0.0.0. In HTTP mode a random session token is emitted at startup, required as Authorization: Bearer <token> on every request; the token is never persisted and rotates on every restart.
There is no documented deployment/CI pipeline in this repository yet — the current "deployment" is the local install via scripts/install.sh described in section 1.4. Hardening a networked deployment (multi-client, TLS, rate limiting) is identified as future work in TICKET-015.
2.5. Security
Access level | Grants | Typical caller |
| Queries only — nothing is persisted. | Agents that only consume knowledge. |
|
| Normal development sessions. |
| Full access — indexing, approvals, embeddings, skill generation. | Administration and migration. |
A higher level includes all lower levels.
An insufficient level returns a structured
ACCESS_DENIEDerror naming the required level.Every call — granted or denied — is recorded in
access_log, excluding sensitive parameters (pr_diff,feedback_text,text,proposed_text,new_text).<private>tags are stripped from all inbound text before persistence, on every write path.The HTTP/SSE transport is bound to
127.0.0.1by design and requires a bearer token (see 2.4).
2.6. Tests
The reference implementation's test suite follows a four-level pyramid, run with pytest / pytest-asyncio:
Unit (
tests/unit/) — parsers (atomic_parser,legacy_parser),scope_resolver,id_generator,migrations,security,serializers,connection, among others. Validate each module in isolation.Integration (
tests/integration/) — full end-to-end flows: index + query, proposal lifecycle, access control, RAG queries, skill generation, external file edits.Contract (
tests/contract/) — verifies that the exposed MCP tool signatures don't change in a backwards-incompatible way.Benchmarks (
tests/benchmarks/) — performance regression guards; excluded from the default run (addopts = "-m 'not benchmark'"inpyproject.toml) and invoked explicitly with-m benchmark.
Every relevant bug fix (see ADR-003 through ADR-006 in System Architecture) added its own regression test before closing, and the delivered tickets (section 6) reference the specific test file covering their acceptance criteria.
3. Data Model
3.1. Data model diagram:
erDiagram
SCOPES ||--o{ SCOPES : "parent_id"
SCOPES ||--o{ SCOPE_ATTRIBUTES : has
SCOPES ||--o{ RULES : scopes
SCOPES ||--o{ LESSONS : scopes
SCOPES ||--o{ PENDING_PROPOSALS : "suggested for"
RULES ||--o{ RULE_ATTRIBUTES : has
RULES ||--o{ RULE_HISTORY : has
RULES ||--o{ RULE_TAGS : has
RULES ||--o{ RULE_LESSON_LINKS : links
LESSONS ||--o{ LESSON_HISTORY : has
LESSONS ||--o{ LESSON_TAGS : has
LESSONS ||--o{ RULE_LESSON_LINKS : links
RULES }o--|| LESSONS : originated_from
SCOPES {
text id PK
text type
text name
text parent_id FK
}
SCOPE_ATTRIBUTES {
text scope_id FK
text key
text value
}
RULES {
text id PK
text scope_id FK
text code UK
text text
text category
text severity
text applies_to
text status
text file_path
integer file_offset
integer byte_length
text originated_lesson_id FK
text embedding_id
}
RULE_ATTRIBUTES {
text rule_id FK
text key
text value
}
RULE_HISTORY {
text id PK
text rule_id FK
text change_type
text previous_text
text new_text
text reason
text triggered_by
text changed_at
}
RULE_TAGS {
text rule_id FK
text tag
}
LESSONS {
text id PK
text scope_id FK
text code UK
text project
text date_occurred
text severity
text area_affected
text what_happened
text impact
text root_cause
text resolution
text originated_rule_id FK
text status
text file_path
}
LESSON_HISTORY {
text id PK
text lesson_id FK
text change_type
text previous_text
text new_text
text reason
text changed_at
}
LESSON_TAGS {
text lesson_id FK
text tag
}
RULE_LESSON_LINKS {
text rule_id FK
text lesson_id FK
text link_type
}
PENDING_PROPOSALS {
text id PK
text type
text scope_id FK
text target_id
text proposed_text
text metadata
text status
text legacy_original
text created_at
}
PROJECT_SCOPE_RESOLUTION {
text project_id PK
text resolved_scopes
text updated_at
}
PR_AUDITS {
text id PK
text project_id
text pr_ref
text diff_hash
integer rules_evaluated
text violations_found
text audited_at
}
PLANNING_CHECKS {
text id PK
text project_id
text feature_description
text conflicts_found
text checked_at
}
ACCESS_LOG {
text id PK
text timestamp
text tool_name
text access_level
text project_id
text parameters
text result
text transport
}
ID_COUNTERS {
text name PK
integer next
}
INDEXED_FILES {
text file_path PK
real mtime
text content_hash
text updated_at
}(ERD verified against the real schema in src/meridian/db/schema.sql of the reference implementation — 17 tables, 1:1 match.)
3.2. Description of main entities:
Table | Purpose |
| Hierarchical nodes ( |
| Dynamic key/value attributes on a scope ( |
| Active/deprecated technical rules ( |
| Dynamic attributes on an individual rule, layered on top of its scope's. |
| Append-only audit trail of every change to a rule ( |
| Normalized one-row-per-tag table for exact-match filtering (not substring |
| Incidents/lessons ( |
| Append-only audit trail of lesson changes. |
| Normalized tags for lessons, mirroring |
| Bidirectional links between a rule and the lesson(s) that originated or reference it. Constraint: uniqueness of the |
| Cache of the resolved scope chain for a project. PK |
| Record of every |
| Record of every |
| Staging area for every rule/lesson candidate (extraction, legacy migration, manual creation) awaiting human review. |
| Security audit trail — every tool invocation, its required access level, and its outcome ( |
| Atomic counters for generating sequential, human-readable IDs, via |
| Per-file freshness fingerprint ( |
Extended detail, including the atomic block format and the ID-generation strategy, in docs/04-data-model.md.
4. API Specification
Meridian does not expose a conventional REST API: it exposes a set of typed MCP tools (25+ in the reference implementation — query_rules, audit_pr, create_pending_proposal, etc.), invoked through the MCP protocol (stdio or HTTP/SSE) rather than HTTP routes with verbs. Forcing an OpenAPI 3 specification onto this interface would be misleading: OpenAPI models resources and HTTP verbs, whereas an MCP tool is a function with an input/output schema (JSON Schema) and a "an action a model can invoke" semantics — closer to a function signature than to an endpoint.
As a formal alternative, this project will adopt a Semantic Tool Definition via Declarative Schema, or Model-Oriented Documentation: one document per tool specifying, in JSON Schema, its input parameters, the required access level (read/analyze/write), the response shape, and invocation examples — the same kind of contract already validated by tests/contract/test_mcp_tool_signatures.py in the reference implementation, but exposed as product documentation rather than only as a test. This convention has been identified but is not yet implemented in the project's documentation; it will be addressed in a later delivery, documenting at minimum the three most-used tools (query_rules, audit_pr, create_pending_proposal/approve_proposal).
5. User Stories
Full catalog (8 epics, As a / I want / so that format, MoSCoW priority) in docs/05-user-stories.md. Below, 3 representative ones:
User Story 1 — US-A1 — Query relevant rules for my project (Epic A, priority Must, tool query_rules).
User Story 2 — US-B3 — Review and approve a proposal (Epic B, priority Must, tools list_pending_proposals / approve_proposal / reject_proposal).
User Story 3 — US-C1 — Audit a pull request against known rules (Epic C, priority Must, tool audit_pr).
6. Work Tickets
Full catalog (delivered + backlog, traced to OpenSpec) in docs/06-work-tickets.md. Below, one backend, one database, and one frontend ticket:
Ticket 1 (Backend) — TICKET-001 — MCP server scaffold and core tool surface. Stands up the FastMCP server, the server.py security pattern, the SQLite schema, and the initial tool set. Status: Done.
Ticket 2 (Database) — TICKET-008 — Indexed read path with per-file freshness (ADR-005). Adds indexed_files, rule_tags, lesson_tags; introduces write_block as the single write choke point; moves detail="full" reads to SQLite validated by per-file freshness. Status: Done.
Ticket 3 (Frontend) — TICKET-017 — Read-only observability dashboard, corresponding to US-H1. A read-only web dashboard (server health, scope hierarchy, pending proposals, embedding projector) as a separate local process, reusing knowledge_consumption as a library. Status: Backlog — this is the only frontend component contemplated in the project; its formal specification lives in openspec/changes/add-observability-dashboard/.
7. Pull Requests
Only Pull Requests that close a complete, verifiable deliverable are referenced here. The first valid deliverable is the baseline technical documentation (project fact sheet, description, architecture, data model, user stories, work tickets) — this very README and
docs/.
Pull Request 1 — #1 — Removing duplicates (merged). Cleanup of duplicated content in the baseline documentation prior to this delivery.
Pull Request 2 — Pending. Will be referenced once a PR contains the full first delivery: "Technical documentation: project fact sheet, description, architecture, data model, user stories, work tickets."
Pull Request 3 — Pending.
License
Axiom Meridian is licensed under the Apache License, Version 2.0. See NOTICE for attribution.
The names "Axiom Meridian" and "Axiom JUMA" and their marks are not licensed under the Apache License (section 6, Trademarks). Using them requires the owner's permission.
License transition: versions made available before the change to Apache 2.0 were declared under the MIT License, and copies obtained under those terms remain available under them.
Third-party: the .claude/skills/openspec-* skills are generated by OpenSpec and keep their own MIT license.
Contributions are welcome under the Apache License 2.0 with a DCO sign-off; see CONTRIBUTING.md.
Available Tools
28 toolsanalyze_pr_feedbackB
Link PR review feedback to the most recent audit_pr record for the same pr_ref/project_id, returning the rules that applied at that time for the calling LLM to classify each feedback point.
Access level: analyze. Returns: JSON with feedback_text, rules_that_applied, pr_audit_record, and an instruction_for_client.
| Name | Required | Description | Default |
|---|---|---|---|
| pr_ref | Yes | Reference (e.g. PR number/URL) used to find the matching audit_pr call. | |
| project_id | Yes | Project id the original audit_pr call used. | |
| feedback_text | Yes | Free-text PR review feedback to classify. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden; it discloses the 'analyze' access level and the returned JSON keys, which is useful. However, it omits the key behavioral dependency (what happens when no prior audit_pr record exists) and does not confirm read-only versus mutating behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded, followed by access level and return shape. Efficient and well-ordered, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-key enumeration is somewhat redundant, and parameters are fully documented in the schema. The remaining gap is behavioral: with no annotations, the description should state the missing-audit-record case and read-only nature to be complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only marginal value by clarifying that pr_ref/project_id must match the original audit_pr call; no format or edge-case detail beyond the schema is supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (link/classify) and resource (PR review feedback linked to the most recent audit_pr record), and names the exact keys used for matching (pr_ref/project_id). It is distinguishable from audit_pr because it is explicitly the consumer of that record, though it does not differentiate itself from the broader query/classify siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via 'for the calling LLM to classify each feedback point,' making the context inferable, but it never states when to use this versus audit_pr, query_rules, or check_feature_against_rules, nor any prerequisite that an audit_pr call must have happened first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_proposalA
Approve a pending proposal. For type='rule'/'lesson' this assigns a new RN-/LL- code, appends the atomic block to the scope's .md file, and inserts the corresponding row; for type='update' it splices the target's existing block in place instead. This is the single choke point that writes proposal content into both the .md file and SQLite together.
Access level: write. Returns: JSON with the resulting code, scope_id, and file location (file_path/file_offset/byte_length).
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_id | Yes | The pending_proposals id to approve. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the dual .md + SQLite write, code assignment, in-place splicing, and declares 'Access level: write.' It stops short of stating reversibility/undo or error behavior if the proposal is not pending, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the per-type consequences, then access level and return shape. Every sentence is informative; slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, yet the description usefully names the returned fields (code, scope_id, file location). Type-dependent behavior is fully covered. Minor gaps remain around failure/edge cases (e.g., approving an already-approved proposal), but it is solid for a single-param mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already documents proposal_id. The description adds no naming/format detail beyond it, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Approve a pending proposal') with a precise breakdown of what happens by type (rule/lesson get code assignment + block append + row insert; update splices in place). This clearly distinguishes it from siblings like reject_proposal, edit_proposal, and create_pending_proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — you approve a pending proposal, and type determines the write path. However, there is no explicit when-to-use vs alternatives guidance (e.g., when to reject vs edit vs approve, or prerequisites such as the proposal must be pending). Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_prA
Audit a PR diff against a project's active rules and lessons (detail="full"): persists an audit record (SHA-256 diff hash + a snapshot of the rule versions evaluated) and returns the diff plus rules/lessons for the calling LLM to classify.
Access level: analyze. Returns: JSON with audit_id, pr_diff, rules, lessons, and an instruction_for_client.
| Name | Required | Description | Default |
|---|---|---|---|
| pr_diff | Yes | The PR's unified diff text. | |
| project_id | Yes | Project id whose active rules/lessons to audit against. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does reasonably well: it states the tool persists an audit record (SHA-256 diff hash plus a rule-version snapshot), declares 'Access level: analyze', and enumerates the response contents. It does not state permission prerequisites or reversibility, and the stray detail="full" reference muddies the picture, but the mutation/persistence behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the total length is reasonable for a tool with persistence semantics. The parenthetical '(detail="full")' and the trailing 'Returns:' line are somewhat redundant against the output schema, but there is no significant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return fields is arguably redundant rather than necessary, and the description nonetheless gives a full picture of the persist-and-return workflow. The gaps are routing guidance among siblings and the unresolved detail="full" reference, not core operational knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description actively harms parameter understanding: it references a detail="full" mode that does not exist in the schema (only pr_diff and project_id, with additionalProperties: false), so an agent may attempt an invalid argument. It adds no meaning to the two real parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: audit a PR diff against a project's active rules and lessons, and clarifies it persists an audit record and returns diff/rules for the calling LLM to classify. This is clear and distinct from read-only siblings like get_rule_audit_log, though it never names a sibling or explicitly states how it differs from close neighbors such as check_feature_against_rules or analyze_pr_feedback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the workflow (persist a record, then hand rules/diff to the LLM for classification) tells an agent roughly what the call accomplishes. There is no explicit when-to-use vs. when-not guidance and no routing to alternatives such as check_feature_against_rules for a simple single-check, which matters given ~25 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_feature_against_rulesA
Check a planned feature description against a project's active rules and lessons (detail="full"); persists a planning_checks record and returns the context for the calling LLM to flag conflicts.
Access level: analyze. Returns: JSON with feature_description, rules, lessons, check_id, and an instruction_for_client.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id whose active rules/lessons to check against. | |
| feature_description | Yes | Free-text description of the feature being planned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the write side effect (persisting a planning_checks record), the access level ('analyze'), and that the tool returns context for the calling LLM rather than a verdict. It does not cover idempotency or whether repeated checks duplicate records, but the key side effect is surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by compact labeled 'Access level' and 'Returns' lines. Efficient overall, though the stray '(detail="full")' aside is dead weight that does not correspond to any parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both parameters are schema-covered and an output schema exists, yet the description still usefully names the returned JSON fields. The remaining gap is the undocumented/mismatched 'detail' reference, which slightly undermines completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema and the baseline is 3. The description actually adds a reference to a 'detail="full"' parameter that does not exist in the schema, which is mildly misleading rather than helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: check a planned feature description against a project's active rules and lessons. It is clearly distinct from pure retrieval siblings like query_rules or get_rule_context. It does not explicitly name those siblings, so it stops short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'planned feature description' and by the note that a planning_checks record is persisted before coding. However, no explicit when-to-use/when-not or routing against alternatives such as query_rules or get_rule_context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_to_atomic_formatA
Convert a legacy markdown file into atomic-format pending_proposals,
one per legacy block, with best-effort scope inference from each block's
text. Never writes .md files directly — always stages for human review
via approve_proposal.
Access level: write. Returns: JSON with the number of proposals created and their id/type/ scope_id/suggested_file.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_type | Yes | 'rules' or 'lessons' — which legacy parser and destination to use. | |
| filepath | Yes | Path to the legacy (### -style) markdown file to convert. | |
| default_scope_id | Yes | Fallback scope used when scope inference from the block's text doesn't match a known technology keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares write access, states it never writes .md files directly, and explains it stages for human review via approve_proposal. It omits idempotency and permission specifics, but the key unsafe-operation behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constrained to a few tight sentences. The 'Returns' line is somewhat redundant given an output schema exists, but overall it is efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter write tool with no annotations, the description covers the essential behavioral traits (staging, no direct write, access level) and an output schema covers return values. Minor gaps in permission and error behavior remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description's mention of 'best-effort scope inference' essentially restates the default_scope_id fallback already described in the schema, adding little beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (convert) and resource (legacy markdown file) with a clear output form (atomic-format pending_proposals, one per legacy block). It is distinguishable from siblings like index_rules_from_markdown and create_pending_proposal because it describes batch conversion of a legacy file into staged proposals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is for legacy (###-style) markdown and always stages rather than writing. However, it never names when to prefer this over index_rules_from_markdown, extract_rules_from_transcript, or create_pending_proposal, so the agent must infer selection from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pending_proposalA
Validate and persist a pending proposal of type 'rule', 'lesson', or 'update' (private tags stripped from proposed_text and metadata). The body goes in proposed_text and the other block fields in metadata; a full rendered atomic block in proposed_text is split into the two. For type='update', target_id must reference an existing RN-/LL- id and the proposal inherits that target's scope_id. Does not write to rules/lessons or any .md file — approve_proposal does that after human review.
Access level: analyze. Returns: the new proposal's id, as a plain string.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Proposal type: 'rule', 'lesson', or 'update'. | |
| metadata | No | JSON object with the block fields other than the body. Rule keys: category, severity (low|medium|high|critical), applies_to, tags (list or comma-separated), source. Lesson keys: project, date_occurred, severity, area_affected, tags, impact, root_cause, resolution, originated_rule_id. For type='update', omitted keys keep the target's current values. | |
| target_id | No | For type='update': the existing RN-*/LL-* id this proposal will replace. | |
| source_ref | No | Provenance reference, e.g. a meeting id or PR link. | |
| source_type | No | Provenance type, e.g. 'transcript' or 'manual'. | |
| target_type | No | For type='update': 'rule' or 'lesson'; inferred from target_id's prefix if omitted. | |
| proposed_text | Yes | The body only: the rule text (goes under **Regla:**) or what happened (goes under **Qué pasó:**). Put the other block fields in `metadata`. A full rendered atomic block is also accepted and split into body + metadata. Private tags are stripped before storage. | |
| suggested_scope_id | Yes | Scope to attach the proposal to if approved. Ignored for type='update', which inherits the target's own scope. | |
| suggested_attributes | No | JSON array of {"key": ..., "value": ...} dynamic attributes (ADR-002) to attach if approved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses input normalization (private tags stripped from proposed_text and metadata), a non-obvious splitting behavior (a full rendered atomic block is split into body + metadata), scope inheritance for updates, the absence of writes to rules/lessons/.md, and the access level ('analyze'). These are exactly the side effects an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and densely informative, with each sentence covering a distinct behavior. The body/metadata sentence duplicates guidance already in the schema, and the returns/access-level lines are slightly tacked on, so it is a touch redundant rather than maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation-style tool with no annotations, the description covers the critical unknowns: input tampering (tag stripping), the update path's referential precondition, scope inheritance, what is NOT written to disk, and the follow-up tool. An output schema exists, so its brief return note is a bonus rather than a necessity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds genuine semantics beyond the schema: it explains the body-vs-metadata division and the atomic-block splitting rule that governs how proposed_text is parsed, plus the target_id prefix constraint. This meaningfully reduces ambiguity about how to populate the two primary fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Validate and persist a pending proposal') and enumerates the three types it accepts. It also draws a bright line against the sibling that actually commits changes ('Does not write to rules/lessons ... approve_proposal does that'), so an agent can place it precisely in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the pipeline clear: this creates a pending proposal that requires human review, and approve_proposal is what promotes it. It also gives a conditional precondition (for type='update', target_id must reference an existing RN-*/LL-* id). It doesn't compare against edit_proposal/reject_proposal, but the create-vs-approve contrast is well established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectA
Create a new project scope and its knowledge base directories: a 'project-' scope under parent_scope, plus knowledge-base/projects/ and lessons/projects/ directories with a placeholder rules .md file.
Access level: write. Returns: JSON with the new scope_id, name, parent_scope, and created file_path.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Human-readable project name; defaults to project_id. | |
| project_id | Yes | New project identifier (the tool creates scope 'project-<id>'). | |
| parent_scope | No | Existing scope this project inherits from in the scope hierarchy. | global |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses write access, that directories and a placeholder file are created (side effects beyond a pure record insert), and what the response contains. It stops short of stating what happens on a duplicate project_id or whether an existing scope/file is overwritten, which is the main residual risk for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded, two compact sentences with concrete detail and zero filler. The trailing 'Returns:' line is mild redundancy given an output schema exists, but it is short enough not to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a resource-creating tool with 100% schema coverage and an output schema, the description covers purpose, side effects, access level, and return shape. The remaining gap is conflict/idempotency behavior on repeat calls, which an agent would benefit from knowing since no annotations cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the 'project-<id>' derivation and the parent_scope hierarchy idea, which the schema already documents, so it adds little semantic value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Create a new project scope and its knowledge base directories') and enumerates the exact artifacts produced ('project-<id>' scope, knowledge-base/projects/, lessons/projects/, placeholder rules .md). No sibling tool creates a project scope, so an agent can distinguish this from create_pending_proposal or generate_project_skills without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description makes clear this bootstraps a new project's scope and directories, but never states when to call it rather than generate_project_skills or create_pending_proposal, nor any precondition (e.g., that parent_scope must already exist). Adequate minimum-viable context, no explicit routing or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deprecate_ruleA
Create a proposal to deprecate a rule or lesson on its own, without changing its scope (unlike promote_rule). Accepts both RN-* and LL-* ids. Only creates a pending_proposals row (type='deprecate') — no immediate effect; approve_proposal performs the actual deprecation after human review.
Access level: analyze. Returns: the new proposal's id, as a plain string.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why this rule/lesson is being deprecated. | |
| rule_id | Yes | The RN-* or LL-* id of the rule/lesson to deprecate. | |
| superseded_by | No | Optional RN-*/LL-* id of the active rule/lesson that replaces this one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that only a pending_proposals row is created, that there is 'no immediate effect', that approve_proposal is required after human review, and states the access level (analyze). It omits whether the proposal can be withdrawn or reversed (e.g., via reject_proposal), leaving a small gap for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences that are front-loaded with the core action and differentiation, followed by the side-effect disclosure and return value. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated mutation tool this is complete: it covers the action, differentiation from siblings, side-effect behavior, follow-up approval step, access level, and even names the return value. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the RN-*/LL-* id format and the optional superseded_by. The description's note that it 'accepts both RN-* and LL-* ids' largely restates schema content, so baseline 3 is appropriate with the schema doing the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a proposal to deprecate a rule or lesson') and immediately distinguishes itself from the sibling 'promote_rule' by noting it does not change scope. An agent can tell exactly what this tool produces and how it differs from its nearest alternative without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('unlike promote_rule') and the condition that separates them (deprecate on its own vs. changing scope). It also routes the agent through the workflow by stating that 'approve_proposal performs the actual deprecation after human review', so the when-to-use and what-happens-next path is fully clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_proposalA
Update the proposed_text and/or metadata of a still-pending proposal; its status stays 'pending'.
Access level: write. Returns: JSON with the proposal_id and its status.
| Name | Required | Description | Default |
|---|---|---|---|
| metadata | No | JSON object merged into the proposal's existing metadata. | |
| new_text | Yes | Replacement proposed_text (private tags are stripped before storage). | |
| proposal_id | Yes | The pending_proposals id to edit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the write access level and that the mutation preserves the 'pending' status (a non-obvious lifecycle guarantee). However, it omits permission requirements, behavior on non-pending proposals, and whether edits are recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tight and front-loaded: the core purpose leads, followed by access level and return shape in compact lines. The 'Returns' sentence is redundant given the output schema exists, costing a small amount of economy but no clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with an output schema (so return values need no explanation) and a fully documented schema, the description covers purpose, scope, and access adequately. Remaining gaps are behavioral details (failure on resolved proposals, permission granularity) rather than anything blocking correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents new_text and metadata, establishing a baseline of 3. The description adds little beyond restating the fields, and actually refers to 'proposed_text' while the parameter is named 'new_text', a mild naming mismatch that could cause confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the proposed_text and/or metadata of a still-pending proposal') and adds the important scoping fact that status stays 'pending'. It distinguishes itself from siblings by being the only editor of an existing proposal, though it never names create/approve/reject_proposal to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'still-pending proposal' implicitly conveys when this tool applies (and that approved/rejected proposals are out of scope), but there is no explicit when-to-use statement, no named alternative, and no guidance on what happens if the proposal is already resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_lessons_from_transcriptA
Return everything the calling LLM needs to extract candidate lessons from a transcript: the clean text, the project's scope chain with attributes, existing lessons for duplicate detection, and the canonical lesson template. Does not itself create any proposal — call create_pending_proposal per candidate.
Access level: analyze. Returns: JSON with clean_text, scopes, existing_lessons, template, and an instruction_for_client.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Raw transcript text; private tags are stripped automatically. | |
| project_id | Yes | Project id used to resolve scopes and existing lessons. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly discharges it: it declares the access level (analyze), states that it has no side effects (creates no proposal), and names the returned payload fields. It does not discuss auth requirements or any limits, but for a read-only prep tool this is solid disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and readable, but the return fields are listed twice: once in prose ('the clean text, the project's scope chain... existing lessons... template') and again in the 'Returns: JSON with clean_text, scopes, existing_lessons, template' line. Since an output schema already exists, that second enumeration is largely redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter prep tool with an output schema present, the description covers purpose, side-effect status, access level, and the follow-up call, which is enough for correct invocation. The only shortfall is minor redundancy rather than a missing piece.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (text, project_id) are already documented in the schema. The description only echoes this at a high level ('clean text', 'project's scope chain'), adding no syntax or format detail beyond the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return/extract) and resource (candidate lessons from a transcript) and enumerates exactly what it provides: clean text, scope chain, existing lessons, template. It also positions itself against the sibling create_pending_proposal, so the agent can separate this read/prep step from the write step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly notes it 'does not itself create any proposal — call create_pending_proposal per candidate,' which clarifies the workflow and the alternative. It lacks an explicit statement of when this should be preferred over the parallel extract_rules_from_transcript, leaving that inference to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_rules_from_transcriptA
Return everything the calling LLM needs to extract candidate rules from a transcript: the clean text, the project's scope chain with attributes, existing rules for duplicate detection, and the canonical rule template. Does not itself create any proposal — call create_pending_proposal per candidate.
Access level: analyze. Returns: JSON with clean_text, scopes, existing_rules, template, and an instruction_for_client.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Raw transcript text; private tags are stripped automatically. | |
| project_id | Yes | Project id used to resolve scopes and existing rules. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does so well: it declares the access level ('analyze'), states that no proposal is created (no mutation side effect), and lists the returned fields plus an instruction_for_client. It stops short of describing error or size/rate behavior, but the safety profile is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return contract, then the crucial non-mutation caveat and the access level. Slightly repetitive in listing returns twice (prose and field list), but nothing is wasteful or confusing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still summarizes the payload and adds the access level and the 'no proposal created' caveat, which the schema cannot convey. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params are documented there (private tag stripping, project_id resolving scopes). The description adds little beyond restating those, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (extract) and resource (candidate rules from a transcript) and enumerates exactly what it returns (clean text, scope chain, existing rules, template). It is clearly distinguishable from the sibling extract_lessons_from_transcript.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes the tool's job ('Does not itself create any proposal') and names the follow-up alternative ('call create_pending_proposal per candidate'), so the agent knows both when to use this and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_embeddingsA
Generate or update ChromaDB embeddings for active rules/lessons whose embedding_id is still NULL — an incremental backfill, not a full re-embed.
Access level: write.
Returns: JSON with processed/skipped/errors counts and duration_seconds,
or {"error": "RAG_NOT_INSTALLED", ...} when the rag extra is absent.
| Name | Required | Description | Default |
|---|---|---|---|
| scope_id | No | Restrict to one scope; omit to process every scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and handles it well: it declares 'Access level: write', describes the success payload shape (processed/skipped/errors counts, duration_seconds), and discloses the specific failure mode RAG_NOT_INSTALLED when the rag extra is missing. It stops short of idempotency/concurrency or auth details, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact paragraphs: the core behavior and its incremental nature come first, followed by the access/returns/error block. No filler sentences and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter write tool with an output schema already present, the description supplies the essentials an agent needs: write semantics, backfill-only scope, and the RAG_NOT_INSTALLED error path. Only marginal items (permissions, whether re-runs are safe) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single scope_id parameter, and the description's 'omit to process every scope' simply restates the schema's own default semantics. Baseline 3 is appropriate since the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate or update ChromaDB embeddings') plus a precise scope qualifier ('active rules/lessons whose embedding_id is still NULL'). The phrase 'an incremental backfill, not a full re-embed' cleanly separates it from sibling index_rules_from_markdown / index_lessons_from_markdown, which an agent could otherwise confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition: run only for records with NULL embedding_id, i.e. a backfill of missing embeddings rather than a re-index. It does not name an explicit alternative tool or state when-not to call, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_project_skillsA
Generate a Claude Code skill for a project from its resolved rules: writes .claude/skills/meridian/<project_id>/SKILL.md and references/rules.md under project_path, and updates its AGENTS.md.
Access level: write. Returns: JSON mapping "skill_md"/"rules_md"/"agents_md" to their written file paths.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project scope to generate skill files for. | |
| project_path | No | Filesystem path to the target project; falls back to MERIDIAN_PROJECT_PATH if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so reasonably: it discloses write access, the concrete files created, and that AGENTS.md is modified. It does not say whether existing skill files are overwritten, whether the operation is idempotent, or what permissions are required — gaps for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and its outputs, then declares access level and return shape. Every sentence earns its place and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so the return-value sentence is somewhat redundant, but the description covers the critical unknowns for an unannotated write tool: what is written and where. Missing overwrite/idempotency behavior and the prerequisite that rules be resolved first keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the MERIDIAN_PROJECT_PATH fallback. The description only restates that output lands under project_path ('under project_path'), adding no new semantic detail beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (generate a Claude Code skill for a project) plus the exact artifacts produced (.claude/skills/meridian/<project_id>/SKILL.md, references/rules.md, AGENTS.md). No sibling in the list produces skill files, so the agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from its resolved rules' implies a prerequisite (rules must already be resolved, likely via get_project_scope_resolution), but this is left to inference. There is no explicit when-to-use/when-not statement and no alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lesson_templateB
Return the canonical ## LL-XXX-NNN atomic block template, its field
descriptions, and usage instructions.
Access level: read. Returns: JSON with template, fields, usage, and (if project_id given) scope_suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | If given, also returns recommended scope_suggestions for this project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden but does state 'Access level: read' and describes the conditional behavior of project_id triggering scope_suggestions. For a pure read-only getter this is adequate, though it discloses nothing about output size, caching, or error modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines: purpose first, then access level, then return shape. No filler and the conditionality of scope_suggestions is stated compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-param read-only tool with an output schema, the description is nearly sufficient: it names the payload keys and the conditional behavior. The only gap is the absence of routing guidance to sibling template tools, which keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single project_id parameter is already documented in the schema. The description's '(if project_id given) scope_suggestions' repeats that schema text nearly verbatim rather than adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: returns the canonical `## LL-XXX-NNN` atomic block template plus its field descriptions and usage instructions. An agent can distinguish it from get_rule_template by the 'LL-XXX' namespace, but the description never explicitly names or contrasts the sibling rule/transcription templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance. It does not say to call this before authoring a lesson, nor when to prefer it over get_rule_template or get_transcription_template. Usage must be inferred purely from the returned payload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_scope_resolutionB
Resolve and cache a project's effective scope chain (most-specific first) with each scope's dynamic attributes (ADR-002).
Access level: read.
Returns: JSON with project_id and the resolved scopes list (each with
its attributes).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (with or without the 'project-' prefix). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real value: it discloses the caching side effect, declares read access, and names the return shape (project_id + scopes list). However, it omits cache invalidation/TTL behavior, permission requirements, and whether the cache is shared or per-call, which matter for a tool whose primary action is 'cache'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core action and scope ordering, then the access level and return contract. Minimal waste, though the ADR-002 citation is a reference an agent cannot act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the parameter is fully covered. The remaining gap is guidance on when/why to invoke it, which leaves the definition adequate but incomplete for a non-obvious domain concept.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single project_id parameter is fully documented in the schema (including the optional 'project-' prefix). The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Resolve and cache') and resource ('a project's effective scope chain'), plus the ordering ('most-specific first') and payload ('each scope's dynamic attributes'). It is distinguishable, though 'effective scope chain' and the ADR-002 reference are jargon that assumes domain knowledge, and no sibling tool overlaps this niche anyway.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states 'Access level: read' but gives no indication of when an agent should call this versus other project/rule tools, nor any prerequisite (e.g. that scopes are needed to compute effective rules). Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rule_audit_logB
Return the chronology of rule_history changes for a project or scope, plus any rules currently deprecated in that scope.
Access level: read.
Returns: JSON with events and deprecated_rules.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO-8601 timestamp; only include events at or after this time. | |
| scope_id | No | Raw scope id to scope the log to, if project_id is omitted. | |
| project_id | No | Project id to scope the log to (checked before scope_id). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the key trait ('Access level: read') and the return shape ('events' and 'deprecated_rules'), which is genuinely useful. It says nothing about auth requirements, result size/pagination, or how far back the chronology goes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight lines: purpose and scope first, then access level, then return shape. No wasted words and the most important information is front-loaded. Slightly fragmented into labeled stubs rather than flowing prose, but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value explanation is not strictly needed, and all parameters are covered at 100%. The description adequately covers purpose, scope, and access level, but omits any sibling differentiation, which is the notable gap given the near-identical get_rule_timeline.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (since, scope_id, project_id) are already documented, including the precedence rule that project_id is checked before scope_id. The description adds no format or syntax beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: 'Return the chronology of rule_history changes' with a stated scope (project or scope) plus deprecated rules. The agent knows what comes back. It does not, however, differentiate itself from the sibling get_rule_timeline, which sounds highly overlapping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope ('for a project or scope') implies context, but there is no explicit when-to-use, no when-not-to-use, and no routing to alternatives such as get_rule_timeline or get_rule_context. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rule_contextB
Return a rule's full text, its complete rule_history, and any lessons linked to it.
Access level: read.
Returns: JSON with rule, history, and linked_lessons.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The RN-* id of the rule. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral load. It usefully declares read-only access and enumerates the three output keys, but says nothing about permissions, pagination of rule_history, or behavior when a rule_id is missing. Minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines with no filler; the payload is stated first and the access level follows. The 'Returns:' line is mildly redundant against the existing output schema, which is the only slight waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with a full output schema and an output description, an agent has what it needs to invoke it correctly. The gap is routing context — nothing tells the agent when to prefer this over the overlapping rule-history and audit siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single rule_id parameter, including its RN-* format, so the schema already does the work. The description adds no extra parameter semantics, which is the expected baseline when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Return) and a concrete payload: a rule's full text, its complete rule_history, and linked lessons. That is clearly more than a restatement of the name. It does not, however, distinguish this from siblings that also surface rule metadata such as get_rule_timeline, get_rule_audit_log, or query_rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus get_rule_timeline, get_rule_audit_log, or query_rules, which all touch rule data. The only usage signal is 'Access level: read', which tells the agent it is safe but not when it is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rule_templateB
Return the canonical ## RN-XXX-NNN atomic block template, its field
descriptions, and usage instructions.
Access level: read. Returns: JSON with template, fields, usage, and (if project_id given) scope_suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | If given, also returns recommended scope_suggestions for this project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does cover the essentials: 'Access level: read' explicitly declares the read-only nature, and it enumerates the return payload (template, fields, usage). It omits auth/permission needs, rate limits, and any failure behavior, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded paragraphs: the purpose sentence comes first, followed by compact access/return metadata. Minimal waste, though the returns line partially duplicates the parameter schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and the description correctly confines itself to purpose, access level, and the optional-parameter side effect. The only real gap is sibling routing among the three template getters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one optional parameter, so the baseline is 3. The description's note that scope_suggestions are returned 'if project_id given' merely restates the schema's own parameter description, adding no meaning beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and a precisely scoped resource: the canonical `## RN-XXX-NNN` atomic block template plus its field descriptions and usage instructions. This is clearly distinguishable from the other template getters (get_lesson_template, get_transcription_template), though the description never explicitly names them to force the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The presence of three sibling template getters means an agent must infer from the name alone which template it needs; the description does not route it or state a prerequisite (e.g., 'call before creating a rule').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rule_timelineA
Return a rule's chronological history and linked-lesson summary without loading full text — lighter than get_rule_context.
Access level: read. Returns: JSON with rule_code, scope, severity, category, history_events, and linked_lessons_summary.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The RN-* id of the rule. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does state the access level (read) and the payload characteristic that matters here (history/summary without full text). It omits operational behavior such as authorization requirements, history size limits, or truncation/pagination, which keeps it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks with zero filler: the purpose and its differentiator come first, then access level and return shape. Every sentence earns its place and nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full schema coverage and an existing output schema, the definition is essentially complete; return fields are even listed despite the output schema making that optional. The only minor gap is any note on history volume or truncation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single rule_id parameter, including the RN-* format. The description adds no further parameter meaning; the baseline 3 applies when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Return) plus resource (a rule's chronological history and linked-lesson summary) with an explicit scope qualifier (without loading full text). It also names the sibling it differs from, get_rule_context, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear comparative usage cue: pick this when full text is unnecessary, because it is 'lighter than get_rule_context.' That names the alternative and the condition that selects it. It stops short of an explicit when-not clause or any prerequisite/authorization guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoA
Report this running server process's version/commit, and whether
the code on disk has changed since this process started — Python
doesn't hot-reload, so an editable install that was git pulled
without restarting the server keeps serving the old code with no
other visible sign of it (Hallazgo 7).
Access level: read.
Returns: JSON with version, the commit captured at server startup,
a freshly-read commit as of this call, and a stale flag (true only
when both commits are known and differ) with a restart note.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: it explicitly declares 'Access level: read' (substituting for readOnlyHint), explains that the tool takes no arguments, and precisely defines the staleness semantics ('stale is true only when both commits are known and differ'). It also discloses why the check matters (Python does not hot-reload), which is behavioral context an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, followed by the rationale and the return summary in a logical order. It is slightly longer than strictly necessary — the parenthetical about editable installs and the '(Hallazgo 7)' internal reference add length without adding decision-relevant information — but nothing is outright wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only introspection tool with an output schema present, the description supplies everything an agent needs: what it reports, that it is safe to call, and how to interpret the one non-obvious field. The return fields are also restated, which is redundant against the output schema but harmless and not incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool is parameterless, so per the baseline this dimension scores 4. The description correctly reinforces that there is nothing to supply and adds no misleading parameter claims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Report this running server process's version/commit') plus a second, clearly-scoped purpose (detecting stale on-disk code). It is unmistakably distinct from every sibling tool, which all deal with rules, lessons, proposals, or projects. An agent can identify this as the process-introspection tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the triggering context well: the tool exists to reveal the otherwise-invisible condition where an editable install was git-pulled without a server restart, and the concrete symptom it addresses ('keeps serving the old code with no other visible sign'). That is clear when-to-use guidance. It stops short of stating exclusions or alternatives (none of the siblings are related, so none are needed), keeping it at a strong 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcription_templateA
Return the combined rule+lesson template guide and workflow instructions for turning a transcript into pending proposals.
Access level: read. Returns: JSON with template, fields, usage, and (if project_id given) scope_suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | If given, also returns recommended scope_suggestions for this project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does disclose the most important trait explicitly: 'Access level: read', which tells the agent this is a safe, non-mutating lookup. It also sketches the return payload, though it omits anything about idempotency or side effects — acceptable for a read-only getter, but the disclosure stops short of a full behavioral profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the purpose, followed by access level and return shape. Every clause is short and scannable, though the 'Returns:' line restates information that the output schema already provides, which is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool, the description covers what it does, the access level, and the conditional behavior tied to project_id, which is enough to invoke correctly. An output schema exists so the enumerated return contents are a minor duplication rather than a necessity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter exists and the schema already documents it at 100% coverage ('If given, also returns recommended scope_suggestions for this project'). The description repeats that schema text almost verbatim ('if project_id given) scope_suggestions'), adding no new meaning such as format or valid ID sources. Baseline 3 is appropriate when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Return') and a specific resource ('combined rule+lesson template guide and workflow instructions'), making it instantly distinguishable from get_rule_template and get_lesson_template via the word 'combined'. However, it does not explicitly name those siblings as the non-combined alternatives, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for turning a transcript into pending proposals' gives a clear purpose context but no when-to-use guidance relative to siblings like extract_rules_from_transcript, extract_lessons_from_transcript, or create_pending_proposal. There is no exclusion or ordering rule ('call this before X'), so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_lessons_from_markdownA
Index lessons from a markdown file directly into SQLite.
Same logic as index_rules_from_markdown but targets the lessons table.
Access level: write. Returns: JSON with indexed/created/updated counts, a per-scope breakdown, and any parser warnings or errors.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'atomic': parse canonical ## LL-XXX-NNN blocks (the {TECH} segment is optional — plain ## LL-NNN is also accepted) and upsert them directly into lessons/lesson_history. 'legacy': parse old ### blocks into pending_proposals only, never writing to lessons directly. | atomic |
| filepath | Yes | Path to the source .md file containing lesson blocks. | |
| default_scope_id | Yes | Scope assigned to blocks that don't declare their own **Scope:** field (e.g. 'global-java', 'project-<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely does: it declares 'Access level: write', discloses that atomic mode upserts directly into lessons/lesson_history, and summarizes the return payload (indexed/created/updated counts, per-scope breakdown, parser warnings/errors). It stops short of stating permission requirements, conflict/replace semantics on upsert, or whether prior rows are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short lines, fully front-loaded: what it does, the sibling differentiation, the access level, and the return shape. No filler sentences and nothing buried at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so the description need not detail return values, and all three parameters are schema-documented. The remaining gap is operational: no mention of permissions, error/partial-failure behavior, or what an upsert does to pre-existing lesson rows in the atomic path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (mode, filepath, default_scope_id) is already fully documented in the schema, including the atomic/legacy semantics. The description adds no format, syntax, or example detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Index lessons from a markdown file directly into SQLite') and explicitly contrasts with the sibling 'index_rules_from_markdown', naming the target table as the differentiator. An agent can pick between the two indexing tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (index lesson blocks that already live in a .md file) and the sibling comparison helps routing, but there is no explicit when-to-use/when-not guidance, and no hint about when to prefer this over transcript-based extraction such as 'extract_lessons_from_transcript'. The atomic-vs-legacy split is only explained in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_rules_from_markdownA
Index rules from a markdown file directly into SQLite.
mode="atomic" upserts canonical blocks by code (existing rules are
updated in place, new ones created). mode="legacy" stages each old-style
block as a pending_proposals entry instead of writing to rules directly.
Access level: write. Returns: JSON with indexed/created/updated counts, a per-scope breakdown, and any parser warnings or errors.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'atomic': parse canonical ## RN-XXX-NNN blocks (the {TECH} segment is optional — plain ## RN-NNN is also accepted) and upsert them directly into rules/rule_history. 'legacy': parse old ### blocks into pending_proposals only, never writing to rules directly. | atomic |
| filepath | Yes | Path to the source .md file containing rule blocks. | |
| default_scope_id | Yes | Scope assigned to blocks that don't declare their own **Scope:** field (e.g. 'global-java', 'project-<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and largely meets it: it declares 'Access level: write', discloses that atomic mode updates existing rules in place (a destructive-ish upsert by code), that legacy mode never writes to rules, and lists the returned counts plus parser warnings/errors. Not covered are permissions/auth beyond the 'write' label and what happens on parse failure for the whole file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in one sentence, then the two modes, then access level and return shape as scannable labeled lines. There is some duplication of the schema's mode text, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return details are not strictly required, yet the description still summarizes counts, per-scope breakdown, warnings and errors, giving an agent a full picture of a three-parameter write tool. Only file-path preconditions and failure behavior are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema's own mode description already explains both values in detail, so the description's mode paragraph largely echoes structured data. It adds no new syntax for filepath or default_scope_id, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Index rules from a markdown file') plus the destination ('directly into SQLite'), which is more informative than a bare name restatement. It does not explicitly distinguish itself from the sibling index_lessons_from_markdown, but the rules/lessons split is self-evident from the resource named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear conditional guidance for the main decision point: mode='atomic' upserts canonical blocks by code while mode='legacy' stages pending_proposals instead of writing to rules. It stops short of naming alternatives such as convert_to_atomic_format or extract_rules_from_transcript, but the mode-selection context is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_proposalsA
List pending proposals for human review, optionally filtered by project, type, or status.
Access level: read. Returns: JSON array of matching pending_proposals rows.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by proposal type: 'rule', 'lesson', or 'update'. | |
| status | No | Filter by status: 'pending', 'approved', or 'rejected'. | |
| project_id | No | Filter by project/scope id (with or without the 'project-' prefix). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose 'Access level: read' plus the return shape, which is genuine safety context. However, it says nothing about result limits, ordering, pagination, or whether pending review items are scoped to the caller, so important behavioral traits remain undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose, and no filler. The 'Returns: JSON array...' line is mildly redundant given an output schema exists, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read/lookup tool with a full output schema and 100% parameter coverage, the description covers purpose, scope, and filter targets. It is nearly complete; only routing to/from sibling tools is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents type, status, and project_id semantics (including valid values). The description only restates the filter dimensions and adds no syntax or format detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List pending proposals for human review') and names the filterable dimensions, so an agent can separate it from siblings like create_pending_proposal or approve_proposal. It does not explicitly contrast itself with other list-type siblings (e.g. query_rules), so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'for human review' scope and the optional filters imply when the tool is relevant, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. use query_rules for already-approved rules). Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_ruleA
Promote a rule to a more general scope: marks the original as deprecated (in both SQLite and its source .md file) and records a PROMOTED rule_history entry. Does not create the rule in the new scope — that requires a separate proposal.
Access level: write. Returns: JSON with the rule_id, new_scope_id, and resulting status.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The RN-* id of the rule to promote. | |
| new_scope_id | Yes | Destination scope to promote the rule into. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the disclosure burden and does it well: it names the destructive side effect (deprecation of the original in two stores), the audit side effect (rule_history entry), the access level ('write'), and explicitly bounds the operation by saying the new-scope rule is NOT created. Remaining gaps are permission requirements and reversibility of the promotion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effects in the first two sentences, followed by short Access level and Returns lines. Slightly redundant since an output schema already exists, but nothing is padded or wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations, the description covers scope, side effects, access level, and explicitly excludes the assumed creation of the new-scope rule. The Returns line duplicates the output schema, and no guidance is given on scope validity or error conditions, so it is strong but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters documented as the RN-* rule id and the destination scope, so the schema already carries the semantics. The description's framing ('promote to a more general scope') adds directional context but no syntax, id format, or scope-resolution guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (promote) and resource (rule to a more general scope), then enumerates the concrete effects: original marked deprecated in both SQLite and its source .md file, and a PROMOTED rule_history entry recorded. It also preempts the most likely confusion by stating it does not create the rule in the new scope, which separates it from create_pending_proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for the operation's scope: promotion only deprecates the source rule, and creating the rule in the new scope 'requires a separate proposal' — a useful pointer toward the follow-up sibling. It does not state prerequisites explicitly (e.g. which scope relationships are valid, whether approval is needed), so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_lessonsA
Query active lessons visible to a project across its full scope hierarchy (most-specific scope first), via plain SQL filtering or — when query_text is set and embeddings exist — semantic search.
Access level: read. Returns: a JSON or TOON array of matching lessons.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Filter by area_affected, e.g. 'deployment', 'performance', 'security'. | |
| tags | No | Comma-separated tags; matched by exact tag equality, not substring. | |
| detail | No | 'summary': metadata only. 'full': also includes what_happened text (may return STALE_INDEX per row if its source file changed since indexing). | summary |
| format | No | Output format: 'json' or 'toon' (compact tabular). | json |
| project_id | Yes | Project id (with or without the 'project-' prefix). | |
| query_text | No | Free-text query. When set and ChromaDB has embeddings, enables semantic (RAG) search instead of plain SQL filtering. | |
| include_deprecated | No | Include deprecated lessons. Only affects plain SQL filtering — deprecated lessons are removed from the semantic (query_text) index on deprecation, so this does not revive them there. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and partially meets it by declaring 'Access level: read.' and that only 'active' lessons are returned. It stops short of disclosing pagination, result-size limits, or the STALE_INDEX caveat (which lives only in the schema), so important behavioral context is missing for a 7-param tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, well front-loaded: purpose first, then access level and return type. The 'Returns:' line is largely redundant given an output schema exists, but it costs little and the rest is waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 100% schema coverage and an output schema, the description covers the scope hierarchy, both query modes, and read access — everything an agent needs to call it correctly. It omits only secondary operational details like limits, which the schema and output schema partially absorb.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema; the baseline of 3 applies. The description echoes the query_text semantic-search trigger but adds no syntax, format, or interaction detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (query) and resource (lessons) with scope: 'active lessons visible to a project across its full scope hierarchy (most-specific scope first)'. This distinguishes it cleanly from the sibling query_rules by resource and adds the ordering rule an agent needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two operating modes — plain SQL filtering versus semantic search 'when query_text is set and embeddings exist' — which is genuine mode-selection guidance. However, it gives no guidance on when to pick query_lessons over siblings like query_rules or get_rule_context, so tool selection is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_rulesA
Query active rules visible to a project across its full scope hierarchy (most-specific scope first), via plain SQL filtering or — when query_text is set and embeddings exist — semantic search.
Access level: read. Returns: a JSON or TOON array of matching rules.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated tags; matched by exact tag equality, not substring. | |
| detail | No | 'summary': metadata only. 'full': also includes rule text (may return STALE_INDEX per row if its source file changed since indexing). | summary |
| format | No | Output format: 'json' or 'toon' (compact tabular). | json |
| category | No | Filter by rule category, e.g. 'quality', 'security', 'architecture'. | |
| severity | No | Filter by severity: 'low' | 'medium' | 'high' | 'critical'. | |
| project_id | Yes | Project id (with or without the 'project-' prefix). | |
| query_text | No | Free-text query. When set and ChromaDB has embeddings, enables semantic (RAG) search instead of plain SQL filtering. | |
| include_deprecated | No | Include deprecated rules. Only affects plain SQL filtering — deprecated rules are removed from the semantic (query_text) index on deprecation, so this does not revive them there. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does disclose meaningful behavior: 'Access level: read' establishes the safety profile, the scope-hierarchy ordering rule explains result precedence, and the embeddings-must-exist caveat explains silent fallback to SQL. It stops short of noting result caps, pagination, or performance characteristics of the semantic path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a short returns line, with the core purpose front-loaded and no filler. The 'Access level: read' and 'Returns:' fragments are slightly label-like but each carries information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read-only query tool with 100% schema coverage and an output schema, the description covers the essentials: purpose, scope resolution order, dual query mode, access level, and return shape. Nothing critical is missing, though the absence of any guidance tying it to its many sibling read tools leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including tags, detail, format, category, severity, query_text, and include_deprecated is already documented in the schema, often with more nuance than the description. The description's only added semantic is the query_text/SQL-vs-semantic framing, which the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (query) and resource (active rules) plus the scope semantics ('visible to a project across its full scope hierarchy, most-specific scope first'), which is genuinely distinguishing detail. It does not, however, name or contrast with the obvious sibling query_lessons or check_feature_against_rules, so an agent must infer the boundary from the resource noun alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when the tool applies (querying rules scoped to a project) and gives one conditional trigger — 'when query_text is set and embeddings exist' switches to semantic search. But it never states when to prefer this over get_rule_context, get_rule_timeline, or query_lessons, and there are no exclusions or prerequisites beyond that single mode switch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_proposalA
Reject a pending proposal. No side effects besides updating the record.
Access level: write. Returns: JSON with the proposal_id and its status.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional human-readable rejection reason. | |
| proposal_id | Yes | The pending_proposals id to reject. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a fair job: it discloses the side-effect scope ("No side effects besides updating the record") and the access level (write). It falls short of stating reversibility, idempotency, or behavior when the proposal is already resolved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines that lead with the action and follow with the two facts an agent most needs. The "Returns" line is mildly redundant given a full output schema exists, costing a little conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with an output schema and full schema coverage, the description supplies the key missing context: side-effect scope and access level. Return values needn't be explained since an output schema exists, though error/permission behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (proposal_id and optional reason) are already documented in the schema. The description adds no syntax or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Reject a pending proposal"), which cleanly distinguishes it from the sibling approve_proposal and the broader proposal set. It's clear but does not explicitly contrast itself with approve_proposal or edit_proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word "pending" implies a precondition (only pending proposals can be rejected), which gives implicit usage context. However, there is no explicit when-to-use, when-not-to-use, or alternative routing (e.g., use edit_proposal to change then reject), leaving guidance at the implied level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
28 tool updates
v0.1.0- First observed
analyze_pr_feedback - First observed
approve_proposal - First observed
audit_pr - First observed
check_feature_against_rules - First observed
convert_to_atomic_format - First observed
create_pending_proposal - First observed
create_project - First observed
deprecate_rule - First observed
edit_proposal - First observed
extract_lessons_from_transcript - First observed
extract_rules_from_transcript - First observed
generate_embeddings - First observed
generate_project_skills - First observed
get_lesson_template - First observed
get_project_scope_resolution - First observed
get_rule_audit_log - First observed
get_rule_context - First observed
get_rule_template - First observed
get_rule_timeline - First observed
get_server_info - First observed
get_transcription_template - First observed
index_lessons_from_markdown - First observed
index_rules_from_markdown - First observed
list_pending_proposals - First observed
promote_rule - First observed
query_lessons - First observed
query_rules - First observed
reject_proposal
TDQS
Scored across 28 tools
Many tools are paired (rules vs lessons) and clearly distinct, but several overlap semantically: deprecate_rule creates a proposal while promote_rule acts immediately, and get_rule_context/get_rule_timeline/get_rule_audit_log all return rule history with varying detail. Descriptions help, but an agent could still misselect among related operations.
All tool names use consistent snake_case with a verb_noun structure (e.g., get_rule_template, create_pending_proposal, query_rules). There is no mixing of conventions, making the naming highly predictable.
With 28 tools, the server exceeds the 25+ threshold and feels heavy. While the domain is complex, many operations could be consolidated (e.g., generic rule/lesson tools instead of extensive pairs), reducing the surface.
The surface covers CRUD via proposals, auditing, templates, indexing, embeddings, and scope resolution, which is strong for the domain. Minor gaps exist, such as no get_lesson_context and no project listing/deletion.
Maintenance
Related MCP Connectors
- KumbukaOAuthai.kumbuka
Governed, auditable knowledge your team curates for its AI assistants, self-hostable
Shared, permission-aware company context for AI agents, with provenance, approvals and audit.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Give your AI agent persistent, governed memory for every project. At task start it recalls the approved decisions, conventions, risks and architecture (semantic search, ranked by importance); at close it proposes what was learned as typed memories that you review and approve — governance, not a notes dump. Agents propose, humans govern: edits go back to pending and deletion is human-only by design. Connect Claude Code, Cursor, Claude Desktop or any MCP client in two minutes with just your API key — hosted (nothing to install) or locally via `uvx solucortex-mcp`. Built by SoluAI and dogfooded daily: SoluCortex is developed using its own living memory.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with queryable, version-controlled project rules and coding standards. Enables validation, rule-based guidance, and task summaries to keep AI work aligned with your project's conventions without repeating context.2MIT

MarkdownLM MCP Serverofficial
FlicenseAqualityCmaintenanceProvides a persistent memory and governance layer that allows AI coding agents to query documented architecture rules and validate code against team standards. It enables agents to verify compliance across categories like security and testing before suggesting changes to ensure consistency across development sessions.317-- AlicenseNot gradedqualityDmaintenanceEnables AI agents to read and write a local-first knowledge base of plain markdown files in git, with governance gates for safe, hash-anchored edits.1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceGives AI coding agents on-demand retrieval of workspace context, documentation, lessons, decisions and handoffs from a five-level (GLOBAL → WORKSPACE → PROJECT → FEATURE → SESSION) store, so they start with a small rule set instead of re-reading bloated docs. Exposes tools for dependency routing, knowledge search, doc reading and health checks backed by a zero-dependency SQLite + FTS5 memory with cross-project sharing of global-scoped knowledge.MIT