{
 "schema": "axion-changes/1",
 "site": "nycticketfacts.com",
 "generated": "2026-09-21",
 "checked": "2026-08-31",
 "items": [
  {
   "date": "2026-09-21",
   "path": "/llms.txt",
   "what": "The priced door at /api/bulk can now take money: /api/bulk still answers HTTP 402, but when a checkout link is configured its x402 accepts array carries one entry (scheme axion-prepaid-credit/v1, network stripe-payment-link) and /api/key/success exchanges a verified checkout session for an API key. With no link configured the door answers exactly the dormant 402 it always has, accepts empty",
   "kind": "shape"
  },
  {
   "date": "2026-09-21",
   "path": "/llms.txt",
   "what": "The /api/bulk price moves to USD 25, the figure the estate registry now carries for this door and the same figure the sibling health-claims door charges for a whole-corpus pull; llms.txt, the 402 envelope, the passport and /openapi.json all read the one constant",
   "kind": "data",
   "field": "pricing./api/bulk.price_usd",
   "value": "25",
   "superseded_value": "5",
   "retired": "2026-09-21",
   "source": "https://nycticketfacts.com/.well-known/agent-door.json",
   "fixity": "sha256-530fe5e34e28d96d4da46c243f081b58ecf45061bc0959e1234f9b91c4998408"
  },
  {
   "date": "2026-09-06",
   "path": "/llms.txt",
   "what": "The dormant /api/bulk price on this site now reads the registry's figure (USD 5) — llms.txt and the live 402 envelope had said USD 9 while the passport said 5; one constant (src/premium.js BULK_PRICE_USD) feeds all three",
   "kind": "data",
   "field": "pricing./api/bulk.price_usd",
   "value": "5",
   "superseded_value": "9",
   "retired": "2026-09-06",
   "source": "https://nycticketfacts.com/.well-known/agent-door.json",
   "fixity": "sha256-530fe5e34e28d96d4da46c243f081b58ecf45061bc0959e1234f9b91c4998408"
  },
  {
   "date": "2026-09-06",
   "path": "/",
   "what": "Markdown negotiation: `Accept: text/markdown` (q >= text/html's, or html absent) on /, /violations, /violations/{slug}, /boroughs, /fight-a-ticket, /payment-plan and /lost-what-now returns text/markdown rendered from the same data as the HTML (YAML frontmatter = the cite object; rates, counts, source file and stamp, sources with URLs); Vary: Accept on both variants; own ETag/304; x-markdown-tokens = ceil(utf-8 bytes / 4); content-signal header = the robots.txt policy. Pages without a data model stay HTML",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/",
   "what": "WebMCP: the homepage registers one browser tool, nycticketfacts_violations (description = the /openapi.json summary of GET /api/violations, empty input schema, execute = fetch the real /api/violations), guarded on navigator.modelContext — browsers without the API see no change",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/",
   "what": "Agent readiness wave A: RFC 8288 Link headers on / and every machine surface (api-catalog, service-desc, service-doc, describedby, ard)",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/.well-known/api-catalog",
   "what": "Added the RFC 9727 API catalog (application/linkset+json): service-desc /openapi.json, service-doc /for-agents, status /changes.json, one item per free endpoint",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/robots.txt",
   "what": "Added `Content-Signal: search=yes, ai-input=yes, ai-train=no` inside the existing group; every prior line byte-identical",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/auth.md",
   "what": "Added /auth.md: free tier needs no registration; no OAuth server here (those .well-known documents stay 404 on purpose); paid doors sold by key via hello@getaxionlabs.com",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/.well-known/mcp/server-card.json",
   "what": "Added the MCP server card (SEP-2127 shape) pointing at the Axion gateway and the zone MCP, naming the three tools that read this door",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/.well-known/agent-skills/index.json",
   "what": "Added the Agent Skills Discovery index (v0.2.0) with one skill-md entry, /skills/nycticketfacts-lookup.md, digest = sha256 of the served bytes",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/.well-known/ai-catalog.json",
   "what": "Added the ARD manifest (entries for /openapi.json, /llms.txt and the MCP server card, each with representative queries from the door's own question set); the same document at /.well-known/ard.json",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/api/violations",
   "what": "Dataset fixity v1.3: the cite object gains `dataset` {version = the stamp, fixity = sha256 over the served data files}; the same sha on the passport (`last_verified.fixity`), /openapi.json (`info.x-dataset-fixity`) and every `data` item here from this date (`fixity`)",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/api/violations",
   "what": "Signed answer receipts v1: every response carries a detached Ed25519 `receipt` (last field) with a `policy` line; public key at /.well-known/answer-key, verifier at /api/verify-receipt; the ETag of a signed body is the receipt's payload hash prefix",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/api/violations",
   "what": "Added `notice` field (free with attribution; integrator contact) after the citation object",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/changes.json",
   "what": "Added /changes.json (axion-changes/1), /changes.atom and /openapi.json; ETag, Last-Modified and 304 on every machine surface",
   "kind": "shape"
  },
  {
   "date": "2026-09-06",
   "path": "/llms.txt",
   "what": "Added dated `Checked` line, derived from the passport's dataset stamp",
   "kind": "shape"
  },
  {
   "date": "2026-09-05",
   "path": "/api/violations",
   "what": "Added the citation object (axion-cite/v1): top-level `cite` and a Link: <canonical> header on every JSON door",
   "kind": "shape"
  },
  {
   "date": "2026-09-05",
   "path": "/fight-a-ticket",
   "what": "New page: is it worth fighting an NYC ticket, in the city's own hearing numbers",
   "kind": "page"
  },
  {
   "date": "2026-09-05",
   "path": "/payment-plan",
   "what": "New page: the city's payment plan for judgment debt, terms named at source",
   "kind": "page"
  },
  {
   "date": "2026-09-05",
   "path": "/lost-what-now",
   "what": "New page: appealing a lost hearing — the 30-day Appeals Board route",
   "kind": "page"
  },
  {
   "date": "2026-09-04",
   "path": "/methodology",
   "what": "Dataset row count re-sourced from the dataset's own count(1) query (the earlier figure was an understatement, remembered rather than fetched)",
   "kind": "data",
   "field": "dataset.rows",
   "value": "150,350,834",
   "superseded_value": "119.8 million",
   "retired": "2026-09-04",
   "source": "https://data.cityofnewyork.us/resource/nc67-uf89.json?$select=count(1)"
  },
  {
   "date": "2026-08-31",
   "path": "/api/violations",
   "what": "Hearing-outcome rates recomputed from NYC Open Data nc67-uf89 (dataset stamp 2026-08-31)",
   "source": "https://data.cityofnewyork.us/City-Government/Open-Parking-and-Camera-Violations/nc67-uf89",
   "kind": "data",
   "fixity": "sha256-530fe5e34e28d96d4da46c243f081b58ecf45061bc0959e1234f9b91c4998408"
  }
 ]
}