# PERUSTE

> Separates a text into the claims it makes and shows what each one actually rests on. A claim the text gives no source for shows as its own state, unstated, instead of quietly disappearing. Exports the claim-to-source bond as JSON. This document tells an agent how to call it.

## Installation

Nothing to install. This app runs on an AIMEAT node and is reachable two ways.

Over MCP — attach any MCP-capable client to `https://aimeat.io/v1/mcp` (OAuth 2.1), then:

```
    owner:  happydude500001
    app_id: peruste.html        (not "peruste")

aimeat_app_tools_get   { owner: "happydude500001", app_id: "peruste.html" }
```

Over HTTP — get an identity through the RFC 8628 device flow described at `https://aimeat.io/auth.md`, then
call the endpoints in `https://aimeat.io/v1/spec`.

## Configuration

- **Scopes.** The owner approves a scope set when they approve your agent. A call outside it
  answers 403 naming the scope, never an empty result.
- **Payment.** Priced tools answer 402 with the terms attached until a checkout for them completes;
  completing the checkout IS the invocation.
- **Schemas.** Every tool carries a full input and output schema in the manifest, so nothing has to
  be inferred from the app source: `https://aimeat.io/v1/apps/happydude500001/peruste.html/webmcp`

## Usage

```
aimeat_app_tool_invoke {
  owner: "happydude500001",
  app:   "peruste.html",
  tool:  "search",
  input: { ... }
}
```

This app publishes no priced tools.

## What this app does

# PERUSTE — claim-to-source bond

## What it does

You give it a text. It separates the claims the text makes, and for each one it records the sources THE TEXT ITSELF names. Where the text names none, the claim is kept and marked unstated rather than dropped. It then reports what share of the claims carry at least one reference.

The point is the gap: a claim with no source must be visible as a claim with no source. Most texts score low, and that is the finding, not a failure of the tool.

## What it does NOT do

It never supplies a source of its own. The model is instructed to take references from the text alone, so an empty reference list is its answer.

It never fetches or checks a reference. Nothing here is verified against the material; the state says so. The machine-checked state exists in the vocabulary and this version never sets it.

A state describes the BOND between a claim and the material. It never says whether the claim is true.

## The five states of a bond

- unstated — no bond has been stated; nobody said what this claim rests on
- asserted — the producer states the bond; nobody has checked it
- machine-checked — an automatic check has run and is named; this app never sets it
- human-verified — a person read the material and confirmed the claim rests on it
- contradicted — the material disagrees with the claim

The vocabulary is closed and is not translated: these five names are the schema, in every language the app renders.

## Grounding ratio

The share of claims carrying at least one resolvable reference, always shown with its bare counts (2 of 17), never as a percentage on its own. A reference is resolvable when it has an identifier and a kind. Resolvable is not the same as checked.

## Export shape

The app exports one JSON object:

- spec: "aimeat.grounding/v1-draft"
- source: where the text came from (pasted, or an AIMEAT document)
- claims[]: id, locator { quote, start, end }, evidence[], status, uncertainty, and verification { by, at } once a person has confirmed a bond
- evidence[]: ref, type, and retrieved_at only when someone actually retrieved it — a reference the text merely names carries no retrieval time
- grounding_ratio: bound, total, ratio, by_status
- ai_provenance: the node record for the model run that separated the claims

This follows the draft schema for TARGET-067. The draft is not final: precision level and how uncertainty is expressed are still open questions, and this app makes its own v1 choice (sentence level, uncertainty in words) rather than settling them.

## Input

Either a pasted text, or an AIMEAT document addressed by organism, workspace and document id. Analyses are saved privately to the signed-in owner under a single memory record, so there is no public state to read here.

## Languages

English and Finnish. The state names stay in English in both, because they are the schema.


> **AI provenance** — AI-generated (anthropic/claude-opus-5), human editorial review, 2026-08-22T15:29:52.543Z · record: https://aimeat.io/v1/provenance/0874b015-36d0-442c-8906-1dddd5258074


## Agent affordances

- Act — WebMCP tool listing for this app: https://aimeat.io/v1/apps/happydude500001/peruste.html/webmcp
- Learn — skills bound to this app: https://aimeat.io/v1/apps/happydude500001/peruste.html/skills
- App catalog on this node (this app: happydude500001/peruste.html): https://aimeat.io/app-catalog.html
- Register an agent on this node (RFC 8628 device flow): https://aimeat.io/auth.md


## Where the rest is

- [llms.txt](https://peruste.apps.aimeat.io/llms.txt) · [Site map](https://peruste.apps.aimeat.io/sitemap.md)
- [Node manual](https://aimeat.io/llms-full.txt) · [Node glossary](https://aimeat.io/v1/glossary.md) · [OpenAPI](https://aimeat.io/v1/spec)
