{
  "lang": "en",
  "model": {
    "dir": "Sales.SemanticModel",
    "tables": 4,
    "measures": 7,
    "relationships": 3
  },
  "verdict": {
    "level": "not-ready",
    "ruleIds": [
      "FC-LIS-01",
      "FC-IA-01",
      "FC-IA-03"
    ]
  },
  "score": {
    "LIS": 81,
    "COH": 95,
    "STR": 86,
    "IA": 56,
    "global": 77
  },
  "facts": {
    "validated": 1,
    "measures": 7
  },
  "rules": [
    {
      "id": "FC-LIS-01",
      "title": "Visible measure without a description",
      "family": "LIS",
      "severity": "blocking",
      "examined": 7,
      "findings": 3
    },
    {
      "id": "FC-LIS-02",
      "title": "Description that says nothing",
      "family": "LIS",
      "severity": "important",
      "examined": 4,
      "findings": 1
    },
    {
      "id": "FC-LIS-03",
      "title": "Cryptic name on a visible object",
      "family": "LIS",
      "severity": "important",
      "examined": 25,
      "findings": 1
    },
    {
      "id": "FC-LIS-04",
      "title": "Visible copy or obsolete object",
      "family": "LIS",
      "severity": "important",
      "examined": 25,
      "findings": 0
    },
    {
      "id": "FC-LIS-05",
      "title": "Visible technical column",
      "family": "LIS",
      "severity": "minor",
      "examined": 14,
      "findings": 2
    },
    {
      "id": "FC-LIS-06",
      "title": "Visible measure without a format",
      "family": "LIS",
      "severity": "minor",
      "examined": 7,
      "findings": 0
    },
    {
      "id": "FC-COH-01",
      "title": "Two measures with the same DAX",
      "family": "COH",
      "severity": "important",
      "examined": 7,
      "findings": 1
    },
    {
      "id": "FC-COH-03",
      "title": "Measure and column with the same name",
      "family": "COH",
      "severity": "important",
      "examined": 7,
      "findings": 0
    },
    {
      "id": "FC-COH-04",
      "title": "Same generic column name in several tables",
      "family": "COH",
      "severity": "important",
      "examined": 14,
      "findings": 0
    },
    {
      "id": "FC-STR-01",
      "title": "Bidirectional relationship",
      "family": "STR",
      "severity": "important",
      "examined": 3,
      "findings": 1
    },
    {
      "id": "FC-STR-02",
      "title": "Missing or automatic date table",
      "family": "STR",
      "severity": "important",
      "examined": 5,
      "findings": 1
    },
    {
      "id": "FC-STR-03",
      "title": "Several filter paths between two tables",
      "family": "STR",
      "severity": "blocking",
      "examined": 3,
      "findings": 0
    },
    {
      "id": "FC-STR-04",
      "title": "Calculated column that aggregates",
      "family": "STR",
      "severity": "important",
      "examined": 0,
      "findings": 0
    },
    {
      "id": "FC-STR-05",
      "title": "Visible table with no relationship",
      "family": "STR",
      "severity": "minor",
      "examined": 4,
      "findings": 0
    },
    {
      "id": "FC-IA-01",
      "title": "Implicit measures allowed",
      "family": "IA",
      "severity": "blocking",
      "examined": 8,
      "findings": 2
    },
    {
      "id": "FC-IA-03",
      "title": "Stale validation",
      "family": "IA",
      "severity": "blocking",
      "examined": 3,
      "findings": 2
    },
    {
      "id": "FC-IA-04",
      "title": "AI instructions missing",
      "family": "IA",
      "severity": "important",
      "examined": 1,
      "findings": 1
    },
    {
      "id": "FC-IA-06",
      "title": "No figure defined",
      "family": "IA",
      "severity": "blocking",
      "examined": 1,
      "findings": 0
    }
  ],
  "findings": [
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Turnover"
      },
      "cited": null,
      "message": "The measure “Turnover” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "KPI_Basket_02"
      },
      "cited": null,
      "message": "The measure “KPI_Basket_02” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Order Count"
      },
      "cited": null,
      "message": "The measure “Order Count” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-02",
      "severity": "important",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Revenue"
      },
      "cited": null,
      "message": "The description of the measure “Revenue” (table Sales) says nothing: it is 1 word long. An AI takes it for an explanation, and still guesses what the measure computes.",
      "fix": {
        "proposal": "Rewrite the `///` description: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-03",
      "severity": "important",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "KPI_Basket_02"
      },
      "cited": null,
      "message": "The measure “KPI_Basket_02” (table Sales) has a cryptic name (coding prefix “KPI_”): no question asked in plain language will lead an AI to it.",
      "fix": {
        "proposal": "Rename it “Basket 02”, to be reworded in the business's vocabulary; write in the AI instructions that “KPI_Basket_02” is its former name, for the questions that still use it.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-05",
      "severity": "minor",
      "target": {
        "kind": "column",
        "table": "Sales",
        "column": "Product ID"
      },
      "cited": [
        {
          "kind": "relationship",
          "from": {
            "table": "Sales",
            "column": "Product ID"
          },
          "to": {
            "table": "Product",
            "column": "Product ID"
          }
        }
      ],
      "message": "The column “Product ID” (table Sales) is a visible technical column: its name makes it a key; it holds the “many” side of the relationship Sales[Product ID] → Product[Product ID]: filtering goes through the table Product. An AI may offer it as an axis of analysis.",
      "fix": {
        "proposal": "Hide the column (`isHidden`): relationships and sorts keep using it.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-05",
      "severity": "minor",
      "target": {
        "kind": "column",
        "table": "Sales",
        "column": "Customer ID"
      },
      "cited": [
        {
          "kind": "relationship",
          "from": {
            "table": "Sales",
            "column": "Customer ID"
          },
          "to": {
            "table": "Customer",
            "column": "Customer ID"
          }
        }
      ],
      "message": "The column “Customer ID” (table Sales) is a visible technical column: its name makes it a key; it holds the “many” side of the relationship Sales[Customer ID] → Customer[Customer ID]: filtering goes through the table Customer. An AI may offer it as an axis of analysis.",
      "fix": {
        "proposal": "Hide the column (`isHidden`): relationships and sorts keep using it.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-COH-01",
      "severity": "important",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Turnover"
      },
      "cited": [
        {
          "kind": "measure",
          "table": "Sales",
          "measure": "Net Sales"
        }
      ],
      "message": "The measure “Turnover” (table Sales) duplicates “Net Sales” (table Sales): same DAX, apart from spaces, case and comments. An AI hesitates between the two, and they will drift apart as soon as only one of them changes.",
      "fix": {
        "proposal": "First check with the business that the two names mean the same figure. If they do, keep a single calculation: replace the DAX of “Turnover” with `[Net Sales]`, or delete “Turnover” if nothing uses it; hiding it is not enough, the measures that reference it still read it. If they do not, one of the two calculations is wrong: correct it.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-STR-01",
      "severity": "important",
      "target": {
        "kind": "relationship",
        "from": {
          "table": "Sales",
          "column": "Customer ID"
        },
        "to": {
          "table": "Customer",
          "column": "Customer ID"
        }
      },
      "cited": null,
      "message": "The relationship Sales[Customer ID] → Customer[Customer ID] filters in both directions: depending on the filter path an AI takes, the same number can change.",
      "fix": {
        "proposal": "Make the relationship filter in one direction (`crossFilteringBehavior: oneDirection`), or write down why both directions are needed.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-STR-02",
      "severity": "important",
      "target": {
        "kind": "model"
      },
      "cited": null,
      "message": "No table is marked as a date table: an AI does not know on which calendar to compute a year-to-date or a comparison with the previous year.",
      "fix": {
        "proposal": "Mark “Calendar” as a date table (`dataCategory: Time`, a date column with continuous days).",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-IA-01",
      "severity": "blocking",
      "target": {
        "kind": "column",
        "table": "Product",
        "column": "List Price"
      },
      "cited": [
        {
          "kind": "model"
        }
      ],
      "message": "The column “List Price” (table Product) is summed by default, and the model allows implicit measures: an AI that puts it in a visual shows its sum, a number with no meaning. You don't add up unit prices.",
      "fix": {
        "proposal": "Add `discourageImplicitMeasures` under `model` in model.tmdl, so that only explicit measures aggregate; and set the column to `summarizeBy: none`.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-IA-01",
      "severity": "blocking",
      "target": {
        "kind": "column",
        "table": "Sales",
        "column": "Product ID"
      },
      "cited": [
        {
          "kind": "model"
        }
      ],
      "message": "The column “Product ID” (table Sales) is summed by default, and the model allows implicit measures: an AI that puts it in a visual shows its sum, a number with no meaning. You don't add up identifiers.",
      "fix": {
        "proposal": "Add `discourageImplicitMeasures` under `model` in model.tmdl, so that only explicit measures aggregate; and set the column to `summarizeBy: none`.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-IA-03",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Gross Margin"
      },
      "cited": null,
      "message": "The measure “Gross Margin” (table Sales) was validated on 5 October 2026 by Finance department, but it has changed since: name, DAX, description, format, or the calculation of a measure it calls. An AI would still quote it as a validated fact.",
      "fix": {
        "proposal": "Have Finance department reread the definition of “Gross Margin”, then renew the validation with `factcraft validate`; or remove the `FactCraft_Validation` annotation if the fact is no longer guaranteed.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-IA-03",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Margin %"
      },
      "cited": null,
      "message": "The measure “Margin %” (table Sales) was validated on 5 October 2026 by Finance department, but it has changed since: name, DAX, description, format, or the calculation of a measure it calls. An AI would still quote it as a validated fact.",
      "fix": {
        "proposal": "Have Finance department reread the definition of “Margin %”, then renew the validation with `factcraft validate`; or remove the `FactCraft_Validation` annotation if the fact is no longer guaranteed.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-IA-04",
      "severity": "important",
      "target": {
        "kind": "model"
      },
      "cited": null,
      "message": "No AI instructions found in the project (`Copilot/Instructions/instructions.md`, where Prep data for AI saves them): Copilot has only the names and descriptions of the model to know which measure answers a question, and which date to use by default.",
      "fix": {
        "proposal": "Write the AI instructions in Prep data for AI (saved in the project as `Copilot/Instructions/instructions.md`): the business terms, the measure behind each key figure, the default date. The audit dossier drafts them from this audit, for the business to validate.",
        "toValidate": true
      }
    }
  ],
  "topFixes": [
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Turnover"
      },
      "cited": null,
      "message": "The measure “Turnover” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "KPI_Basket_02"
      },
      "cited": null,
      "message": "The measure “KPI_Basket_02” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    },
    {
      "ruleId": "FC-LIS-01",
      "severity": "blocking",
      "target": {
        "kind": "measure",
        "table": "Sales",
        "measure": "Order Count"
      },
      "cited": null,
      "message": "The measure “Order Count” (table Sales) is visible without a description: an AI will have to guess what it computes.",
      "fix": {
        "proposal": "Add a `///` description above the measure: what it computes, in which unit, under which rule.",
        "toValidate": true
      }
    }
  ]
}
