Skip to main content
Glama
Abishai95141

fincon

by Abishai95141

Close the books with a proof, not a plug.

FinCon reconciles what your payment gateway says it paid out against what the bank actually received, writes the double entry, and hands back what is left — ranked, priced and routed to a desk. Every match carries arithmetic an auditor re-derives without us.


The problem

Reconciliation software already matches 90–99% of transactions. Trintech publishes 99%+. NetSuite ships N:M rules with a confidence-scoring assistant. That problem is solved, and anything pitching "our AI matches better" is competing on the one dimension nobody needs help with.

Two costs survive automation, and neither is a matching problem.

The tail comes back with no reason attached. Bank-feed automation cuts a reconciliation from roughly 47 minutes to exception handling only — which is the whole story in one statistic: the matched records were never the cost. But the 1–10% that fails returns as a flat queue, and the controller re-derives the context by hand, row by row. Volume fell. Cost per item did not.

And the rate decays. Auto-match rates are maintained, not achieved. A new vendor format silently degrades matching until somebody writes a rule, and rule authoring is gated behind engineering — so the person who understands the exception is never the person who can fix it.

What a controller does today: pull three exports, match at payout level because row level is impossible, book the difference as a plug, spend three days in Excel when it does not tie, hand-type the journal, and watch the identical tail come back next month.


Related MCP server: MCP-Finance-Reconciliation

The solution

Open intake, verified commit. The model proposes. A deterministic engine proves. A named human decides.

The AI does three jobs, and they are the three that need it

This is not a rules engine with a chatbot bolted on, and it is not a model guessing at arithmetic. The model is pointed at exactly the work no deterministic system can do:

Reads a format nobody configured

A settlement file in a layout we have never seen. The model reads twelve raw lines and authors the parse spec — delimiter, header row, minor units, a non-ISO date. It ingests with no integration project.

Names the tail

What the arithmetic could not resolve goes to the model with the near misses the engine derived, and comes back with a code, a hypothesis and cited evidence in about 2.1s.

Writes tomorrow's rule

You resolve a break in your own words; the model induces a deterministic rule that would have prevented it. R-DUP-06 was written this way, from a controller's sentence, and fires on every close since.

The system gets more deterministic over time, not more agentic. That is the opposite of how agent products usually age, and it is the entire thesis.

And it is fenced, which is why you can switch it on

Language models collapse from 95.6% on lookups to near zero on multivariate calculation, and they fail confidently. So the model is kept off the arithmetic by construction — every boundary below is a test that fails if someone removes it:

  • No model call in a close. Six stages, zero model calls, and the receipt says so.

  • A proposal cannot overwrite a derived answer. P2 at best, and it may not overwrite P0 ARITHMETIC — an item the engine derived is never even offered.

  • No generated code is executed. No eval, no exec. Adapters are declarative specs read by a closed vocabulary of parse verbs.

  • No tool carries authority. Not one MCP tool accepts a policy, a tolerance, a sign convention or a rule set — checked against the generated schemas.

Proof on every row, and four honest endings

Every accepted match emits an arithmetic object, not a confidence score: both sides' record ids, the residual closing to zero, the tolerance consumed, the rule that fired. A match without a passing proof is not a match and does not appear in the match count.

match M-0412   tier T2 subset-sum   rule R-017@v3
  payout    BANK/2026-08-14/CR         +4,378.21
  charges   87 × settlement rows       +4,612.90
  refunds    4 × settlement rows         -118.40
  fees     162 × settlement rows         -114.02
  ────────────────────────────────────────────
  residual                                  0.00    tolerance used 0.00 / 0.50
  verdict   PROVEN      provenance  P0 ARITHMETIC

Everything left over is ranked by cash impact × age and routed to a desk. Each item ends in double entry — book it, carry it forward, chase it, or write it off — under your name, bounded twice by signed policy.


Impact

Measured against labels authored before the engine existed, and re-derived from the decision log alone:

Auto-match

90.9% — 20 of 22 anchors, by tier T0=17 T1=2 T4=1

False matches

0.00%

Exception coverage

6 / 6 — every planted defect found

Classification

4 / 6 correct

Ambiguity

1 / 1 detected and refused rather than guessed

Journal

23 entries, balanced — and the beancount export is re-loaded by beancount itself

Close time

about 1.4s, with zero model calls

The generality is measured, not asserted. A second reconciliation — Form 26AS from the Income Tax Department against a TDS receivable ledger, matched on TAN + section + quarter over an April–March year — runs on the same engine with zero changes to it, asserted byte-for-byte by its gate.

Where it says it does not know. Three of seven items in a real close are E14the engine cannot say why — and that is printed at the top of the tail rather than smoothed into a plausible guess routed to the wrong desk. E09 is the one to pause on: two distinct subsets sum to the same credit within tolerance, so there is no correct answer to pick, and every tool that returns the first subset it finds is confidently wrong there.


Point an assistant at it — MCP

FinCon is a Model Context Protocol server. Ask "what is blocking the October close, biggest first?" and it reads the record, runs a deterministic close, verifies a proof, resolves an item and signs off — as you, because it holds a token you issued.

// Claude Desktop, Claude Code, or any MCP client
{
  "mcpServers": {
    "fincon": { "url": "https://fincon.astutecomputer.com/mcp" }
  }
}

OAuth via Cognito, discovery at the origin per RFC 9728, dynamic client registration. Or run it on stdio against your own files: make mcp.

21 tools; 4 of them write. An assistant is not a stranger — it carries your credential, and the sub on that token is the same string your browser session resolves to. So it can do what you can do, and every decision records the door it came through, so a year from now you can tell which items you read and which you delegated. The bounds that matter — the write-off ceiling, the budget, the balance check, items nobody has opened — were never questions about who was calling, and they bind an agent identically.


Architecture

The model proposes → the engine proves → a human decides. Nothing crosses a boundary without a proof or a name.

  SOURCES                    ENGINE  (no model, ever)                 RECORD
  ─────────                  ────────────────────────                 ──────
  bank CAMT.053 ┐            ┌──────────────────────┐
  settlement    ├─ intake ──▶│ block → match         │──▶ verify ──┐
  order register┘   │        │ T0 exact              │   re-derive │
  Form 26AS     ┘   │        │ T1 tolerant           │   from raw  │
                    │        │ T2 subset-sum         │   records   │
              5 proofs       │ T4 declared           │             ▼
              row count      └──────────┬───────────┘      ┌──────────────┐
              control total             │                  │ double entry │
              roll-forward         unmatched               │ + balance    │
              type/domain              │                   │   assertion  │
              idempotence              ▼                   └──────┬───────┘
                              ┌────────────────┐                  │
                              │ near-miss      │                  ▼
                              │ diagnosis      │           hash-chained
                              │ (arithmetic)   │           decision log
                              └───────┬────────┘                  │
                                      │ genuinely unexplained     │
                                      ▼                           │
                        ╔═════════════════════════╗               │
                        ║  MODEL  (proposes only) ║               │
                        ║  adapter synthesis      ║               │
                        ║  classification         ║               │
                        ║  rule induction         ║               │
                        ╚═══════════╤═════════════╝               │
                                    │ P2 at best, never overwrites P0
                                    ▼                             │
                        ┌───────────────────────┐                 │
                        │  HUMAN decides        │◀────────────────┘
                        │  book · carry · chase │
                        │  · write off · sign   │
                        └───────────┬───────────┘
                                    ▼
                          close pack · journal.csv
                          journal.beancount · POST /v1/verify

Proof tiers, because a real close contains items nobody can derive from arithmetic alone. The rule is never move silently, not refuse what you can't prove:

P0 ARITHMETIC re-derivable by anyone · P1 RULE a promoted, regression-tested rule fired · P2 ATTESTED a named human approved it · P3 DECLARED accepted with a stated gap.

Hosted on AWS

Live at https://fincon.astutecomputer.com — one CloudFormation stack in ap-south-1. Full breakdown, including the four decisions worth arguing about and what this estate deliberately lacks, in docs/14-AWS.md.

   Cloudflare DNS ──▶ ALB (ACM, TLS 1.3) ──▶ ECS Fargate ──┬─▶ EFS  runs + uploads
                       :80 → :443           1 task          ├─▶ Cognito   identity
                       /healthz 30s         256cpu/512mb    ├─▶ Secrets Manager
                                            screens · API   └─▶ CloudWatch Logs
                                            · MCP /mcp

EFS rather than S3 because the decision log is append-only and hash-chained and the writer takes a POSIX lock — and flock silently does not work on EFS, which nearly ended the choice. Public subnets, no NAT — a $32/month gateway for a single-task estate, traded for a security group that admits only the ALB. Images tagged by commit sha, never latest, so a rollback is nameable.


Run it

make setup     # uv sync
make gen       # regenerate the synthetic batches from a seed
make verify    # every green gate
make serve     # → http://127.0.0.1:8000/
make eval      # 4 ablation arms, 9 metrics, batches A and B
make mcp       # MCP on stdio

make test and make verify need no API key — the model-backed gates are excluded and named in the output, because a silently skipped gate that reads as green is the failure this whole repository is about.


Verify it without us

The claim is not "trust our numbers". Hand an auditor the decision log and the source files, and they re-derive every match on a public endpoint that needs no account and touches none of our state:

curl -X POST https://fincon.astutecomputer.com/v1/verify \
     -H 'content-type: application/json' -d @docs/sample-proof.json

docs/sample-proof.json is a real one, lifted out of batch A's decision log — a proof and the 23 records it cites. It answers "proven": true. Change one amount in it and it comes back refuted, with the recomputed residual and the leg whose subtotal stopped adding up:

{"proven": false, "recomputed_residual": "-50.00", "reasons": [
  "leg 'settlement': claimed subtotal 51990.42 but its 22 record(s) sum to 52040.42 (delta 50.00)",
  "claimed residual 0.00 but the records give -50.00 (delta -50.00)"]}

Your own proofs come out of GET /v1/runs/{id}/export, which returns every decision in a close beside the records it rests on.

Every verdict names the policy it was produced under and stamps whether that policy was in force or caller-supplied — because a verdict produced under a policy somebody brought with them must never come back indistinguishable from one produced under ours.


Documentation

CLAUDE.md

Standing context — the rules, the vocabulary, the eight invariants

STATUS.md

Live build state, with the command output that proves each gate

docs/01-DECISION-SPEC.md

Problem, solution, trade-offs

docs/08-AS-BUILT.md

What actually runs today

docs/10-THE-USER-FLOW.md

The flow, and what it is worth

docs/13-THE-SCREENS.md

Every screen, and the question it answers

docs/14-AWS.md

The AWS estate, in full

docs/15-DEMO.md

The demo film — how it is shot, cut and re-shot

docs/16-SCRIPT.md

The voiceover, timed against the cut

docs/decisions/

ADRs — two of them irreversible

Try FinCon →  ·  Contact

Available Tools

21 tools
accept_classificationA

Accept a proposed code for an exception, under your name.

propose_reclassification asks whether a code would be admissible and writes nothing. This is the other half: it records that somebody accepted it. Same checker, same refusals — a proposal may still not overwrite a code the engine derived, because a guess does not outrank arithmetic no matter who signs for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
run_idYes
rationaleYes
exception_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It states that the tool records acceptance under the caller's name, that it writes something, and that it shares refusal conditions with propose_reclassification. It also discloses a meaningful constraint: derived codes cannot be overwritten by a proposed code. It does not cover output shape or permission requirements, but the core side effects and failure conditions are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary purpose and is reasonably compact. The extra sentences about same checker, refusals, and derived-code priority add real decision value rather than filler. The metaphorical phrasing 'a guess does not outrank arithmetic' is slightly less direct than the rest, but it does not undermine clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the tool's role, side effects, and refusal behavior, which covers the core decision of when to use it. However, missing parameter-level guidance for required fields like rationale and run_id leaves an agent to guess at argument semantics. An output schema exists, which reduces the need to describe return values, but the overall definition is only minimally complete for a four-parameter write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for documenting the four required parameters. It references 'code' and 'exception' contextually, but it does not explain run_id, exception_id, code, or rationale meaning, format, or relationships. The rationale parameter is entirely undiscussed, which is a significant gap for a required field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Accept a proposed code for an exception, under your name.' It also explicitly distinguishes itself from propose_reclassification by naming that sibling and explaining the difference in side effects, so an agent can tell the two apart clearly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly situates this tool as the counterpart to propose_reclassification: that tool only asks and writes nothing, while this tool records acceptance. It also says the same checker and same refusals apply, giving an agent useful conditions for when acceptance may fail. It does not explicitly state prerequisites such as 'call propose_reclassification first,' but the intended workflow is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_exportA

Everything needed to re-derive a close, and nothing that requires us.

Every decision with its proof, the rule version that fired, the human who approved the authority, the source document hashes and the adapter spec ids that read them. how_to_verify spells out the four steps; none of them touch our database or our network.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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 that the output is self-contained, lists what is included, and notes that verification does not depend on internal systems. It does not mention side effects or pagination behavior, but 'export' plus the self-containment statement make the key traits clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and front-loaded with the value proposition; the second sentence efficiently lists contents and verification behavior. It is concise, though somewhat cryptic and jargon-heavy ('re-derive a close', 'adapter spec ids') which prevents a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return-value coverage is not the primary gap. However, the description leaves parameter semantics unaddressed and only implicitly states when to invoke the tool, so an agent would need to infer or guess on run_id and pagination. Acceptable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no explanation of run_id, limit, or offset. An agent must infer that run_id selects the close to audit and that limit/offset paginate results, which is a significant gap the description does not compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as returning a complete audit package for re-deriving a close, and it enumerates concrete contents (proofs, rule versions, approvers, source hashes, adapter spec ids). It is not a tautology and is distinguishable from siblings like get_proof and verify_proof, though it never uses an explicit verb such as 'exports' or 'returns'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'nothing that requires us' and the assertion that the four how_to_verify steps touch neither our database nor our network give a clear context: use this tool when an independently verifiable, self-contained audit artifact is needed. It does not explicitly name sibling alternatives or exclusions, so it falls 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.

dispose_exceptionA

End an exception in a journal entry: book, carry_forward, chase, write_off.

This moves money, and it is meant to. The item leaves the worklist, double entry is written, and the record carries your name and the fact that an agent put it there.

What it will still refuse, all of it from the loop's signed policy and none of it from you: a write-off above the per-item ceiling, one that would exhaust the close's write-off budget, a book on a code the taxonomy has not promoted, and any second disposition of an item already ended. There is no ceiling parameter and no chart parameter, so there is nothing to widen.

due_on is YYYY-MM-DD and applies to chase only.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerNo
due_onNo
run_idYes
rationaleYes
dispositionYes
exception_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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 strongly. It discloses that the operation moves money, removes the item from the worklist, writes double entry, attributes the action to the user, and lists specific refusal conditions including ceiling, budget, taxonomy, and duplicate disposition scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, front-loaded with the core action, and uses a bolded refusals section to make important constraints scannable. Some rhetorical phrasing such as "none of it from you" adds flavor but not essential information, keeping it from a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation's side effects, refusal policy, and the one disposition-specific parameter. It does not explain return values, but an output schema exists. For a financially significant mutation, the provided context is strong, though auth prerequisites or reversibility would improve completeness further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It adds meaning for disposition by listing valid values and for due_on by specifying format and that it applies only to chase. However, run_id, exception_id, rationale, and owner receive no semantic explanation beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource—"End an exception in a journal entry"—and enumerates the four dispositions. This clearly distinguishes it from read-style siblings like get_worklist, explain_exception, and fetch_records, while also signaling it is a mutating close-out operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: to finalize an exception with a disposition. It does not name sibling alternatives or provide explicit when-not-to-use guidance, but the refusals section and phrase "the item leaves the worklist" make the intended workflow evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_exceptionC

One exception with its evidence, its records and what it is allowed to do.

E14 unexplained means no strategy matched and the engine cannot say why. It carries the facts it has and leaves classification open on purpose: "I do not know" out loud beats a plausible guess routed to the wrong desk.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes
exception_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden, and it does disclose an important behavioral nuance: E14 unexplained means no strategy matched, and the tool intentionally leaves classification open rather than guessing. It also indicates the tool surfaces evidence, records, and allowed actions. However, it does not state whether the operation is read-only, has side effects, or requires permissions, leaving those to inference from the tool's name and context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the core definition in the first sentence. The E14 explanation adds useful intent context about why unexplained exceptions are left open, so it earns its place rather than being pure padding. While the poetic closing line is stylistically extra, it does reinforce a key behavioral trait without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers the return structure, and the behavioral note addresses the main edge case, but the description lacks parameter semantics and usage guidance for choosing between siblings. It relies heavily on domain assumptions about runs, exceptions, and E14 without explaining the inputs. An agent can call the tool only if it already understands the domain and how run_id and exception_id relate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never mentions run_id or exception_id. It does not explain what these identifiers refer to, how they relate, or what values are expected. The parameter names are somewhat self-explanatory, but the description adds no semantic meaning beyond the raw schema, which itself has no descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'One exception with its evidence, its records and what it is allowed to do,' which clearly conveys that the tool returns a single exception enriched with supporting material and permitted actions. It is distinguishable from siblings like get_proof and fetch_records, which focus on narrower pieces of evidence. However, it lacks an explicit verb like 'Returns' or 'Explains,' so the exact operation is implied rather than directly stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides domain context about E14 unexplained but gives no explicit guidance on when to use this tool versus siblings such as get_proof, fetch_records, or get_worklist. No conditions, exclusions, or alternative-selection criteria are offered. The only implied use case is 'need details of one exception,' which is not enough to route an agent reliably.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_recordsD

