Example: BPEC discoverability catalog
Scenario: an AI System following a cross-publisher reference pointer (from example 02, Step 5) lands on the BPEC discoverability catalog. The pointer told it that BPEC-200:2024 clause 8.3.2 exists; the catalog tells it what BPEC is, what BPEC-200 covers, and how to license it.
CLASP version: 0.1.
Authentication: none. The catalog is the free, unauthenticated discoverability tier.
Cache semantics: HTTP. Both endpoints emit ETag and Last-Modified. AI Systems revalidate with If-None-Match.
Step 1: AI System fetches the catalog index
The cross-publisher pointer from example 02 carried discoverability_uri = "https://bpec.example/.well-known/clasp-catalog". The AI System issues an unauthenticated GET against that URL.
Request:
GET /.well-known/clasp-catalog HTTP/1.1
Host: bpec.example
Accept: application/jsonResponse:
HTTP/1.1 200 OK
Content-Type: application/json
ETag: "ix-2026-04-18-v7"
Last-Modified: Sat, 18 Apr 2026 09:14:22 GMT
Cache-Control: public, max-age=3600
{
"catalog_version": "0.1",
"publisher": "bpec.example",
"publisher_name": "Bioprocess and Pharmaceutical Equipment Council",
"publisher_licensing_overview_uri": "https://bpec.example/licensing",
"standards": [
{
"designation": "BPEC-100",
"title": "Hygienic Design of Bioprocess Vessels",
"current_edition": "2024",
"catalog_uri": "https://bpec.example/.well-known/clasp-catalog/BPEC-100"
},
{
"designation": "BPEC-200",
"title": "Hygienic Design of Single-Use Bioprocess Components",
"current_edition": "2024",
"catalog_uri": "https://bpec.example/.well-known/clasp-catalog/BPEC-200"
},
{
"designation": "BPEC-300",
"title": "Cleanability and Sterilizability of Bioprocess Equipment",
"current_edition": "2023",
"catalog_uri": "https://bpec.example/.well-known/clasp-catalog/BPEC-300"
},
{
"designation": "BPEC-410",
"title": "Material Compatibility for Pharmaceutical Process Contact Surfaces",
"current_edition": "2025",
"catalog_uri": "https://bpec.example/.well-known/clasp-catalog/BPEC-410"
}
]
}What this demonstrates
- The index is intentionally thin. Each entry has just enough to let the AI System decide which per-standard document to fetch next.
current_editionflags the publisher’s current edition for each designation. Older editions are visible only in the per-standardeditionsarray.- The catalog index does not include scope statements, defined terms, or supersession chains. Those live in the per-standard
CatalogStandarddocuments. - The
ETagis opaque to the AI System; on revalidation, the AI System simply echoes it back inIf-None-Match.
Step 2: AI System fetches the per-standard document
The pointer from example 02 named BPEC-200. The AI System follows catalog_uri from the index entry for that designation.
Request:
GET /.well-known/clasp-catalog/BPEC-200 HTTP/1.1
Host: bpec.example
Accept: application/jsonResponse (abbreviated to one edition and a representative TOC subset for readability):
HTTP/1.1 200 OK
Content-Type: application/json
ETag: "bpec200-2024-rev3"
Last-Modified: Fri, 19 Jan 2026 16:02:11 GMT
Cache-Control: public, max-age=3600
{
"catalog_version": "0.1",
"publisher": "bpec.example",
"designation": "BPEC-200",
"title": "Hygienic Design of Single-Use Bioprocess Components",
"scope_statement": "This standard establishes hygienic design requirements for single-use bioprocess components in pharmaceutical and biotechnology manufacturing, including wetted-path materials, joints and connections, extractables and leachables qualification, and cleanability of any reusable interfaces. The standard applies to components in contact with active pharmaceutical ingredient streams, intermediate process streams, and clean utility streams. It does not address sterilization validation, which is covered by BPEC-300.",
"industry_sectors": [
{ "clasp_code": 0, "label": "bioprocess", "isic_rev4": "C21" },
{ "clasp_code": 1, "label": "pharmaceutical", "isic_rev4": "C21" }
],
"licensing_uri": "https://bpec.example/licensing/BPEC-200",
"license_inquiries_uri": "https://bpec.example/licensing/contact",
"editions": [
{
"edition": "2024",
"pubdate": "2024-06-12",
"is_current": true,
"canonical_language": "en",
"available_languages": ["en", "de"],
"supersedes": ["BPEC-200-2019"],
"superseded_by": null,
"regulatory_incorporations": [],
"table_of_contents": [
{ "clause": "1", "title": "Scope", "depth": 1 },
{ "clause": "2", "title": "Normative references", "depth": 1 },
{ "clause": "3", "title": "Terms and definitions", "depth": 1 },
{ "clause": "4", "title": "General hygienic design principles", "depth": 1 },
{ "clause": "5", "title": "Wetted-path materials", "depth": 1 },
{ "clause": "5.1", "title": "Polymer selection", "depth": 2, "parent": "5" },
{ "clause": "5.2", "title": "Elastomer selection", "depth": 2, "parent": "5" },
{ "clause": "5.3", "title": "Material qualification documentation", "depth": 2, "parent": "5" },
{ "clause": "6", "title": "Joints and connections", "depth": 1 },
{ "clause": "7", "title": "Extractables and leachables qualification", "depth": 1 },
{ "clause": "8", "title": "Active pharmaceutical ingredient stream contact", "depth": 1 },
{ "clause": "8.1", "title": "General requirements", "depth": 2, "parent": "8" },
{ "clause": "8.2", "title": "Component qualification", "depth": 2, "parent": "8" },
{ "clause": "8.3", "title": "Process contact surfaces", "depth": 2, "parent": "8" },
{ "clause": "8.3.1", "title": "Surface finish requirements", "depth": 3, "parent": "8.3" },
{ "clause": "8.3.2", "title": "Conformance criteria for direct API contact", "depth": 3, "parent": "8.3" },
{ "clause": "8.3.3", "title": "Documentation requirements", "depth": 3, "parent": "8.3" },
{ "clause": "9", "title": "Cleanability of reusable interfaces", "depth": 1 },
{ "clause": "Annex A", "title": "Worked examples of polymer selection rationale", "depth": 1 },
{ "clause": "Annex B", "title": "Reference extractables test methods", "depth": 1 }
],
"defined_terms": [
{ "term": "single-use component", "clause": "3.1.2" },
{ "term": "wetted path", "clause": "3.1.5" },
{ "term": "process contact surface", "clause": "3.1.7" },
{ "term": "API stream", "clause": "3.1.9" },
{ "term": "extractables", "clause": "3.1.14" },
{ "term": "leachables", "clause": "3.1.15" },
{ "term": "conformance assessment", "clause": "3.1.21" }
]
},
{
"edition": "2019",
"pubdate": "2019-08-30",
"is_current": false,
"canonical_language": "en",
"available_languages": ["en"],
"supersedes": [],
"superseded_by": "BPEC-200-2024",
"regulatory_incorporations": [],
"table_of_contents": [
{ "clause": "1", "title": "Scope", "depth": 1 },
{ "clause": "2", "title": "Normative references", "depth": 1 },
{ "clause": "3", "title": "Terms and definitions", "depth": 1 },
{ "clause": "4", "title": "Materials", "depth": 1 },
{ "clause": "5", "title": "Components", "depth": 1 },
{ "clause": "6", "title": "Connections", "depth": 1 }
],
"defined_terms": [
{ "term": "single-use component", "clause": "3.1.1" },
{ "term": "wetted surface", "clause": "3.1.3" }
]
}
]
}What this demonstrates
- The
scope_statementis a plain-language description, not normative clause text. It tells the AI System what the standard covers without quoting it. - The
table_of_contentscarries clause identifiers, heading titles, a depth integer for visual nesting, and an explicitparentfield pointing to the clause identifier of the entry’s parent. Top-level entries omitparent. The AI System can build a tree by followingparentpointers (8.3.2->8.3->8-> top-level); array order is normative and determines sibling order. The pointer from example 02 named clause8.3.2; the AI System can now report to the engineer that this clause is titled “Conformance criteria for direct API contact”, that its direct parent is8.3(“Process contact surfaces”), and that the ancestor chain terminates at section8(“Active pharmaceutical ingredient stream contact”). - The
defined_termsarray exposes term names and the clauses where they are defined. No definition text. An engineer who needs to know whatprocess contact surfacemeans is directed by the AI System to the BPEC-200 licensing flow. - The
editionsarray includes the superseded2019edition with its own (smaller) TOC and defined-terms list. Clause numbering differs between editions: the termsingle-use componentis at3.1.1in 2019 and3.1.2in 2024. This is the renumbering case that the protocol’starget_clausesfield has open across editions. available_languages: ["en", "de"]declares that BPEC-200:2024 has an English and a German rendering. An AI System withpreferred_languages: ["de", "en"]would receive the German rendering when it later licenses the standard.regulatory_incorporationsis empty for BPEC-200; this standard is not currently incorporated by reference into any regulator’s published rules.
Step 3: AI System routes the engineer to licensing
Based on what the catalog returned, the AI System can now tell the engineer:
The 2026 edition of TMF-3050 (the standard you’re working with) normatively cites BPEC-200:2024 clause 8.3.2, which is titled “Conformance criteria for direct API contact” and sits under section 8 (“Active pharmaceutical ingredient stream contact”). BPEC-200 is published by the Bioprocess and Pharmaceutical Equipment Council and is available in English and German. To retrieve the actual clause text, you need a BPEC license; the licensing flow is at https://bpec.example/licensing/BPEC-200 .
None of that summary required exposing any normative clause text from BPEC-200. The AI System has used only catalog metadata.
What this example demonstrates that the others do not
- The discoverability catalog itself (CatalogIndex and CatalogStandard).
- HTTP-layer caching semantics (
ETag,Last-Modified,Cache-Control). - The cross-publisher resolution path from the example 02 pointer to the actual catalog data the AI System uses to route the engineer.
- The “no normative text” IP boundary: heading titles and defined-term names cross it cleanly; definition text and clause body text do not.
- Multi-edition representation in the catalog, including the renumbering case (
3.1.1versus3.1.2forsingle-use component). - A non-English
available_languagesentry (German).
Notes on the protocol surface
- The
Cache-Control: max-age=3600here is illustrative. Publishers SHOULD pick a value that reflects how often their catalog actually changes; for most publishers, weekly or daily would be reasonable. - The
ETagvalue is opaque. The example uses human-readable strings ("ix-2026-04-18-v7","bpec200-2024-rev3") for illustration; production deployments commonly use hashes. - BPEC-200’s German rendering (
available_languages: ["en", "de"]) is illustrative; the catalog cannot tell the AI System the German clause headings without exposing the German TOC. v0.2.2 does not specify whethertable_of_contentsshould be returned in a requested language; in practice publishers would return the canonical-language TOC by default and may or may not offer language-tagged TOC variants. This is a small spec gap worth noting. - The catalog has no authentication, so a publisher concerned about scraping for competitive intelligence will need CDN-level rate limiting or other operational controls. The protocol does not specify these.