Skip to main content
Glama
Abishai95141

fincon

by Abishai95141

증명으로 장부를 마감하세요, 때우는 게 아니라.

FinCon은 결제 게이트웨이가 지급했다고 말하는 금액을 은행이 실제로 수령한 금액과 대사하고, 복식부기를 작성하며, 남은 항목을 순위·가격·배정하여 데스크로 보냅니다. 모든 매칭에는 감사자가 우리의 도움 없이 재도출할 수 있는 산술 증명이 함께합니다.


문제

대사 소프트웨어는 이미 거래의 90~99%를 매칭합니다. Trintech는 99% 이상을 공표합니다. NetSuite는 신뢰도 점수 보조 기능이 있는 N:M 규칙을 제공합니다. 그 문제는 이미 해결되었고, *"우리 AI가 더 잘 매칭한다"*고 내세우는 것은 누구도 도움을 필요로 하지 않는 단 한 가지 차원에서 경쟁하는 것입니다.

자동화 이후에도 살아남는 비용은 두 가지이며, 어느 것도 매칭 문제가 아닙니다.

꼬리(tail)는 이유 없이 돌아옵니다. 은행 피드 자동화는 대사 시간을 약 47분에서 예외 처리만으로 줄입니다. 이는 한 가지 통계로 전체를 설명합니다. 매칭된 기록은 결코 비용이 아니었다는 것입니다. 그러나 실패하는 1~10%는 평평한 큐로 돌아오고, 컨트롤러는 행마다 수작업으로 맥락을 재구성합니다. 거래량은 줄었습니다. 건당 비용은 그대로였습니다.

그리고 매칭률은 하락합니다. 자동 매칭률은 유지되는 것이 아니라 달성되는 것입니다. 새로운 벤더 형식은 누군가 규칙을 작성하기 전까지 조용히 매칭 품질을 떨어뜨리고, 규칙 작성은 엔지니어링 뒤에 막혀 있습니다. 따라서 예외를 이해하는 사람이 그것을 고칠 수 있는 사람이 결코 될 수 없습니다.

오늘날 컨트롤러가 하는 일: 세 개의 내역을 내려받고, 행 수준이 불가능하므로 지급 수준에서 매칭하고, 차액을 때움 항목(plug)으로 계상하고, 맞지 않으면 Excel에서 사흘을 보내고, 분개장을 수기로 입력하고, 다음 달에도 동일한 꼬리가 다시 돌아오는 것을 지켜봅니다.


Related MCP server: dingdawg-finance-agent

해결책

개방형 수집, 검증된 확정. 모델이 제안합니다. 결정론적 엔진이 증명합니다. 이름 있는 사람이 결정합니다.

AI는 세 가지 일을 하며, 그것들은 정확히 AI가 필요한 세 가지입니다

이것은 챗봇을 붙인 규칙 엔진도 아니고, 산술을 추측하는 모델도 아닙니다. 모델은 결정론적 시스템이 할 수 없는 작업에 정확히 배정됩니다:

아무도 설정하지 않은 형식을 읽습니다

한 번도 본 적 없는 레이아웃의 정산 파일. 모델은 원시 라인 12줄을 읽고 파싱 스펙(구분자, 헤더 행, 소수 단위, 비 ISO 날짜)을 작성합니다. 통합 프로젝트 없이 수집합니다.

꼬리에 이름을 붙입니다

산술로 해결하지 못한 항목은 엔진이 도출한 근접 후보들과 함께 모델로 전달되고, 약 2.1초 만에 코드, 가설, 인용 증거와 함께 돌아옵니다.

내일의 규칙을 작성합니다

자신의 말로 브레이크를 해결하면, 모델이 이를 방지했을 결정론적 규칙을 유도합니다. R-DUP-06은 컨트롤러의 한 문장에서 이렇게 작성되었으며, 이후 모든 마감에서 발동합니다.

시스템은 시간이 지날수록 더 에이전트적이지 않고, 더 결정론적으로 변합니다. 이것은 에이전트 제품이 일반적으로 노화하는 방식과 정반대이며, 전체 논지입니다.

그리고 울타리가 쳐져 있어서 켤 수 있습니다

언어 모델은 조회에서 95.6%에서 다변량 계산에서 거의 0으로 붕괴하며, 자신 있게 실패합니다. 따라서 모델은 구조적으로 산술에서 차단됩니다. 아래의 모든 경계는 누군가 제거하면 실패하는 테스트입니다:

  • 마감 중 모델 호출 없음. 6단계, 모델 호출 0회, 영수증에 그렇게 명시됩니다.

  • 제안은 도출된 답을 덮어쓸 수 없습니다. 기껏해야 P2이며, P0 ARITHMETIC을 덮어쓸 수 없습니다. 엔진이 도출한 항목은 제안조차 되지 않습니다.

  • 생성된 코드는 실행되지 않습니다. eval도 exec도 없습니다. 어댑터는 폐쇄된 파싱 동사 어휘로 읽히는 선언적 스펙입니다.

  • 어떤 도구도 권한을 가지지 않습니다. 어떤 MCP 도구도 정책, 허용 오차, 부호 규약 또는 규칙 세트를 받아들이지 않습니다. 생성된 스키마에 대해 검사됩니다.

모든 행에 증명, 그리고 네 가지 정직한 결말

모든 수용된 매칭은 신뢰도 점수가 아닌 산술 객체를 방출합니다: 양쪽의 레코드 ID, 0으로 수렴하는 잔차, 소비된 허용 오차, 발동된 규칙. 통과하는 증명이 없는 매칭은 매칭이 아니며 매칭 수에 포함되지 않습니다.

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

남은 모든 항목은 현금 영향 × 경과일로 순위가 매겨져 데스크로 배정됩니다. 각 항목은 복식부기로 종결됩니다 — 계상, 이월, 추적, 또는 상각 — 귀하의 이름으로, 서명된 정책에 의해 두 번 경계가 설정됩니다.


영향

엔진이 존재하기 전에 작성된 라벨을 기준으로 측정되었으며, 결정 로그만으로 재도출되었습니다:

자동 매칭

90.9% — 앵커 22개 중 20개, 티어별 T0=17 T1=2 T4=1

오매칭

0.00%

예외 커버리지

6 / 6 — 심어진 모든 결함 발견

분류

4 / 6 정확

모호성

1 / 1 감지 및 추측 대신 거부

분개장

23개 항목, 균형 — beancount 내보내기는 beancount 자체가 다시 로드합니다

마감 시간

약 1.4초, 모델 호출 0회

일반성은 주장이 아니라 측정됩니다. 두 번째 대사 — 소득세청의 Form 26AS를 TDS 미수금 원장과 TAN + 섹션 + 분기로 매칭, 4월~3월 회계연도 — 는 동일한 엔진에서 엔진 변경 없이 실행되며, 게이트가 바이트 단위로 검증합니다.

모른다고 명시하는 곳. 실제 마감에서 7개 항목 중 4개는 E14 — 엔진이 이유를 말할 수 없음 — 이며, 그 사실은 그럴듯한 추측으로 다듬어져 잘못된 데스크로 보내지지 않고 꼬리 맨 위에 인쇄됩니다. E09는 멈춰야 할 항목입니다: 두 개의 서로 다른 부분집합이 허용 오차 내에서 동일한 대변에 합산되므로 선택할 올바른 답이 존재하지 않으며, 찾은 첫 번째 부분집합을 반환하는 모든 도구는 그 지점에서 자신 있게 틀립니다.


어시스턴트를 연결하세요 — MCP

FinCon은 Model Context Protocol 서버입니다. *"10월 마감을 막는 것이 무엇인지, 큰 것부터 알려줘"*라고 물으면 레코드를 읽고, 결정론적 마감을 실행하고, 증명을 검증하고, 항목을 해결하고, 서명합니다 — 귀하로서, 귀하가 발급한 토큰을 보유하고 있기 때문입니다.

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

Cognito를 통한 OAuth, RFC 9728에 따른 오리진에서의 검색, 동적 클라이언트 등록. 또는 stdio에서 자신의 파일로 실행할 수 있습니다: make mcp.

21개 도구; 그중 4개는 쓰기 작업입니다. 어시스턴트는 낯선 사람이 아닙니다. 귀하의 자격 증명을 보유하며, 해당 토큰의 sub는 브라우저 세션이 해석하는 것과 동일한 문자열입니다. 따라서 귀하가 할 수 있는 일을 할 수 있고, 모든 결정은 들어온 문을 기록하므로 1년 후 어떤 항목을 직접 읽었고 어떤 항목을 위임했는지 알 수 있습니다. 중요한 경계 — 상각 상한, 예산, 잔액 확인, 아무도 열지 않은 항목 — 는 누가 호출했는지에 대한 질문이 아니었으며, 에이전트에게도 동일하게 적용됩니다.


아키텍처

모델이 제안 → 엔진이 증명 → 사람이 결정합니다. 증명이나 이름 없이는 어떤 경계도 넘지 않습니다.

  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), 실제 마감에는 산술만으로는 누구도 도출할 수 없는 항목이 포함되기 때문입니다. 규칙은 조용히 움직이지 말 것이지, 증명할 수 없는 것을 거부할 것이 아닙니다:

P0 ARITHMETIC 누구나 재도출 가능 · P1 RULE 승격되고 회귀 테스트된 규칙이 발동 · P2 ATTESTED 이름 있는 사람이 승인 · P3 DECLARED 명시된 차이를 인정하고 수용.

AWS에서 호스팅

https://fincon.astutecomputer.com 에서 운영 중 — ap-south-1의 단일 CloudFormation 스택. 논쟁할 가치가 있는 네 가지 결정과 이 인프라가 의도적으로 갖추지 않은 것을 포함한 전체 분석은 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

S3 대신 EFS — 결정 로그는 추가 전용(append-only)이고 해시 체인이며 작성자가 POSIX 잠금을 사용하기 때문입니다. 그리고 flock은 EFS에서 조용히 작동하지 않으며, 이 사실이 선택을 거의 뒤집을 뻔했습니다. 퍼블릭 서브넷, NAT 없음 — 단일 태스크 인프라를 위한 월 32달러 게이트웨이를 ALB만 허용하는 보안 그룹으로 대체했습니다. 커밋 sha로 태그된 이미지, 절대 latest가 아니므로 롤백에 이름을 붙일 수 있습니다.


실행

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와 make verify는 API 키가 필요 없습니다 — 모델 기반 게이트는 제외되고 출력에 명시됩니다. 조용히 건너뛰어 초록색으로 보이는 게이트는 이 저장소 전체가 다루는 실패이기 때문입니다.


우리 없이 검증하세요

주장은 *"우리 숫자를 믿으세요"*가 아닙니다. 감사자에게 결정 로그와 소스 파일을 건네면, 계정이 필요 없고 우리 상태를 전혀 건드리지 않는 공개 엔드포인트에서 모든 매칭을 재도출합니다:

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

모든 판정은 어떤 정책 하에서 생성되었는지 명시하고, 해당 정책이 시행 중(in force) 이었는지 호출자 제공(caller-supplied) 이었는지 스탬프를 찍습니다. 누군가 가져온 정책 하에서 생성된 판정이 우리 정책 하에서 생성된 것과 구분할 수 없게 돌아와서는 안 되기 때문입니다.


아직 할 수 없는 것

작동하는 것만 나열한 README는 브로슈어입니다.

  • 소규모로 검증됨 — 수백 개의 행, 두 개의 게이트웨이, 하나의 통화.

  • 일곱 개의 중단 중 네 개는 아직 이름이 없다. 보고만 했지, 추측하지 않았다.

  • 꼬리는 기억하지 못한다. 중단은 콘텐츠 지문으로 식별되므로, 같은 중단은 다음 달에도 알아볼 수 있다 — 하지만 아직 *"4개월 연속"*이라고 말해주는 것은 없다.

  • settlement_3way는 두 개의 다리를 묶지, 세 개가 아니다. 게이트웨이 ↔ 은행은 완료; 주문 등록부 ↔ 게이트웨이가 다음이고, 바로 거기서 수익 누수가 숨어 있다.

  • 하나의 모델, 하나의 프롬프트, 하나의 공급자, 그리고 생성기와 엔진을 같은 저자가 작성했다 — 그래서 적대적 세트가 고정되어 있고 변형 스위트가 존재하는 것이다.


문서

CLAUDE.md

상시 컨텍스트 — 규칙, 용어, 여덟 가지 불변 조건

STATUS.md

실시간 빌드 상태, 각 게이트를 증명하는 명령 출력 포함

docs/01-DECISION-SPEC.md

문제, 해결책, 트레이드오프

docs/08-AS-BUILT.md

오늘 실제로 실행되는 것

docs/10-THE-USER-FLOW.md

흐름, 그리고 그 가치

docs/13-THE-SCREENS.md

모든 화면, 그리고 각 화면이 답하는 질문

docs/14-AWS.md

AWS 자산 전체

docs/decisions/

ADR — 그중 두 개는 되돌릴 수 없음

FinCon 사용해 보기 →  ·  문의

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.

  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

Scored across 21 tools

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    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
    A
    quality
    D
    maintenance
    Enables AI assistants to perform financial analysis, budget forecasting, compliance checks, expense categorization, and risk assessment, returning structured JSON with audit-ready governance receipts.
    5
    63 npm
    1
    Business Source 1.1
  • F
    license
    A
    quality
    C
    maintenance
    Provides AI agents with deterministic, offline finance tools for commodity margin analysis, loan covenant compliance, invoice auditing, AP exception classification, and five-day close readiness.
    14
    1 npm
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI IDEs to perform financial reconciliation through five native tools for matching invoices, detecting bundled payments, and handling bank fee variances.
    MIT