{
  "name": "AcuiQ conformance register",
  "version": "1.0",
  "published": "2026-09-05",
  "measuredAt": "2026-09-05T14:41:31.652Z",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "Source: AcuiQ (https://acuiq.com), CC BY 4.0",
  "description": "Every norm AcuiQ holds its own corpus to, with the authority each derives from and the share of the eligible corpus that deviates. Rates, not counts: each rule declares its own denominator, and both are published. Measured against the live database on 2026-09-05.",
  "article": "https://acuiq.com/wiki/research/conformance",
  "corpus": {
    "symptoms": 14240,
    "canonicalConcepts": 11074,
    "treatments": 6170,
    "protocols": 5468,
    "protocolTreatments": 29976
  },
  "schema": {
    "id": "stable rule slug, area/norm",
    "kind": "internal | documentary | empirical – what evidence may move the rule",
    "norm": "what must be true, stated positively",
    "violation": "what a counted row means",
    "authority": "where the norm comes from, and when a human last read it",
    "independence": "empirical rules only: how independence of sources is established, and the ceiling of that proxy",
    "owner": "the module holding the matching logic",
    "stage": "ingest | audit | both",
    "fix": "the script that closes it, or null where closing it is a judgement",
    "denominator": "the eligible set the rate is taken over",
    "eligible": "size of that set; null where the rule could not be measured this run",
    "violations": "rows deviating",
    "rate": "violations / eligible, as a percentage",
    "note": "measurement detail worth carrying with the number",
    "detail": "structured breakdown behind the rate, where one exists"
  },
  "rules": [
    {
      "id": "warnings/self-contradiction",
      "kind": "internal",
      "norm": "A treatment does not caution against a condition it is indicated for.",
      "violation": "Treatment rows rendering a warning and an indication that name the same condition.",
      "authority": {
        "label": "Internal consistency — lib/contraindications.mjs",
        "checked": "2026-08-28"
      },
      "independence": null,
      "owner": "lib/contraindications.mjs",
      "stage": "audit",
      "fix": "reconcile-warnings.mjs --apply",
      "denominator": "Treatment rows carrying any warnings text",
      "eligible": 6156,
      "violations": 41,
      "rate": 0.666,
      "note": null,
      "detail": null
    },
    {
      "id": "warnings/protocol-conflict",
      "kind": "internal",
      "norm": "A protocol does not prescribe a point whose caution names what the protocol treats.",
      "violation": "Protocols carrying at least one such point.",
      "authority": {
        "label": "Internal consistency — lib/contraindications.mjs",
        "checked": "2026-08-28"
      },
      "independence": null,
      "owner": "lib/contraindications.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Protocols with at least one symptom and at least one warned treatment",
      "eligible": 5462,
      "violations": 24,
      "rate": 0.439,
      "note": null,
      "detail": null
    },
    {
      "id": "warnings/pregnancy-gestational",
      "kind": "internal",
      "norm": "A point forbidden in pregnancy is not prescribed for a pregnancy meant to continue.",
      "violation": "Gestational uses only. At-term and induction uses are the intended use of the forbidden points and are excluded by lib/contraindications.mjs, not counted here.",
      "authority": {
        "label": "Classical forbidden points, as split in lib/contraindications.mjs",
        "checked": "2026-08-28"
      },
      "independence": null,
      "owner": "lib/contraindications.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Protocols with at least one symptom and at least one warned treatment",
      "eligible": 5462,
      "violations": 35,
      "rate": 0.641,
      "note": "13 at-term uses excluded as intended",
      "detail": null
    },
    {
      "id": "indications/inverted",
      "kind": "internal",
      "norm": "A contraindication is never filed as a symptom the treatment addresses.",
      "violation": "Indication links whose symptom name is contraindication text — the safety datum inverted rather than dropped.",
      "authority": {
        "label": "Internal consistency — lib/contraindications.mjs",
        "checked": "2026-08-28"
      },
      "independence": null,
      "owner": "lib/contraindications.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Treatment-to-symptom indication links",
      "eligible": 39813,
      "violations": 0,
      "rate": 0,
      "note": null,
      "detail": null
    },
    {
      "id": "treatment/single-safety-profile",
      "kind": "internal",
      "norm": "One code carries one safety text.",
      "violation": "Rows shadowed by a same-code sibling. sync-protocols builds its lookup as a Map, so the last row silently wins and the other safety text is never served.",
      "authority": {
        "label": "Internal consistency — one key, one row",
        "checked": "2026-08-28"
      },
      "independence": null,
      "owner": "audit-db.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Treatment rows",
      "eligible": 6170,
      "violations": 147,
      "rate": 2.382,
      "note": "67 colliding codes",
      "detail": null
    },
    {
      "id": "points/code-resolves",
      "kind": "documentary",
      "norm": "Every stored point reference resolves to a catalogue row.",
      "violation": "References with no Treatment row. sync drops these silently and the protocol still lands, one needle thinner — the failure is invisible at read time, which is why it is measured here.",
      "authority": {
        "label": "WHO Standard Acupuncture Point Locations (2008), GB/T 12346, and the AcuiQ naming sheet",
        "url": "https://iris.who.int/handle/10665/353407",
        "checked": "2026-07-26"
      },
      "independence": null,
      "owner": "lib/normalize.mjs",
      "stage": "both",
      "fix": "fix-point-codes.mjs --execute",
      "denominator": "Point references across all stored protocols",
      "eligible": 30043,
      "violations": 58,
      "rate": 0.193,
      "note": "19 distinct: xb02×24 ashi×8 x01×5 x02×2 ex01×2",
      "detail": null
    },
    {
      "id": "points/protocol-has-treatments",
      "kind": "documentary",
      "norm": "A protocol reaching the matcher prescribes at least one point.",
      "violation": "Phantom protocols — every code unresolved, so the row synced with zero treatments and renders as a card with nothing to draw.",
      "authority": {
        "label": "WHO Standard Acupuncture Point Locations (2008), via the catalogue",
        "url": "https://iris.who.int/handle/10665/353407",
        "checked": "2026-07-26"
      },
      "independence": null,
      "owner": "check-extraction.mjs",
      "stage": "both",
      "fix": "prune-phantom-protocols.mjs --apply",
      "denominator": "Protocol rows",
      "eligible": 5468,
      "violations": 0,
      "rate": 0,
      "note": null,
      "detail": null
    },
    {
      "id": "herbs/binomial-unambiguous",
      "kind": "documentary",
      "norm": "A Latin binomial identifies exactly one catalogue row.",
      "violation": "Binomials carrying more than one row. A duplicated key cannot be linked without picking a row, and picking one publishes a shadowing bug with a citation attached — so herbs.mjs resolves these to AMBIGUOUS and links nothing.",
      "authority": {
        "label": "Binomial as the species key — Pharmacopoeia of the PRC; World Flora Online for authority",
        "url": "https://www.worldfloraonline.org/",
        "checked": "2026-09-02"
      },
      "independence": null,
      "owner": "lib/herbs.mjs",
      "stage": "ingest",
      "fix": null,
      "denominator": "Distinct herb binomials in the catalogue",
      "eligible": 4001,
      "violations": 751,
      "rate": 18.77,
      "note": "blocks the herb pipeline, not a data error to prune",
      "detail": null
    },
    {
      "id": "sources/verifiable-identifier",
      "kind": "documentary",
      "norm": "Every protocol cites a resolvable identifier, not a citation string.",
      "violation": "Refs that are prose citations — mostly CNKI, which no public resolver dereferences. The protocol may be sound; nobody outside can check it.",
      "authority": {
        "label": "ICMJE recommendations on references; DOI as the resolvable form",
        "url": "https://www.icmje.org/recommendations/",
        "checked": "2026-09-05"
      },
      "independence": null,
      "owner": "audit-db.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Protocols carrying any ref",
      "eligible": 5466,
      "violations": 1260,
      "rate": 23.052,
      "note": null,
      "detail": null
    },
    {
      "id": "sources/human-subjects",
      "kind": "documentary",
      "norm": "Every protocol comes from human clinical evidence.",
      "violation": "Sources whose cached title or abstract classifies as animal research. A prescription validated in a rat carries no point-selection meaning for a person.",
      "authority": {
        "label": "AcuiQ editorial policy — CLAUDE.md, \"Human evidence only\"",
        "checked": "2026-08-02"
      },
      "independence": null,
      "owner": "lib/species.mjs",
      "stage": "both",
      "fix": "prune-animal-protocols.mjs --apply",
      "denominator": "Protocols whose ref resolves in the species metadata cache",
      "eligible": 1536,
      "violations": 2,
      "rate": 0.13,
      "note": "2073 refs unresolved in cache",
      "detail": null
    },
    {
      "id": "evidence/independent-corroboration",
      "kind": "empirical",
      "norm": "A symptom AcuiQ answers rests on more than one independent source.",
      "violation": "Concepts whose whole protocol set traces to a single ref. The page still shows a protocol count, and that count is not corroboration.",
      "authority": {
        "label": "Convergence across independent sources, not a published point list. No standards body asserts which points treat which condition, and one that did without trials behind it would be the weaker claim.",
        "checked": "2026-09-05"
      },
      "independence": "Distinct Protocol.ref, which is fan-out-proof by construction: 252 rows from one paper are one ref (see lib/fanout.mjs), so counting refs is what counting rows cannot do. The ceiling is real and must be stated wherever this is published — a DOI is a publication, not an independent group. The same authors publishing twice, and a trial reprinted in a second journal, both read as two here. Tightening it needs author and affiliation from the metadata cache; until then this is an upper bound on corroboration, never a floor.",
      "owner": "lib/fanout.mjs",
      "stage": "audit",
      "fix": null,
      "denominator": "Canonical concepts carrying at least one protocol",
      "eligible": 4537,
      "violations": 3053,
      "rate": 67.291,
      "note": "1.28 protocol rows per distinct source",
      "detail": {
        "singleSourceByKind": {
          "text": {
            "concepts": 683,
            "protocolRows": 771
          },
          "web": {
            "concepts": 195,
            "protocolRows": 679
          },
          "trial": {
            "concepts": 2175,
            "protocolRows": 2581
          }
        },
        "topWebSources": [
          {
            "url": "https://www.sacredlotus.com/go/acupuncture/get/acupuncture-point-prescriptions",
            "concepts": 192,
            "protocolRows": 673
          },
          {
            "url": "http://www.acupuncturecourse.org/chairman_article3.php",
            "concepts": 1,
            "protocolRows": 4
          },
          {
            "url": "https://www.flashcardmachine.com/gio-point-prescriptions.html",
            "concepts": 1,
            "protocolRows": 1
          },
          {
            "url": "https://www.studystack.com/flashcard-973599",
            "concepts": 1,
            "protocolRows": 1
          }
        ]
      }
    }
  ]
}
