← The evidence ledger
Evidence row 306032
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 694841f4-dbf4-4125-a4fb-355e1488ce98
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 6c2080f0ae934a1acedcdea6b256099541ef0d87048e0463b3ee0bd01dff7ef4
- Leaf
- 0x853db7be5d85f0e9d11de33495863f8d7f49caeab52adca67af32b740df645e3
What was observed
{
"count": 11,
"tools": [
{
"description": "Navigate the PTPGE hierarchy. Returns a node and its children (id, notation, label, level, elementType, hasChildren). Omit id_or_path to get the three top concepts (printing, ordering, variables). Use this for systematic exploration instead of guessing search keywords.",
"inputSchema": {
"properties": {
"id_or_path": {
"description": "Full URI or path under /v1/. Omit for the top concepts.",
"type": "string"
},
"language": {
"default": "en",
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "ptpge_browse"
},
{
"description": "Does an agent find PTPGE on this domain? Fetches exactly what a checkout agent fetches — https://<domain>/.well-known/ucp (the UCP manifest and its ptpge block), the vendor declaration at /.well-known/ptpge/declaration.json, the identity in the vendors register, and a supplier catalogue if the domain is a maker — and validates each against its published JSON Schema (ptpge.org/v1/schemas/) and the vocabulary. Returns a verdict (ready | partial | none), one line per step with errors and warnings, what the agent sees (name, identity, products, capability counts) and what is missing with where to fix it. Read-only; nothing is stored. Use it to answer 'is <printer> agent-ready?' or 'why does my declaration not validate?'.",
"inputSchema": {
"properties": {
"document": {
"description": "Optional: https URL of a declaration or catalogue hosted elsewhere than the known path (a register entry marked «hosted»).",
"type": "string"
},
"domain": {
"description": "A hostname or URL, e.g. trykkverk.no or https://trykkverk.no/.",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "ptpge_check_domain"
},
{
"description": "Expand a spec or request fingerprint (ptpge-cfs/1, full 64-hex or 16-hex short form) back into its structured configuration — the read-back path for MIS/ERP: matched profile, product, every binding with resolved labels, the canonical string, and the dataset version. This is a LOOKUP in the public resolver (ptpge.org/f/), not an inversion of the hash: it resolves when the fingerprint has been registered (every fingerprint computed by ptpge_fingerprint is self-registered within seconds). An unregistered fingerprint is still a valid identity — it simply has no stored expansion yet; returns status 'unknown' then.",
"inputSchema": {
"properties": {
"fingerprint": {
"description": "SHA-256 hex (64) or the 16-hex short form, with or without the resolver URL prefix.",
"type": "string"
},
"language": {
"default": "en",
"type": "string"
}
},
"required": [
"fingerprint"
],
"type": "object"
},
"name": "ptpge_expand_fingerprint"
},
{
"description": "Side effect: the spec-profile fingerprint is registered in the public register at ptpge.org/f (no personal data; same configuration → same entry; cannot be undone). Compute the canonical ptpge-cfs/1 serialization and SHA-256 fingerprint of a resolved product configuration (SD-0040) — the vendor-neutral identity used as quote/order/cache key. Returns both profiles in strict containment spec ⊂ request: 'spec' = the manufacturable artifact, commercial cluster excluded; 'request' = spec plus the commercial cluster — the variables under variables/order/ (quantity, lead-time, delivery-method, incoterm; SD-0040) without a vendor. An 'offer' is a request plus variables/order/vendor, one per vendor (SD-0108). Transaction data (print-ready file, delivery date, price) is keyed BY the request fingerprint and never hashed into it. SD-0083: the input is validated first and an identity is issued ONLY for a valid, complete configuration — every required axis of the product bound (or envelope-implied where the envelope offers one value; those are written into the identity) and every surface one of the bound setup's faces. Otherwise the result is error=not_fingerprintable with the validator's needs_disambiguation: put each question to the user verbatim, bind the answer, call again. Never guess a missing axis.",
"inputSchema": {
"properties": {
"bindings": {
"items": {
"properties": {
"ordered": {
"type": "boolean"
},
"surface": {
"type": "string"
},
"unit": {
"description": "custom-width / custom-height only — converted to mm before the identity.",
"enum": [
"mm",
"cm",
"m",
"in",
"pt"
],
"type": "string"
},
"value": {
"description": "URI/path or number."
},
"values": {
"type": "array"
},
"variable": {
"type": "string"
}
},
"required": [
"variable"
],
"type": "object"
},
"type": "array"
},
"product": {
"description": "Product URI or path.",
"type": "string"
},
"visuals": {
"default": false,
"description": "Also return markSvg (the ptpge-mark/1 recognition mark) and qrSvg (QR encoding the resolver permalink) per profile. Off by default to keep payloads small.",
"type": "boolean"
}
},
"required": [
"product",
"bindings"
],
"type": "object"
},
"name": "ptpge_fingerprint"
},
{
"description": "Return the complete Configuration Envelope of a product class in one call: supportsSetupModel, every supports* and perSurfaceSupports* predicate with resolved labels, plus typical* descriptors. This is the full menu of what can be configured for the product — use it before composing a configuration, instead of many individual ptpge_get_term calls. Absent predicates mean NOT supported (closed semantics).",
"inputSchema": {
"properties": {
"id_or_path": {
"description": "Product URI or path, e.g. 'ordering/products/brochures'.",
"type": "string"
},
"language": {
"default": "en",
"type": "string"
}
},
"required": [
"id_or_path"
],
"type": "object"
},
"name": "ptpge_get_product_envelope"
},
{
"description": "Fetch full context for a single PTPGE term: definition, broader/narrower relations, exactMatch / closeMatch mappings, properties, notation, level, and metadata. Accepts either a full URI (https://ptpge.org/v1/...) or a relative path under /v1/.",
"inputSchema": {
"properties": {
"id_or_path": {
"description": "Full URI or relative path under /v1/. E.g. 'printing/configurations/formats/a-series/a4'.",
"type": "string"
},
"language": {
"default": "en",
"description": "ISO 639-1 language code for which label and definition variants to return flat.",
"type": "string"
}
},
"required": [
"id_or_path"
],
"type": "object"
},
"name": "ptpge_get_term"
},
{
"description": "Return the current PTPGE dataset version, total term count, counts per level and per group, license, scheme URL, and server version. Useful for version-pinning, health checks, and diagnostics.",
"inputSchema": {
"properties": {},
"required": [],
"type": "object"
},
"name": "ptpge_get_version"
},
{
"description": "Resolve print colour pair notation (4/4, 4/1, 4+4) into per-surface colour bindings for a given product. The number is a COUNT OF SEPARATIONS, not a colour: it is resolved by searching the combinations this product's envelope actually supports whose colorChannelCount sums to that number. Returns one of three outcomes per surface — a deterministic binding, `needs_disambiguation` with the candidate combinations, or `invalid_for_template` when no combination is possible. IMPORTANT: when `needs_disambiguation` is returned you MUST put its `question` to the user and never infer the answer yourself. '1' is black on some products and a named spot colour on others; guessing gives two different products the same identity. Do not fingerprint an unresolved configuration.",
"inputSchema": {
"properties": {
"language": {
"default": "en",
"type": "string"
},
"notation": {
"description": "Pair notation, e.g. '4/4', '4 / 1', '4+4'.",
"type": "string"
},
"product": {
"description": "Product URI or path.",
"type": "string"
},
"setup": {
"description": "Optional setup-model URI/path (e.g. 'printing/configurations/setup-models/folded-sheet/tri-fold') so the surfaces match the fold. Required for products with several setups.",
"type": "string"
},
"surfaces": {
"description": "Optional surface slugs in notation order. Without them the faces come from 'setup' (or the product's only setup): flat-sheet front/back, folded-sheet outside/inside, roll face/back (SD-0083).",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"product",
"notation"
],
"type": "object"
},
"name": "ptpge_resolve_color_notation"
},
{
"description": "Free-text search over the PTPGE vocabulary and registers — the open specification of print. Returns a ranked list of matching terms with their URI, notation, preferred label, level (top-concept / group / category / sub-category / element), group, and a relevance score (0.0–1.0).",
"inputSchema": {
"properties": {
"groups": {
"description": "Optional filter by group code(s), e.g. [\"substrates\", \"configurations\"]. Omit for all groups.",
"items": {
"type": "string"
},
"type": "array"
},
"include_deprecated": {
"default": false,
"description": "Also return deprecated terms (they still resolve by URI but are no longer vocabulary). Default false: a brand name resolves to its register entry (kind=supplier) instead of the retired term.",
"type": "boolean"
},
"language": {
"default": "en",
"description": "ISO 639-1 language code for label and definition matching.",
"type": "string"
},
"limit": {
"default": 10,
"description": "Maximum number of results to return.",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "Free-text query. Matched against notation, label, altLabels, and definition.",
"type": "string"
},
"query_language": {
"description": "ISO 639-1 code for the language the QUERY is written in — not the language of the labels you want back (that is `language`). Optional, and it never changes the results: search always looks across every language. It is used only so that a phrase we cannot resolve is recorded against the right market, which is how missing synonyms get found and added. Send it if you know it; omit it if you do not.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "ptpge_search_terms"
},
{
"description": "Envelope validation of a product configuration against the specification: checks every binding against the product's supports* envelopes. When a value is not in this template's envelope but another template takes every bound value, the result carries alsoOfferedBy (ranked) and switchHint — switch product and validate again rather than dropping what the buyer asked for (a poster on aluminium composite is a panel print). Maps numeric substrate-weight (gsm) to its weight band via the bands' minWeight/maxWeight properties, and returns data-driven advisories (e.g. creasing recommended above the scoring thresholds). NOTE: this validates the ENVELOPE only — cross-variable legality (e.g. valid panel counts per fold topology) and vendor capability matching are an implementation's concern (a configurator), not the specification's; commercial values (date, price) are not configuration and belong to the transaction layer. Elicitation contract (shared by every ptpge_* tool): whenever a result carries `needs_disambiguation`, each entry has a `field`, a `question` that MUST be put to the user verbatim, and `candidates` — never infer the answer, never fingerprint until it is resolved. SD-0083: the validator also checks completeness — a missing REQUIRED axis of the product (setup/fold, format, page count, binding, colour on the first face, shape where shape is the product) returns needs_disambiguation with the envelope's candidates; a required axis with exactly one allowed value is bound for you as envelope-implied; a surface name that is not a face of the bound setup (faces: flat-sheet front/back, folded-sheet outside/inside, multi-page front-cover…back-cover) is rejected with the allowed faces. `complete: true` means an identity can be issued. SD-0104 spot inks: a spot-color layer in color-mode is not identified until it is named — bind variables/features/spot-ink on the same face with the value <matching-system term>/<code>: Pantone 300 C → printing/standards/color-systems/color-matching-systems/pantone-matching-system/300-c, HKS 43 K → …/color-matching-systems/hks/43-k, RAL 5015 → …/ral/5015 (code lower-case, spaces as hyphens; checked for form only). One spot-ink per spot-color layer; two spots = color-mode values [cmyk, spot-color, spot-color] + two spot-ink values. Fewer inks than layers → needs_disambiguation; the specification sets no limit on the number of spot colours (the press does).",
"inputSchema": {
"properties": {
"bindings": {
"description": "Variable bindings to validate.",
"items": {
"properties": {
"provenance": {
"description": "How this value came about (SD-0071): 'confirmed' — the buyer chose it; 'inferred' — you derived it without asking; 'policy-default' — a house rule supplied it. Never part of the fingerprint; identity is the product, not the conversation. Set it honestly: a vendor may refuse an order whose colour was never confirmed.",
"enum": [
"confirmed",
"inferred",
"policy-default",
"envelope-implied"
],
"type": "string"
},
"surface": {
"description": "Surface slug for surface-scoped bindings (e.g. 'outside').",
"type": "string"
},
"unit": {
"description": "custom-width / custom-height only: the unit the value is stated in. Converted to mm before validation and identity (the identity is always mm).",
"enum": [
"mm",
"cm",
"m",
"in",
"pt"
],
"type": "string"
},
"value": {
"description": "URI/path (enum) or number (numeric variables)."
},
"values": {
"description": "For cardinality-multiple variables.",
"type": "array"
},
"variable": {
"description": "Variable URI or path, e.g. 'variables/configuration/format'.",
"type": "string"
}
},
"required": [
"variable"
],
"type": "object"
},
"type": "array"
},
"language": {
"default": "en",
"type": "string"
},
"product": {
"description": "Product URI or path.",
"type": "string"
}
},
"required": [
"product",
"bindings"
],
"type": "object"
},
"name": "ptpge_validate_config"
},
{
"description": "Validate ONE document you hand over — a vendor declaration, supplier catalogue, request, quote or UCP manifest (its `schema` field says which) — against the published JSON Schema, the vocabulary (every term URI must exist; deprecated warns) and, for request/1 and quote/1, the identity: the spec and request fingerprints are recomputed from the configuration and must match what the document states; a quote's offer fingerprint must equal request + the quote's vendor (SD-0108). Nothing is fetched from any domain and nothing is stored. This is the PTPGE Ready conformance check for a module that writes these documents (ptpge.org/ready/). Returns valid, errors[], warnings[] and what was checked.",
"inputSchema": {
"properties": {
"document": {
"description": "The document itself (JSON object with a `schema` field).",
"type": "object"
}
},
"required": [
"document"
],
"type": "object"
},
"name": "ptpge_validate_document"
}
]
}What the leaf hashes
{"body":"6c2080f0ae934a1acedcdea6b256099541ef0d87048e0463b3ee0bd01dff7ef4","id":306032,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793056778309196,"prev":null,"subject":"694841f4-dbf4-4125-a4fb-355e1488ce98","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).
- 0x853d9548105dbcdd21f61cc4adf3b07eec0836b9a5d33c3bbfdb7b79e3e8d5c9
- 0x21b43c3a7bfe7a4e492c060006a5f7a602da508bcb023ba05d77cb7ffeaba3bc
- 0x06ebc651b0725c3fea26d0c5cb04177a1ae78c077d00721026fa10a39b60ca45
- 0x76dbe48174e51a830de5e12980b51a221ffff479ae8b3fbd892debdddf8ad392
- 0x67ddcb1971189ee3ca35fdff24dcc6115c64c75c7abd9e595ed3f9dc3c5b8aed
- 0xc2e5d38724ae9f061982de606529ea822ccd265792510aed8cfa687c7df21c7e
- 0x756d5656b6e79d3e6a3e7a4d004c9ae85ad634e418062c4bfb97685bfeb17cf6
- 0xca7d5673e948641678afca09cf314dea22f14cc709af0674cf146d69992a5354
- 0x58b7ee5b62b8ee6a0b2f7bc8a51622b7fa7a224885c3d1c4f768751b5f3bbec8
- 0x57cf22ad94c4fd01cd46cc494037c1e1c1e5762f276a703f5e957ef32ad4aa0a
- 0x147021357b2eb773d60db74f751316bfd367b06080320d378c0c402240e98d59
- 0x146f43471a3bde6d8a04e87b6afd3ee6860c6e38a009f86aee705ce722b67748
- 0x91c2ae93ec20c7fed5088112fe3941ca622dfb3f8f1022c4844726c361244bd4
- 0x0eff463856b0992d53ab7d8c0b97c71541413358bdd445710c1e4b6aeb4d8f78
- 0x7eb603d37f0f22dae1ea013e391889906ffc0139ff26e25b044bee38eec8f9b2
- 0x2b6e23e3624a1b66e1d2298cfbce99a93ce6b13d24a58112a71802d79c5f7a76
- 0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9
- 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
- 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
- Day root
- 0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
- Chained
- 0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
- Published
- On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae