{
  "code": null,
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-canonicalization",
  "id": "canonicalization",
  "kind": "technique",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-contracts-core",
    "json": "https://banes-lab.com/json/records/layer/contracts-core",
    "label": "Contracts Core",
    "markdown": "https://banes-lab.com/records/layer/contracts-core.md",
    "ref": "layer:contracts-core"
  },
  "name": "Canonicalization",
  "ref": "architecture:canonicalization",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-canonical-format",
          "json": "https://banes-lab.com/json/records/lexicon/canonical-format",
          "label": "Canonical Format",
          "markdown": "https://banes-lab.com/records/lexicon/canonical-format.md",
          "ref": "lexicon:canonical-format"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-validation",
          "json": "https://banes-lab.com/json/records/architecture/validation",
          "label": "Validation",
          "markdown": "https://banes-lab.com/records/architecture/validation.md",
          "ref": "architecture:validation"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-deduplication",
          "json": "https://banes-lab.com/json/records/lexicon/deduplication",
          "label": "Deduplication",
          "markdown": "https://banes-lab.com/records/lexicon/deduplication.md",
          "ref": "lexicon:deduplication"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-idempotency",
          "json": "https://banes-lab.com/json/records/architecture/idempotency",
          "label": "Idempotency",
          "markdown": "https://banes-lab.com/records/architecture/idempotency.md",
          "ref": "architecture:idempotency"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-security-checks",
          "json": "https://banes-lab.com/json/records/lexicon/security-checks",
          "label": "Security Checks",
          "markdown": "https://banes-lab.com/records/lexicon/security-checks.md",
          "ref": "lexicon:security-checks"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-ambiguous-encoding",
          "json": "https://banes-lab.com/json/records/lexicon/ambiguous-encoding",
          "label": "Ambiguous Encoding",
          "markdown": "https://banes-lab.com/records/lexicon/ambiguous-encoding.md",
          "ref": "lexicon:ambiguous-encoding"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-lossless-preservation",
          "json": "https://banes-lab.com/json/records/lexicon/lossless-preservation",
          "label": "Lossless Preservation",
          "markdown": "https://banes-lab.com/records/lexicon/lossless-preservation.md",
          "ref": "lexicon:lossless-preservation"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-canonicalization-lossless-preservation",
          "json": "https://banes-lab.com/json/records/tension/canonicalization-lossless-preservation",
          "label": "Canonicalization / Lossless Preservation",
          "markdown": "https://banes-lab.com/records/tension/canonicalization-lossless-preservation.md",
          "ref": "tension:canonicalization-lossless-preservation"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-ambiguous-encoding",
          "json": "https://banes-lab.com/json/records/lexicon/ambiguous-encoding",
          "label": "Ambiguous Encoding",
          "markdown": "https://banes-lab.com/records/lexicon/ambiguous-encoding.md",
          "ref": "lexicon:ambiguous-encoding"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-recommended",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-recommended",
          "label": "recommended",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-recommended.md",
          "ref": "vocabulary:severity-recommended"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-schema-canonical-data-semantics",
          "json": "https://banes-lab.com/json/records/architecture-category/schema-canonical-data-semantics",
          "label": "Schema / Canonical Data / Semantics",
          "markdown": "https://banes-lab.com/records/architecture-category/schema-canonical-data-semantics.md",
          "ref": "architecture-category:schema-canonical-data-semantics"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-null-semantics-drift",
          "json": "https://banes-lab.com/json/records/architecture/null-semantics-drift",
          "label": "Null Semantics Drift",
          "markdown": "https://banes-lab.com/records/architecture/null-semantics-drift.md",
          "ref": "architecture:null-semantics-drift"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-platform-independence",
          "json": "https://banes-lab.com/json/records/architecture/platform-independence",
          "label": "Platform Independence",
          "markdown": "https://banes-lab.com/records/architecture/platform-independence.md",
          "ref": "architecture:platform-independence"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-robustness-principle",
          "json": "https://banes-lab.com/json/records/architecture/robustness-principle",
          "label": "Robustness Principle",
          "markdown": "https://banes-lab.com/records/architecture/robustness-principle.md",
          "ref": "architecture:robustness-principle"
        }
      ],
      "relation": "refactors"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-anti-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-anti-patterns",
          "label": "Anti-patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-anti-patterns.md",
          "ref": "chapter:/ontology#architecture-category-anti-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-correctness-determinism-verification",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-correctness-determinism-verification",
          "label": "Correctness / Determinism / Verification",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-correctness-determinism-verification.md",
          "ref": "chapter:/ontology#architecture-category-correctness-determinism-verification"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-portability-infrastructure-deployment",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-portability-infrastructure-deployment",
          "label": "Portability / Infrastructure / Deployment",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-portability-infrastructure-deployment.md",
          "ref": "chapter:/ontology#architecture-category-portability-infrastructure-deployment"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-error-handling-resilience",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-error-handling-resilience",
          "label": "Error Handling / Resilience",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-error-handling-resilience.md",
          "ref": "chapter:/ontology#architecture-category-error-handling-resilience"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-transactions-state-concurrency",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-transactions-state-concurrency",
          "label": "Transactions / State / Concurrency",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-transactions-state-concurrency.md",
          "ref": "chapter:/ontology#architecture-category-transactions-state-concurrency"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-schema-canonical-data-semantics",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-schema-canonical-data-semantics",
          "label": "Schema / Canonical Data / Semantics",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-schema-canonical-data-semantics.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-schema-canonical-data-semantics"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "summary": "A technique for converting equivalent values to one normal form before they are compared, stored or checked.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-single-source-of-truth",
      "json": "https://banes-lab.com/json/records/architecture/single-source-of-truth",
      "label": "Single Source of Truth",
      "markdown": "https://banes-lab.com/records/architecture/single-source-of-truth.md",
      "ref": "architecture:single-source-of-truth"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-canonical-schema",
      "json": "https://banes-lab.com/json/records/architecture/canonical-schema",
      "label": "Canonical Schema",
      "markdown": "https://banes-lab.com/records/architecture/canonical-schema.md",
      "ref": "architecture:canonical-schema"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [],
  "exemplar": {
    "after": "function canonicalFooKey(value: string) { return value.trim().normalize(\"NFKC\").toLowerCase(); }\nconst map = new Map(keys.map(key => [canonicalFooKey(key), loadFoo(canonicalFooKey(key))]));",
    "before": "const keys = [\"Foo\", \" foo \", \"FOO\"];\nconst map = new Map(keys.map(key => [key, loadFoo(key)]));",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "input",
    "data",
    "security"
  ],
  "severity": "recommended"
}
