{
 "schema": "cain42.top25.broker.evolution.v1",
 "date": "2026-11-02",
 "who": "FIRME AI CORPORATION (self-run, NOT independent)",
 "live_status": "fixed in the repository and tested; the public /broker-keystone routes serve the fix after the next gateway deploy. Until then the live demo is affected by findings 1 and 2 (demo audience only).",
 "findings": [
  {
   "id": "F1",
   "what": "single use defeated by attenuation: attenuate(parent) with no change mints a fresh credential for the identical action; parent + 3 clones = 4 uses",
   "before": "4 of 4 accepted",
   "after": "parent accepted, 3 clones refused (replayed): parent and children share one use (root_jti)"
  },
  {
   "id": "F2",
   "what": "approval bypass: a person-approved DELETE /invoices/INV-9 could be narrowed to DELETE /invoices/INV-9/lines with any body, and the parent stayed usable",
   "before": "accepted",
   "after": "refused (attenuation_widens); an approved credential can only be repeated exactly, once"
  },
  {
   "id": "F3",
   "what": "any credential could be narrowed to any deeper path, e.g. /orders/A-1 -> /orders/A-1/x, with any body",
   "before": "accepted",
   "after": "only a collection credential (path ends in '/', no body, no approval) narrows to one bodiless member"
  },
  {
   "id": "F4",
   "what": "paths servers interpret differently were minted: '/orders/..;/admin' (Tomcat reads '..;' as '..'), '%252e' double encoding, full-width dots, ';' path parameters, CR/LF and tab",
   "before": "ALLOW",
   "after": "DENY at mint, refused at verify, and refused by the downloadable verifier"
  }
 ],
 "kept": [
  "shared replay store across both gateway instances (SQLite, WAL)",
  "exact method/path/body binding",
  "EdDSA only with the published kid",
  "approval single use"
 ],
 "tests": "tests/test_broker_keystone.py 28 (12 new) + test_approval_keystone 9 + test_governor_keystone 16 passed"
}