The records a loop reads, a budget at a time.

Here for completeness, and worth skipping: verifying our arithmetic against records we handed you proves the sum and not the honesty. The source files, the adapter specs and the policy are all published — ingest them yourself and verify against those.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopYes
limitNo
offsetNo
source_setYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

D1.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It hints at pagination or batching ('a budget at a time') and notes that the records are 'we handed you,' but it fails to disclose read-only status, authentication requirements, side effects, or result semantics. It is more editorial than informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is brief, but brevity is not clarity. The first sentence is an incomplete noun phrase, and the second sentence is a philosophical aside about verification that does not earn its place in a tool definition. The structure is not front-loaded with a clear purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the tool cannot be correctly invoked based on this description: none of the parameters are explained, no usage guidance is given, and the description actively discourages use. For a four-parameter tool with no annotations, this is critically incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the four parameters, but it does not. It never explains `source_set`, `limit`, `offset`, or even `loop` beyond the vague phrase 'a loop reads'; 'budget at a time' is the only indirect reference to pagination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence, "The records a loop reads, a budget at a time," is a fragment that vaguely conveys record-fetching for a loop, but there is no explicit verb such as 'retrieves' or 'returns.' The second sentence actively calls the tool 'worth skipping,' further muddying what the tool is actually for and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no clear when-to-use guidance and does not name or contrast any sibling tools. It only says it is 'for completeness' and 'worth skipping' for verification, which is an exclusion rather than actionable direction for selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_authorityB

The policy, vocabulary and promoted rules governing a loop — and who signed.

Codes carry their lifecycle state: naming one grants nothing, and only a promoted code may direct a posting. Rules carry the human who approved them and the policy that approval was granted under; an approval is re-checked against the policy in force wherever the rule acts, so a rule approved under an old policy does not quietly keep its permissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does add useful semantics: naming a code grants nothing, only a promoted code may direct a posting, and approvals are re-checked against the policy in force. However, it does not state read-only behavior, permission requirements, or edge-case behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all contributing meaningful domain context, with the core subject front-loaded in the first sentence. It is somewhat dense but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 do not need to be spelled out, and the description covers non-obvious domain rules. Still, it lacks explicit usage guidance, operational side-effect or permission notes, making it only moderately complete for an unannotated tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'loop' parameter is only implicitly described as the loop whose authority is being inspected. With 0% schema description coverage, the description partially compensates by indicating that the parameter identifies a loop, but it omits format, accepted values, and any relation to loop identifiers from sibling tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as 'policy, vocabulary and promoted rules governing a loop' plus signer information, and the tool name supplies the 'get' verb. It is clear about the subject but does not explicitly distinguish itself from siblings like get_proof or get_contracts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as get_proof, get_close, or get_worklist. The description provides domain context but no conditions, prerequisites, or explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_closeA

A recorded close, rebuilt from its decision log.

Match rate with its tier split and its proof-tier split, what is blocked, what is waiting on a human, which authority it ran under and whether that authority's signature held. Blocking recall is reported absent rather than zero: it is measured against labelled true pairs and production has no labels — a zero there would be a claim we did not earn.

detail="summary" (the default) names each match and its proof_id without inlining twenty proofs; get_proof returns the one you want to read. detail="full" inlines them all and is ~59 KB. A projection, not a permission — it changes how much of the answer travels, never what it is.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNosummary
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It discloses the unusual 'absent rather than zero' semantics for blocking recall and explains why (production lacks labelled pairs), preventing a misinterpretation. It also clarifies that the detail parameter is a projection that changes response size, not content. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but every sentence adds value: the blocking-recall caveat is critical for accuracy, and the detail explanation is essential for correct invocation. It is front-loaded with the core purpose and then elaborates on key nuances, avoiding fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides all necessary details for correct invocation: what the return contains, the behavior of the detail parameter, and the alternative tool for proofs. An output schema exists, so return structure is already defined elsewhere. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It thoroughly explains the detail parameter's effect (summary vs. full, ~59 KB) and that it is a projection. run_id is not described but its name is self-explanatory and it is a required identifier, which is acceptable given the context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool returns 'a recorded close, rebuilt from its decision log' and enumerates the specific data it conveys: match rate with tier splits, proof-tier split, blocked/waiting-on-human items, the authority it ran under, and whether the signature held. It explicitly names get_proof as the sibling for reading individual proofs, which differentiates it from that alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on the detail parameter, explaining that summary is the default and that get_proof should be used to fetch a specific proof, thereby directing the agent when to use this tool versus that sibling. It does not specify when to use this over other siblings like list_runs, but the core purpose is clear enough to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contractsA

JSON Schema for the public, semver'd shapes — Record, Proof, Policy, Event.

Published so another system can build on them. They are versioned under ADR-002: a field change is a version bump, not an edit, because an independently-written verifier that stops working is the one failure this design cannot survive.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It adds meaningful context: the contracts are public, semver'd, and immutable in the sense that a field change becomes a version bump rather than an edit. However, it does not explicitly state that the tool is read-only or describe what a caller receives, leaving some behavior to inference from the name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core resource: the JSON Schema for public shapes. The ADR-002 rationale earns its place by explaining why versioning is strict, which helps an agent understand the compatibility contract without adding noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description is largely sufficient. It tells the agent what domain shapes are covered and why the versioning behavior matters. Minor ambiguity remains around whether the tool returns the current schema set or a specific version, but the low complexity and presence of an output schema keep this from being a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is effectively complete, so there is nothing the description needs to explain about inputs. The baseline of 4 applies because no parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource — the public, semver'd JSON Schema contracts for Record, Proof, Policy, and Event — and explains their purpose. The active verb is only implied by the tool name 'get_contracts', and it does not explicitly differentiate this from sibling tools like get_events or get_proof, though the content makes the distinction fairly clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied: another system can build on these published contracts. However, there is no explicit statement of when to use this tool versus alternatives, no exclusions, and no mention of prerequisites. It gives context but stops short of actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventsB

The typed decision log, event by event, hash-chained.

Append-only in the only sense a file can be: each event carries the hash of the one before it, so an edit, a deletion or a reorder breaks the chain and verify_journal says where. It does not prove custody — someone able to rewrite the whole file can recompute the chain over anything. What it closes is the partial edit and the truncated tail.

Paged: 62 events for a 22-payout month is 114 KB. total is always the real total, so "here is the log" and "here is the start of the log" stay distinguishable — which a bare list could not manage.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden, and it delivers: it explains append-only semantics, how edits/reorder/truncation are detected, the custody limitation, and the paging/total semantics. It gives a concrete size example and clarifies that 'total' distinguishes a full log from a partial page. This is strong, non-obvious behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is around 100 words and each sentence adds substance, with the core concept front-loaded. The opening is a noun phrase rather than a clear verb-led statement, and some phrasing is ornate, but there is little wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The behavioral and pagination context is valuable, but the tool has three parameters, one required, with zero schema documentation and no usage guidance. An agent still lacks the information needed to call it correctly, especially what run_id should be and how limit/offset map to paging.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it never defines run_id, limit, or offset. The paging discussion implies limit/offset exist, and 'total' clarifies an output field, but an agent cannot determine what run_id refers to or how offsets behave from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as the 'typed decision log' and explains that it returns events in hash-chained order. It references verify_journal, which helps distinguish this from verification tools, though it does not use an explicit verb like 'retrieve' or 'list' and does not differentiate from other list/get siblings such as list_runs or fetch_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use get_events versus alternatives. verify_journal is mentioned, but only to explain what happens when the hash chain is broken; the description does not state when to choose get_events over list_runs, audit_export, or other sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_proofA

One match with its full proof — every leg, its record ids and its subtotal.

What a verifier reads before calling verify_proof. The subtotals here are claims made by whatever produced the match; recomputing them from the records is the entire job, and verify_proof refuses a proof whose legs do not add up to what it says.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes
match_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses a non-obvious trait: the subtotals are claims, not verified facts, and may be rejected by verify_proof if they do not reconcile. This goes beyond the schema and helps the agent understand the data's trustworthiness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with what the tool returns, and every sentence adds useful context. The wording about claims and verify_proof is distinctive without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return structure, so the description need not repeat it. The tool's workflow position, contents, and data-reliability caveat are all present. It could have mentioned where run_id and match_id originate, but that is a minor gap given the clear identifiers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It implies that match_id selects a match and run_id scopes that match, but it does not explicitly explain how the identifiers relate or where they come from. The names are self-evident, but the description adds only marginal direct parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('get') and resource ('one match with its full proof'), and enumerates the contents: every leg, record ids, and subtotal. It also distinguishes itself from verify_proof by positioning itself as the pre-verification read step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames when to use this tool: 'What a verifier reads before calling verify_proof.' It also contrasts with verify_proof, making the workflow ordering clear. This is strong usage guidance relative to the large sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_worklistB

The exception queue, ranked by cash impact x age and routed to an owner.

This is the tail, and the tail is the product. An item whose code has not been ratified carries a note saying so — a proposed category rendered identically to a promoted one would hide the one thing you need in order to know how much to trust it.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses useful non-obvious behavior: the ranking formula, owner routing, and the note attached to non-ratified codes. However, it does not explicitly state read-only semantics, pagination, or limits, though these are less critical for a get-type tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the essential ranking and routing facts. The middle sentence 'This is the tail, and the tail is the product' is stylistic rather than actionable, but it does not substantially bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format details are covered elsewhere. Still, run_id is left undocumented, 'owner' is unexplained, and there is no mention of pagination or usage prerequisites. This is adequate for a high-level read tool but leaves operational gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required run_id parameter with 0% description coverage, and the description never mentions run_id, how to obtain it, or what it refers to. The parameter name is mildly self-explanatory, but the description adds no semantic value and does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as 'the exception queue' and specifies its defining characteristics: ranked by cash impact x age and routed to an owner. This is specific enough to separate it from the per-exception sibling tools, though it relies on the tool name to supply the verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool instead of alternatives such as explain_exception or dispose_exception. The phrase 'the tail is the product' conveys philosophy but not actionable selection criteria or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_loopsA

The reconciliation loops this controller can close.

Each carries the policy and taxonomy governing it, the strategies it matches with in the order it tries them, the source files it expects, and any promoted rules in force. Read it before asking for a close: the loop decides what a "side", a "counterparty" and a "tolerance" mean, and nothing here is hardcoded in the engine.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that loops carry policy, taxonomy, strategy order, source files, and promoted rules, and warns that semantic terms like 'side,' 'counterparty,' and 'tolerance' are loop-defined rather than hardcoded. This goes beyond a simple list operation and helps the agent understand why the output matters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no wasted words: it states the resource, summarizes the payload, and gives a clear usage directive. The long second sentence is dense but justified because it enumerates the meaningful contents of each loop.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter listing tool with an output schema present, the description is complete. It tells the agent what the tool returns, why the content matters, and when to use it relative to close operations. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds no parameter-specific information, but none is needed because the tool takes no inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as 'the reconciliation loops this controller can close,' which is specific and clearly scoped. It lacks an explicit verb like 'list' or 'returns,' though the tool name supplies the action. It distinguishes the resource from sibling list tools like list_runs and list_source_sets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit timing guidance: 'Read it before asking for a close.' This tells an agent when the tool should be invoked relative to close-related operations. It does not name alternative tools or exclusions, but the context is sufficient for a no-parameter list operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_runsC

Closes already recorded, by run id.

