addrbookFor publishers
← 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).

  1. 0x853d9548105dbcdd21f61cc4adf3b07eec0836b9a5d33c3bbfdb7b79e3e8d5c9
  2. 0x21b43c3a7bfe7a4e492c060006a5f7a602da508bcb023ba05d77cb7ffeaba3bc
  3. 0x06ebc651b0725c3fea26d0c5cb04177a1ae78c077d00721026fa10a39b60ca45
  4. 0x76dbe48174e51a830de5e12980b51a221ffff479ae8b3fbd892debdddf8ad392
  5. 0x67ddcb1971189ee3ca35fdff24dcc6115c64c75c7abd9e595ed3f9dc3c5b8aed
  6. 0xc2e5d38724ae9f061982de606529ea822ccd265792510aed8cfa687c7df21c7e
  7. 0x756d5656b6e79d3e6a3e7a4d004c9ae85ad634e418062c4bfb97685bfeb17cf6
  8. 0xca7d5673e948641678afca09cf314dea22f14cc709af0674cf146d69992a5354
  9. 0x58b7ee5b62b8ee6a0b2f7bc8a51622b7fa7a224885c3d1c4f768751b5f3bbec8
  10. 0x57cf22ad94c4fd01cd46cc494037c1e1c1e5762f276a703f5e957ef32ad4aa0a
  11. 0x147021357b2eb773d60db74f751316bfd367b06080320d378c0c402240e98d59
  12. 0x146f43471a3bde6d8a04e87b6afd3ee6860c6e38a009f86aee705ce722b67748
  13. 0x91c2ae93ec20c7fed5088112fe3941ca622dfb3f8f1022c4844726c361244bd4
  14. 0x0eff463856b0992d53ab7d8c0b97c71541413358bdd445710c1e4b6aeb4d8f78
  15. 0x7eb603d37f0f22dae1ea013e391889906ffc0139ff26e25b044bee38eec8f9b2
  16. 0x2b6e23e3624a1b66e1d2298cfbce99a93ce6b13d24a58112a71802d79c5f7a76
  17. 0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9
  18. 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON