{
  "openapi": "3.2.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "robertdelanghe.dev — static identity API",
    "version": "1.0.0",
    "summary": "Read-only JSON projection of the site's contracts: profile, writing, the GitHub corpus, and a résumé Verifiable Credential.",
    "description": "Static files, no server. Every response is a build artifact under /api/v1, covered by the signed whole-site manifest (site.sha256). Response schemas reuse the repo's contract/*.schema.json (JSON Schema 2020-12).",
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "contact": {
      "name": "Robert DeLanghe",
      "url": "https://robertdelanghe.dev"
    }
  },
  "servers": [
    {
      "url": "https://robertdelanghe.dev/api/v1",
      "description": "production (static)"
    }
  ],
  "paths": {
    "/profile.json": {
      "get": {
        "operationId": "getProfile",
        "summary": "Identity card",
        "tags": [
          "identity"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            }
          }
        }
      }
    },
    "/posts.json": {
      "get": {
        "operationId": "listPosts",
        "summary": "Writing index",
        "tags": [
          "writing"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostsIndex"
                }
              }
            }
          }
        }
      }
    },
    "/posts/{slug}.json": {
      "get": {
        "operationId": "getPost",
        "summary": "One resolved post",
        "tags": [
          "writing"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Post"
                }
              }
            }
          },
          "404": {
            "description": "No such post"
          }
        }
      }
    },
    "/corpus.json": {
      "get": {
        "operationId": "getCorpus",
        "summary": "Curated GitHub corpus",
        "description": "The whole corpus, unfolded. Prefer /corpus/index.json unless you need the long tails.",
        "tags": [
          "corpus"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Corpus"
                }
              }
            }
          }
        }
      }
    },
    "/corpus/index.json": {
      "get": {
        "operationId": "getCorpusIndex",
        "summary": "Corpus index — aggregate + drill-down seeds",
        "description": "Owner, stats, highlights, and the top ranked topics and languages, each with an href to its full list. The entry point: fetch this first and drill down, rather than pulling the whole corpus.",
        "tags": [
          "corpus"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CorpusIndex"
                }
              }
            }
          }
        }
      }
    },
    "/corpus/topics.json": {
      "get": {
        "operationId": "listCorpusTopics",
        "summary": "Every corpus topic, ranked",
        "tags": [
          "corpus"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RankedList"
                }
              }
            }
          }
        }
      }
    },
    "/corpus/languages.json": {
      "get": {
        "operationId": "listCorpusLanguages",
        "summary": "Every corpus language, ranked",
        "tags": [
          "corpus"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RankedList"
                }
              }
            }
          }
        }
      }
    },
    "/corpus/repos.json": {
      "get": {
        "operationId": "listCorpusRepos",
        "summary": "The corpus repositories shown",
        "tags": [
          "corpus"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/conformance.json": {
      "get": {
        "operationId": "getConformance",
        "summary": "Web-build conformance report",
        "description": "lone's conformance() projection over this build's evidence (rendered at /conformance). The strong claim is emitted only when every tier-1 required criterion is met; unsupplied criteria are not-assessed. Prefer /conformance/index.json unless you need every criterion.",
        "tags": [
          "provenance"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Conformance"
                }
              }
            }
          }
        }
      }
    },
    "/conformance/index.json": {
      "get": {
        "operationId": "getConformanceIndex",
        "summary": "Conformance index — totals, per-area counts, drill-down seeds",
        "description": "The report's own fold, which it already computed: totals plus one row per area with an href. An agent asking how one area is doing fetches that area, not all 37 criteria.",
        "tags": [
          "provenance"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConformanceIndex"
                }
              }
            }
          }
        }
      }
    },
    "/conformance/areas/{area}.json": {
      "get": {
        "operationId": "getConformanceArea",
        "summary": "One conformance area's criteria",
        "tags": [
          "provenance"
        ],
        "parameters": [
          {
            "name": "area",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConformanceArea"
                }
              }
            }
          },
          "404": {
            "description": "No such area"
          }
        }
      }
    },
    "/resume.vc.json": {
      "get": {
        "operationId": "getResumeCredential",
        "summary": "Résumé as a W3C Verifiable Credential 2.0",
        "description": "credentialSubject is the canonical JSON Resume; issuer is did:web:robertdelanghe.dev. The cryptographic proof is an enveloping Sigstore bundle served alongside as resume.vc.json.sigstore.json (keyless, bound to the GitHub Actions OIDC identity).",
        "tags": [
          "identity"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResumeCredential"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenapi",
        "summary": "This document",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Profile": {
        "title": "profile / identity card",
        "type": "object",
        "required": [
          "id",
          "name",
          "label",
          "headline",
          "url",
          "proof"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "headline": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "location": {
            "type": "object",
            "additionalProperties": true
          },
          "profiles": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "deck": {
            "type": "string"
          },
          "now": {
            "type": "object",
            "additionalProperties": true
          },
          "caseStudies": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "proof": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "label",
                "href"
              ],
              "additionalProperties": false,
              "properties": {
                "label": {
                  "type": "string"
                },
                "href": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "generatedFrom": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Post": {
        "title": "post (rendered API object)",
        "type": "object",
        "required": [
          "id",
          "slug",
          "url",
          "title",
          "summary",
          "date_published",
          "content_html"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "uri"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "date_published": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "content_html": {
            "type": "string"
          }
        }
      },
      "PostsIndex": {
        "title": "posts index",
        "type": "object",
        "required": [
          "title",
          "home_page_url",
          "count",
          "items"
        ],
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string"
          },
          "home_page_url": {
            "type": "string",
            "format": "uri"
          },
          "count": {
            "type": "integer"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Post"
            }
          }
        }
      },
      "Conformance": {
        "title": "web-build conformance report",
        "description": "lone's conformance() projection over this build's evidence (rendered at /conformance). The compact `claim` is emitted only when every tier-1 required criterion is `met`; unsupplied criteria are `not-assessed`, never overclaimed.",
        "type": "object",
        "required": [
          "standard",
          "version",
          "results",
          "summary",
          "areaSummaries",
          "conformant",
          "claim"
        ],
        "additionalProperties": false,
        "properties": {
          "standard": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "conformant": {
            "type": "boolean"
          },
          "claim": {
            "type": "string"
          },
          "summary": {
            "type": "object",
            "required": [
              "met",
              "unmet",
              "notAssessed",
              "total"
            ],
            "additionalProperties": false,
            "properties": {
              "met": {
                "type": "integer"
              },
              "unmet": {
                "type": "integer"
              },
              "notAssessed": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              }
            }
          },
          "areaSummaries": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "area",
                "met",
                "unmet",
                "notAssessed",
                "total",
                "summary"
              ],
              "additionalProperties": false,
              "properties": {
                "area": {
                  "type": "string"
                },
                "met": {
                  "type": "integer"
                },
                "unmet": {
                  "type": "integer"
                },
                "notAssessed": {
                  "type": "integer"
                },
                "total": {
                  "type": "integer"
                },
                "summary": {
                  "type": "string"
                }
              }
            }
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "area",
                "label",
                "standard",
                "target",
                "level",
                "evidence",
                "required",
                "status",
                "detail"
              ],
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string"
                },
                "area": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "standard": {
                  "type": "string"
                },
                "target": {
                  "type": "string"
                },
                "level": {
                  "type": "string"
                },
                "evidence": {
                  "type": "string",
                  "enum": [
                    "lone",
                    "external"
                  ]
                },
                "required": {
                  "type": "boolean"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "met",
                    "unmet",
                    "not-assessed"
                  ]
                },
                "detail": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ConformanceIndex": {
        "title": "conformance index (aggregate + drill-down seeds)",
        "description": "The conformance report's own fold: totals, per-area counts, and one href per area. Reach a single area's criteria through its href rather than fetching all of them.",
        "type": "object",
        "required": [
          "standard",
          "version",
          "conformant",
          "claim",
          "summary",
          "areas",
          "full"
        ],
        "additionalProperties": false,
        "properties": {
          "standard": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "conformant": {
            "type": "boolean"
          },
          "claim": {
            "type": "string"
          },
          "summary": {
            "type": "object",
            "required": [
              "met",
              "unmet",
              "notAssessed",
              "total"
            ],
            "additionalProperties": false,
            "properties": {
              "met": {
                "type": "integer"
              },
              "unmet": {
                "type": "integer"
              },
              "notAssessed": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              }
            }
          },
          "areas": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "area",
                "met",
                "unmet",
                "notAssessed",
                "total",
                "summary",
                "href"
              ],
              "additionalProperties": false,
              "properties": {
                "area": {
                  "type": "string"
                },
                "met": {
                  "type": "integer"
                },
                "unmet": {
                  "type": "integer"
                },
                "notAssessed": {
                  "type": "integer"
                },
                "total": {
                  "type": "integer"
                },
                "summary": {
                  "type": "string"
                },
                "href": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "full": {
            "type": "string",
            "format": "uri",
            "description": "The unfolded report, unchanged and at its original URL."
          }
        }
      },
      "ConformanceArea": {
        "title": "conformance area (one drill-down)",
        "type": "object",
        "required": [
          "area",
          "met",
          "unmet",
          "notAssessed",
          "total",
          "summary",
          "results"
        ],
        "additionalProperties": false,
        "properties": {
          "area": {
            "type": "string"
          },
          "met": {
            "type": "integer"
          },
          "unmet": {
            "type": "integer"
          },
          "notAssessed": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "summary": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Conformance/properties/results/items"
            }
          }
        }
      },
      "CorpusIndex": {
        "title": "corpus index (aggregate + drill-down seeds)",
        "description": "The corpus without its long tails: owner, stats, the pinned highlights, and the top ranked topics and languages with an href to each full list.",
        "type": "object",
        "required": [
          "generatedAt",
          "owner",
          "stats",
          "topics",
          "languages",
          "repos",
          "full"
        ],
        "additionalProperties": false,
        "properties": {
          "generatedAt": {
            "type": "string"
          },
          "owner": {
            "type": "object",
            "additionalProperties": true
          },
          "stats": {
            "type": "object",
            "additionalProperties": true
          },
          "highlights": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "topics": {
            "type": "object",
            "required": [
              "count",
              "top",
              "href"
            ],
            "additionalProperties": false,
            "properties": {
              "count": {
                "type": "integer",
                "description": "Total topics in the corpus."
              },
              "top": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "href": {
                "type": "string",
                "format": "uri",
                "description": "The full ranked list."
              }
            }
          },
          "languages": {
            "type": "object",
            "required": [
              "count",
              "top",
              "href"
            ],
            "additionalProperties": false,
            "properties": {
              "count": {
                "type": "integer",
                "description": "Total languages in the corpus."
              },
              "top": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "href": {
                "type": "string",
                "format": "uri",
                "description": "The full ranked list."
              }
            }
          },
          "repos": {
            "type": "object",
            "required": [
              "count",
              "href"
            ],
            "additionalProperties": false,
            "properties": {
              "count": {
                "type": "integer"
              },
              "shown": {
                "type": "integer"
              },
              "href": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "full": {
            "type": "string",
            "format": "uri",
            "description": "The unfolded corpus, unchanged and at its original URL."
          }
        }
      },
      "RankedList": {
        "type": "object",
        "required": [
          "count",
          "items"
        ],
        "additionalProperties": false,
        "properties": {
          "count": {
            "type": "integer"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "count"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "JsonResume": {
        "additionalProperties": false,
        "definitions": {
          "iso8601": {
            "type": "string",
            "description": "e.g. 2014-06-29",
            "pattern": "^([1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]|[1-2][0-9]{3}-[0-1][0-9]|[1-2][0-9]{3})$"
          }
        },
        "properties": {
          "$schema": {
            "type": "string",
            "description": "link to the version of the schema that can validate the resume",
            "format": "uri"
          },
          "basics": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
              "name": {
                "type": "string"
              },
              "label": {
                "type": "string",
                "description": "e.g. Web Developer"
              },
              "image": {
                "type": "string",
                "description": "URL (as per RFC 3986) to a image in JPEG or PNG format"
              },
              "email": {
                "type": "string",
                "description": "e.g. thomas@gmail.com",
                "format": "email"
              },
              "phone": {
                "type": "string",
                "description": "Phone numbers are stored as strings so use any format you like, e.g. 712-117-2923"
              },
              "url": {
                "type": "string",
                "description": "URL (as per RFC 3986) to your website, e.g. personal homepage",
                "format": "uri"
              },
              "summary": {
                "type": "string",
                "description": "Write a short 2-3 sentence biography about yourself"
              },
              "location": {
                "type": "object",
                "additionalProperties": true,
                "properties": {
                  "address": {
                    "type": "string",
                    "description": "To add multiple address lines, use \n. For example, 1234 Glücklichkeit Straße\nHinterhaus 5. Etage li."
                  },
                  "postalCode": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "countryCode": {
                    "type": "string",
                    "description": "code as per ISO-3166-1 ALPHA-2, e.g. US, AU, IN"
                  },
                  "region": {
                    "type": "string",
                    "description": "The general region where you live. Can be a US state, or a province, for instance."
                  }
                }
              },
              "profiles": {
                "type": "array",
                "description": "Specify any number of social networks that you participate in",
                "additionalItems": false,
                "items": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "network": {
                      "type": "string",
                      "description": "e.g. Facebook or Twitter"
                    },
                    "username": {
                      "type": "string",
                      "description": "e.g. neutralthoughts"
                    },
                    "url": {
                      "type": "string",
                      "description": "e.g. http://twitter.example.com/neutralthoughts",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "work": {
            "type": "array",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. Facebook"
                },
                "location": {
                  "type": "string",
                  "description": "e.g. Menlo Park, CA"
                },
                "description": {
                  "type": "string",
                  "description": "e.g. Social Media Company"
                },
                "position": {
                  "type": "string",
                  "description": "e.g. Software Engineer"
                },
                "url": {
                  "type": "string",
                  "description": "e.g. http://facebook.example.com",
                  "format": "uri"
                },
                "startDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "endDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "summary": {
                  "type": "string",
                  "description": "Give an overview of your responsibilities at the company"
                },
                "highlights": {
                  "type": "array",
                  "description": "Specify multiple accomplishments",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
                  }
                }
              }
            }
          },
          "volunteer": {
            "type": "array",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "organization": {
                  "type": "string",
                  "description": "e.g. Facebook"
                },
                "position": {
                  "type": "string",
                  "description": "e.g. Software Engineer"
                },
                "url": {
                  "type": "string",
                  "description": "e.g. http://facebook.example.com",
                  "format": "uri"
                },
                "startDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "endDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "summary": {
                  "type": "string",
                  "description": "Give an overview of your responsibilities at the company"
                },
                "highlights": {
                  "type": "array",
                  "description": "Specify accomplishments and achievements",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
                  }
                }
              }
            }
          },
          "education": {
            "type": "array",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "institution": {
                  "type": "string",
                  "description": "e.g. Massachusetts Institute of Technology"
                },
                "url": {
                  "type": "string",
                  "description": "e.g. http://facebook.example.com",
                  "format": "uri"
                },
                "area": {
                  "type": "string",
                  "description": "e.g. Arts"
                },
                "studyType": {
                  "type": "string",
                  "description": "e.g. Bachelor"
                },
                "startDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "endDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "score": {
                  "type": "string",
                  "description": "grade point average, e.g. 3.67/4.0"
                },
                "courses": {
                  "type": "array",
                  "description": "List notable courses/subjects",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. H1302 - Introduction to American history"
                  }
                }
              }
            }
          },
          "awards": {
            "type": "array",
            "description": "Specify any awards you have received throughout your professional career",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "title": {
                  "type": "string",
                  "description": "e.g. One of the 100 greatest minds of the century"
                },
                "date": {
                  "$ref": "#/definitions/iso8601"
                },
                "awarder": {
                  "type": "string",
                  "description": "e.g. Time Magazine"
                },
                "summary": {
                  "type": "string",
                  "description": "e.g. Received for my work with Quantum Physics"
                }
              }
            }
          },
          "certificates": {
            "type": "array",
            "description": "Specify any certificates you have received throughout your professional career",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. Certified Kubernetes Administrator"
                },
                "date": {
                  "type": "string",
                  "description": "e.g. 1989-06-12",
                  "format": "date"
                },
                "url": {
                  "type": "string",
                  "description": "e.g. http://example.com",
                  "format": "uri"
                },
                "issuer": {
                  "type": "string",
                  "description": "e.g. CNCF"
                }
              }
            }
          },
          "publications": {
            "type": "array",
            "description": "Specify your publications through your career",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. The World Wide Web"
                },
                "publisher": {
                  "type": "string",
                  "description": "e.g. IEEE, Computer Magazine"
                },
                "releaseDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "url": {
                  "type": "string",
                  "description": "e.g. http://www.computer.org.example.com/csdl/mags/co/1996/10/rx069-abs.html",
                  "format": "uri"
                },
                "summary": {
                  "type": "string",
                  "description": "Short summary of publication. e.g. Discussion of the World Wide Web, HTTP, HTML."
                }
              }
            }
          },
          "skills": {
            "type": "array",
            "description": "List out your professional skill-set",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. Web Development"
                },
                "level": {
                  "type": "string",
                  "description": "e.g. Master"
                },
                "keywords": {
                  "type": "array",
                  "description": "List some keywords pertaining to this skill",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. HTML"
                  }
                }
              }
            }
          },
          "languages": {
            "type": "array",
            "description": "List any other languages you speak",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "language": {
                  "type": "string",
                  "description": "e.g. English, Spanish"
                },
                "fluency": {
                  "type": "string",
                  "description": "e.g. Fluent, Beginner"
                }
              }
            }
          },
          "interests": {
            "type": "array",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. Philosophy"
                },
                "keywords": {
                  "type": "array",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. Friedrich Nietzsche"
                  }
                }
              }
            }
          },
          "references": {
            "type": "array",
            "description": "List references you have received",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. Timothy Cook"
                },
                "reference": {
                  "type": "string",
                  "description": "e.g. Joe blogs was a great employee, who turned up to work at least once a week. He exceeded my expectations when it came to doing nothing."
                }
              }
            }
          },
          "projects": {
            "type": "array",
            "description": "Specify career projects",
            "additionalItems": false,
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "name": {
                  "type": "string",
                  "description": "e.g. The World Wide Web"
                },
                "description": {
                  "type": "string",
                  "description": "Short summary of project. e.g. Collated works of 2017."
                },
                "highlights": {
                  "type": "array",
                  "description": "Specify multiple features",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. Directs you close but not quite there"
                  }
                },
                "keywords": {
                  "type": "array",
                  "description": "Specify special elements involved",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. AngularJS"
                  }
                },
                "startDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "endDate": {
                  "$ref": "#/definitions/iso8601"
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "e.g. http://www.computer.org/csdl/mags/co/1996/10/rx069-abs.html"
                },
                "roles": {
                  "type": "array",
                  "description": "Specify your role on this project or in company",
                  "additionalItems": false,
                  "items": {
                    "type": "string",
                    "description": "e.g. Team Lead, Speaker, Writer"
                  }
                },
                "entity": {
                  "type": "string",
                  "description": "Specify the relevant company/entity affiliations e.g. 'greenpeace', 'corporationXYZ'"
                },
                "type": {
                  "type": "string",
                  "description": " e.g. 'volunteering', 'presentation', 'talk', 'application', 'conference'"
                }
              }
            }
          },
          "meta": {
            "type": "object",
            "description": "The schema version and any other tooling configuration lives here",
            "additionalProperties": true,
            "properties": {
              "canonical": {
                "type": "string",
                "description": "URL (as per RFC 3986) to latest version of this document",
                "format": "uri"
              },
              "version": {
                "type": "string",
                "description": "A version field which follows semver - e.g. v1.0.0"
              },
              "lastModified": {
                "type": "string",
                "description": "Using ISO 8601 with YYYY-MM-DDThh:mm:ss"
              }
            }
          }
        },
        "title": "Resume Schema",
        "type": "object",
        "$id": "https://robertdelanghe.dev/api/v1/schemas/jsonresume.schema.json"
      },
      "Corpus": {
        "title": "robertdelanghe.dev site data contract",
        "description": "The single source of truth the site renders from. fetch.mjs produces it (network); build.mjs consumes it (pure). Drift from this shape fails the build.",
        "type": "object",
        "required": [
          "generatedAt",
          "owner",
          "stats",
          "highlights"
        ],
        "additionalProperties": false,
        "properties": {
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "owner": {
            "type": "object",
            "required": [
              "login",
              "name"
            ],
            "additionalProperties": true,
            "properties": {
              "login": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "stats": {
            "type": "object",
            "description": "Aggregate meta-analysis over the WHOLE corpus (public + private). No private names ever appear here.",
            "required": [
              "repos",
              "public",
              "private",
              "sources",
              "forks",
              "languages",
              "tagged",
              "topics"
            ],
            "additionalProperties": false,
            "properties": {
              "repos": {
                "type": "integer"
              },
              "public": {
                "type": "integer"
              },
              "private": {
                "type": "integer"
              },
              "sources": {
                "type": "integer"
              },
              "forks": {
                "type": "integer"
              },
              "tagged": {
                "type": "integer",
                "description": "public source repos with >= 1 topic"
              },
              "languages": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                },
                "description": "primary-language tally over PUBLIC sources only — rendered as receipt-links, so each count must be reproducible by a public GitHub query"
              },
              "topics": {
                "type": "array",
                "description": "topic vocabulary in use across public repos, with counts",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "publicSources": {
                "type": "integer",
                "description": "public, non-fork repos — the verifiable slice the homepage Public record section renders (optional until the first post-change refresh lands)"
              },
              "byOwner": {
                "type": "array",
                "description": "public-source count per owner (personal vs. org), each reproducible at that owner's `user:<owner>` search — drives the second Public-record figure. Optional until the first post-change refresh lands.",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "highlights": {
            "type": "array",
            "description": "Curated, PUBLIC, non-fork projects to show. Clean subset, not everything.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "fullName",
                "url",
                "description"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "fullName": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "description": {
                  "type": "string"
                },
                "language": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "stars": {
                  "type": "integer"
                },
                "pinned": {
                  "type": "boolean"
                },
                "topics": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "interests": {
            "type": "object",
            "description": "Interest graph — the projects the owner STARS (not authored work). Same shape as the corpus so /interests renders the identical record→filter interface. Optional: absent until a refresh with star access lands, in which case /interests shows a pending state.",
            "additionalProperties": false,
            "required": [
              "count",
              "items"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "description": "total public starred repos"
              },
              "shown": {
                "type": "integer",
                "description": "how many of them are rendered as cards (top-starred slice)"
              },
              "languages": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "topics": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "count"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "fullName",
                    "url"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "fullName": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "description": {
                      "type": "string"
                    },
                    "language": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "stars": {
                      "type": "integer"
                    },
                    "topics": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "PostFrontmatter": {
        "title": "post / frontmatter contract",
        "description": "The standard every blog post is held to. build.mjs validates each posts/*.md frontmatter against this; a post that doesn't conform can't build — the same invalid-states-unrepresentable boundary the rest of the site uses.",
        "type": "object",
        "required": [
          "title",
          "date",
          "description"
        ],
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "description": "post h1 / feed title / og:title"
          },
          "date": {
            "type": "string",
            "description": "ISO date YYYY-MM-DD — published date, drives feed + sort order"
          },
          "description": {
            "type": "string",
            "description": "one line, kept ≤160 chars — meta description, index blurb, feed summary"
          },
          "slug": {
            "type": "string",
            "description": "URL slug; defaults to the filename"
          },
          "type": {
            "type": "string",
            "enum": [
              "post"
            ],
            "description": "vault discriminator; optional here so vault drafts copy in unchanged"
          },
          "target": {
            "type": "string",
            "enum": [
              "dev",
              "bounded-tools"
            ],
            "description": "publish destination/voice from the vault. This site renders only 'dev' (or absent); 'bounded-tools' is skipped."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "topic tags — keywords + h-entry categories"
          },
          "syndication": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "POSSE: URLs where this post was syndicated (Medium, dev.to, Mastodon…); rendered as u-syndication backlinks"
          }
        }
      },
      "ResumeCredential": {
        "type": "object",
        "required": [
          "@context",
          "type",
          "issuer",
          "credentialSubject"
        ],
        "properties": {
          "@context": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "id": {
            "type": "string",
            "format": "uri"
          },
          "type": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "issuer": {
            "type": "string"
          },
          "validFrom": {
            "type": "string"
          },
          "credentialSubject": {
            "$ref": "#/components/schemas/JsonResume"
          }
        }
      }
    }
  }
}