A run id is derived from the source bytes and the authority in force, so re-closing identical inputs under an unchanged policy reuses the id rather than creating a second record of one event.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full behavioral burden. It does add meaningful behavioral detail: run ids are deterministically derived from source bytes and the authority in force, and re-closing identical inputs under an unchanged policy reuses the id instead of duplicating the record. However, it does not disclose whether closing is irreversible, what side effects occur, or what the output represents.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and free of filler, and the second sentence is informative. However, the first sentence is grammatically awkward ('Closes already recorded, by run id') and structurally front-loads an unclear claim. It is concise but not cleanly structured enough to earn a higher score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and an output schema, the description still fails to state what list_runs actually returns or how it should be invoked. The mismatch between the tool name and the described behavior leaves a critical gap: the agent cannot know whether this tool lists runs, closes runs, or does something else. It also provides no context relative to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties, yet the description repeatedly refers to 'run id' and 'identical inputs', implying parameters that do not exist. This confuses invocation rather than clarifying it. The description adds conceptual detail about id derivation, but no usable guidance on what arguments to provide or how to supply them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Despite using a specific verb ('Closes') and resource ('already recorded'), the description directly contradicts the tool name 'list_runs' and makes no mention of listing. This is misleading: an agent selecting by name would expect a listing behavior, and the description appears to describe a closing operation (likely belonging to the sibling 'run_close').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description suggests using the tool 'to close already recorded' items, but gives no guidance on when to prefer this tool over alternatives like run_close or get_close. It also fails to explain any exclusions, prerequisites, or conditions. The only implicit context is that it operates on already-recorded runs by run id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_source_setsB

Which periods' source files are on disk, complete or not.

Incomplete ones are listed with the missing filenames named. A close over a half-arrived period would report a clean month over rows that never came, so it is refused — but the fact that October is short one file is the useful answer, not an empty list.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and it does disclose important behavior: it lists both complete and incomplete sets, names missing filenames for incomplete ones, and warns that a close over an incomplete period would be refused. It clearly explains that the useful answer for a short month is a list showing the missing file, not an empty list. Some behavioral details (e.g., whether this mutates anything, exact output format) are missing, but the disclosure is informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the core purpose in the first sentence, then expands on the important edge-case behavior. It is not bloated. The phrasing is a bit oblique ('Which periods'...' as a fragment) but overall it earns its sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives a good sense of output semantics (complete/incomplete, missing filenames, refusal of close over incomplete data), and there is an output schema present, which may carry return-value details. However, with no annotations, no parameter semantics, and no explicit statement about whether this is a read-only inspection tool (likely, but unstated), an agent has a moderate gap. For a one-parameter list tool with an output schema, this is just adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions the 'loop' parameter. The only parameter is required, but an agent is given no semantic clue what a 'loop' is in this domain. The description would need to at least tie 'loop' to a period identifier or scope to make the tool callable with confidence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (source sets for periods) and the key behavior (listing which periods' source files are on disk, complete or not), but it uses the informal phrase "Which periods' source files are on disk" rather than a direct verb like 'List'. The sibling set includes list_runs and list_loops, so the period/source-set scope does help distinguish it. However, the intended operation is somewhat implied rather than crisply stated as 'List the source sets for each period'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second part explains a subtle usage context: incomplete periods are listed with missing filenames, and a close over a half-arrived period is refused, so the tool's output provides the diagnostic answer rather than an empty list. This implicitly tells the agent when to use it (when investigating whether periods' source data is complete, e.g., before closing) and what to expect. It does not explicitly name alternatives or say 'use X instead', but the context is reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_reclassificationA

Ask whether a proposed code for an exception would be admissible.

Nothing is written. The proposal goes through the same checker the live triage path uses: the code must resolve in the registry and be assignable, the hypothesis must exist, the evidence must cite a record the exception actually names, and the exception's own label must not already rest on stronger evidence than a proposal can carry. A derived E09 — one the engine proved by enumerating two valid subsets — outranks any proposal and is refused here, which is the rule that stopped a model overwriting a proven answer with a guess.

A verdict of admissible: true means the proposal is well-formed and permitted, not that it is right. Making it so is accept_classification, which writes under the name on your credential.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
run_idYes
evidenceYes
hypothesisYes
exception_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and succeeds: it explicitly says 'Nothing is written', enumerates the validation checks, discloses the derived-E09 refusal rule, and clarifies that admissible: true means well-formed/permitted, not correct. This is rich behavioral context beyond 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then proceeds through side-effect, validation, refusal, and verdict semantics, finally routing to the sibling. Each sentence adds distinct information; the only mildly explanatory backstory ('which is the rule that stopped a model...') earns its place by making the refusal rule meaningful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the five required parameters, zero schema descriptions, and no annotations, the description is nearly complete: it covers side effects, validation constraints, verdict meaning, and the next action. It falls just short only in not clarifying run_id's role and leaving evidence string format to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for code (must resolve and be assignable), hypothesis (must exist), evidence (must cite a record the exception names), and exception_id (via the exception's label), but run_id is never explained. This is substantial but incomplete compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object — 'Ask whether a proposed code for an exception would be admissible' — and immediately distinguishes itself from the write path by noting 'Nothing is written' and pointing to accept_classification as the action that makes the proposal real. This leaves no ambiguity about what the tool does or how it differs from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the tool is a non-mutating check and tells the agent the follow-up operation: 'Making it so is accept_classification', which writes under the credential. It also names when the proposal will be refused (e.g., derived E09 outranks it), giving concrete selection and exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reverify_closeA

Re-derive a whole recorded close from the source files on disk.

Re-ingests the sources with the published adapter specs, checks each document's sha256 against the hash the record pinned, and re-derives every proof in the log against those fresh records. Nothing is read from the memory of the process that ran the close, so this is the same thing an outside auditor does — done by us, on demand.

Three failure modes, reported apart because they mean different things. sources_match false means you pointed it at different bytes than the close ran on: your mistake, not our finding. refuted means the arithmetic does not hold: our finding. missing_proofs means the record has no proof to check, which is a gap in the evidence and deliberately does not pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes
source_setYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden and exceeds it. It reveals that the operation is memory-independent, and it explains the three failure modes (sources_match, refuted, missing_proofs) including that missing_proofs deliberately does not pass.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, and the following paragraphs earn their place by covering provenance and failure-mode semantics. There is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter audit-style tool with an output schema, the description provides what an agent needs to call it correctly: what it does, why it is auditor-equivalent, and how to interpret its distinguishable failure outcomes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It contextualizes source_set as source files on disk and run_id as the recorded close, but it never explicitly maps either parameter or gives format/constraint details beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Re-derive a whole recorded close from the source files on disk.' It then names the concrete steps—re-ingesting sources, checking sha256, re-deriving proofs—which clearly separates it from sibling get/verify/run tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: this is the same thing an outside auditor does, done on demand, because nothing is read from process memory. It does not explicitly name when to prefer it over siblings like run_close or verify_proof, nor state exclusion conditions, so it stops 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.

run_closeA

Close one period: match, verify, post, record.

Note what this does not take. There is no policy argument, no tolerance, no rule set and no chart of accounts — a caller picks which loop and which period and nothing else, and everything that decides whether an answer is permitted is loaded from the loop's own signed bundles. You cannot widen a tolerance through this tool because there is no parameter through which to try.

Every posting it writes descends from a proof that was re-derived from raw records before anyone saw it; a match that fails re-derivation is dropped and its refusal recorded. The return value is read back out of the decision log the close just wrote, so what you see is what an auditor holding that file would see.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopYes
source_setYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the burden, and it does so richly. It discloses that the tool writes postings and a decision log, that decisions are governed by pre-signed bundles, that failed re-derivation causes matches to be dropped with refusals recorded, and that the return value reflects the actual decision-log contents. This is far beyond minimal transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then adds constraints and behavioral guarantees in a logical order. Despite being longer than average, every sentence adds meaningful information; none of it is filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no annotations, the description gives strong behavioral context, return-value provenance, and constraint details. It is slightly incomplete on parameter semantics and does not point to list_loops/list_source_sets for discovering valid inputs, but the existing output schema and the behavioral detail cover most of what an agent needs to use it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, but it does not define loop or source_set or explain how valid values are obtained. It says the caller chooses 'which loop and which period,' yet the schema parameter is source_set, not period, which may create ambiguity about what source_set represents. The only helpful semantic point is that there are no other optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Close one period: match, verify, post, record' is a specific verb plus resource and names the full operation pipeline. It distinguishes run_close from siblings like run_match (which only matches) and get_close (which returns a close), so an agent can understand what this tool is for without inspecting other definitions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the tool's scope: a caller picks 'which loop and which period and nothing else.' It also explicitly excludes other kinds of behavior ('no policy argument, no tolerance, no rule set') and notes that tolerance cannot be widened here. It does not name sibling alternatives, but it gives enough context to know when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_matchA

Match one period and return the proofs — no posting, no ledger, no log.

The matching stage on its own, for a caller that wants to check our arithmetic rather than have us close the books. Returns proven matches with their full proofs, everything the verifier refused, and the exceptions raised.

The records are not inlined — 543 rows of this toy corpus is ~342 KB, most of a context window. fetch_records pages them. But ignore them: ingest the same source files with the published adapter spec and verify against your own records. That is what verify_proof is for and it is the only version of this that proves anything about our honesty.

Matches page too, proofs included, because a caller here is calling for the proofs. match_page.next_offset is the cursor; it is null when you have them all, and total is always the real total.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopYes
limitNo
offsetNo
source_setYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it states no side effects, enumerates what the response contains (proven matches, full proofs, refused items, exceptions), explains that records are not inlined and why, and documents pagination via match_page.next_offset and total. It even discloses that this call is not evidence of honesty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key purpose is front-loaded in the first two sentences, and later paragraphs add genuinely useful behavior and warning context. It is longer than strictly necessary, with some repetition of the no-posting/no-close idea, but each section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the output schema exists and the description covers side-effect profile, response contents, pagination, and alternatives, the tool is largely callable in context. The main gap is the undocumented input parameters, which is reflected in the parameter-semantics score; this keeps it from a perfect completeness score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it never explicitly maps loop, source_set, limit, or offset to their meanings. "One period" hints at loop and "source files" hints at source_set, but limit/offset are left wholly to inference, and the pagination discussion is about the output cursor rather than the input parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb ("Match"), a scoped resource ("one period"), and the deliverable ("return the proofs"), then rules out side effects with "no posting, no ledger, no log." It also names verify_proof as a sibling with a different goal, so the tool is distinguishable from the close/verify family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly frames the use case: "for a caller that wants to check our arithmetic rather than have us close the books." It also gives an alternative and a when-not-to-trust directive: use verify_proof to prove honesty, since run_match's own output is not that proof.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sign_off_closeB

Accept the close. The terminal decision, and the strongest claim here.

Three refusals stand, and they bind an agent exactly as they bind a person at a screen, because none of them was ever a question about who was calling: books that do not balance, blocking items nobody has opened, and an unnamed signer. Delegating to an agent does not make an unopened item opened — read the worklist first, the same as anyone would.

The pack records that this signature arrived through an agent. That is not a hedge against you; it is what lets a reader a year from now tell the difference between a close somebody read and a close somebody automated.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and mostly meets it: it discloses that the action is terminal, that refusals apply regardless of caller, and that the action records that an agent supplied the signature. It does not specify error behavior or reversibility, but 'terminal decision' covers the essential risk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core statement is front-loaded and the total length is modest, but the prose is intentionally florid. Phrases like 'the strongest claim here' and 'that is not a hedge against you' add tone rather than necessary operational detail, so not every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides useful behavioral context—preconditions, finality, audit logging—and an output schema covers return values. However, it is thin on parameter semantics and does not describe the exact workflow from receiving a close to accepting it, leaving a capable agent to infer part of the process.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never mentions run_id or note, let alone what run_id identifies or how note is recorded. The only contextual link is 'the close,' which is too indirect to supply meaning for the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Accept the close,' a clear verb and resource, and reinforces it with 'terminal decision' to communicate finality. This distinguishes the tool from siblings like run_close or get_close, though it never defines what a 'close' is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit preconditions: 'read the worklist first' and three binding refusals that an agent cannot bypass. It does not name alternative tools directly, but the worklist instruction clearly points to the get_worklist sibling and the refusals tell the agent when not to sign off.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_journalB

Check a decision log's hash chain and its terminator.

The terminator states how many events precede it and what was decided; those are claims by the writer, and this checks them against the stream. A valid chain over a truncated log is still a valid chain, which is exactly why the terminator has to be there.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of disclosing behavior. It does this well by explaining that the terminator's counts and decisions are writer claims checked against the stream, and it highlights the subtle truncation caveat. It still does not mention whether the operation is read-only or what happens on invalid chains, but the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence front-loads the operation, and the second sentence earns its place by explaining why the terminator exists and why truncation alone is insufficient. Well-structured and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core logic is well explained, and since an output schema exists, the return value does not need to be described. However, the single input run_id is not explained, and there is no guidance on how this tool relates to sibling verification tools, leaving a meaningful contextual gap for an agent deciding how to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention run_id at all. The only parameter's meaning, format, or relationship to the decision log is left entirely to the schema, which only says it is a required string. The description adds no value beyond the input schema for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Check') and a specific resource ('a decision log's hash chain and its terminator'), which makes the tool's purpose immediately clear. It explains the terminator's role, but it does not explicitly distinguish itself from sibling tools like verify_proof, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: the tool should be used when you need to verify a decision log's hash chain and terminator claims. However, there is no explicit 'when to use / when not to use' guidance, and no alternative tools are named, leaving an agent to infer when verify_journal is preferable to siblings such as verify_proof or reverify_close.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_proofA

Re-derive one proof from records you hold. Stateless, and it trusts nothing.

The verifier fetches each record by id, recomputes every leg subtotal and the residual from those records, and compares against what the proof claims. It reads no stored residual, takes its sign convention from policy rather than from the proof, and refuses a proof whose claimed tolerance exceeds the policy ceiling. A proof that names a record you did not supply is refuted, not excused.

Name a loop to verify under that loop's published policy, or hand in a policy of your own. Exactly one — there is no default, because a verification that silently chose a policy would be deciding your constraints for you. The verdict says which you used: a lenient policy you brought along yields a verdict about your constraints and is stamped caller-supplied so it cannot be quoted back as ours.

This call is how you check our work without trusting us. Take a proof out of audit_export, ingest the source files yourself with the published adapter spec, and run it. If it disagrees with us, that is a finding about us.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopNo
proofYesEvidence for one match. Immutable once emitted.
policyNo
recordsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It reveals that the tool is stateless, trusts nothing, reads no stored residual, derives sign convention from policy, refuses proofs above the tolerance ceiling, refutes proofs referencing missing records, and stamps caller-supplied verdicts so they cannot be misattributed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense, with the core purpose and key behavioral traits front-loaded in the first line. Every paragraph earns its place: policy selection, trust posture, verdict stamping, and workflow all serve the agent's decision-making without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with nested objects and a low-schema-coverage input, the description is remarkably complete. It covers what the tool recomputes, how it treats missing records, the policy/loop exclusivity, the verdict's caller-supplied marker, and the intended workflow via audit_export — leaving little for an agent to infer or get wrong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (25%), so the description must compensate, and it largely does. It explains the meaning and relationship of proof and records ('fetches each record by id... compares against what the proof claims'), and it gives crucial semantics for loop vs. policy, including the exactly-one rule and absence of a default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Re-derive one proof from records you hold.' It then clarifies the verification mechanism — recompute subtotals and residual from fetched records and compare against the proof's claims — which makes the tool's purpose unmistakable and distinguishes it from close-level or journal-level checks among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear, practical usage context: this is the way to 'check our work without trusting us,' and it tells the caller to pull a proof from audit_export and ingest source files. It also explains the loop-or-policy choice. However, it does not explicitly mention when to prefer an alternative sibling tool or when not to use this tool.

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. Dates show when Glama detected each change.

  1. 21 tool updatesv0.0.0
    • First observedaccept_classification
    • First observedaudit_export
    • First observeddispose_exception
    • First observedexplain_exception
    • First observedfetch_records
    • First observedget_authority
    • First observedget_close
    • First observedget_contracts
    • First observedget_events
    • First observedget_proof
    • First observedget_worklist
    • First observedlist_loops
    • First observedlist_runs
    • First observedlist_source_sets
    • First observedpropose_reclassification
    • First observedreverify_close
    • First observedrun_close
    • First observedrun_match
    • First observedsign_off_close
    • First observedverify_journal
    • First observedverify_proof

TDQS

B3.3/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: proofs, records, worklists, exceptions, loops, runs, closes, events, classifications, and authorities are all cleanly separated. Even the multiple verify tools are clearly differentiated by object type (proof, close, journal).

Naming Consistency4/5

Nearly all tools follow a clear verb_noun pattern like get_proof, list_runs, run_close, and verify_journal. The one minor exception is audit_export, which reads as a noun phrase rather than a verb_noun action, but this does not create real confusion.

Tool Count3/5

At 21 tools, the set is on the heavy side and sits at the boundary of being too large for easy navigation. The tools are individually purposeful and the financial-close domain is broad, but the count still feels dense rather than tight.

Completeness5/5

The surface covers the full lifecycle: configuration discovery, source ingestion, matching, closing, exception handling, classification, verification, audit export, and journal integrity. There are no obvious dead ends, and the refusal semantics are consistently exposed where human or policy sign-off is required.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Automates month-end close reconciliation tasks including bank statement matching, GL account reconciliation, intercompany balance checking, and close task tracking.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    An accounting-ops agent that reconciles payments against open orders, auto-books provably safe payments through a deterministic policy gate, and escalates exceptions to a human queue with audit trails.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Deterministic verification for AI-generated analysis. Reconciliation, consistency and Excel-integrity checks that stop the line when the numbers don't add up.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Abishai95141/FinCon'

If you have feedback or need assistance with the MCP directory API, please join our Discord server