{
  "kind": "aarloven.case.v1",
  "title": "Robot vacuum firmware update (simulated)",
  "about": "The robot vacuum case from /robot, run as tests. The firmware is a simulated model with three settings, not real firmware, and the office and its floor are synthetic. The buyer picks the firmware and the floor.",
  "clauses": [
    { "id": "c1", "clause": "Covers the floor: at least 95 % of the reachable floor, and at least 90 % of every room.", "test": "tests/c1.test.mjs", "always": true },
    { "id": "c2", "clause": "Finds the dirt: at least 10 of the 12 test patches on the recorded floor, at least 90 % of the dirt on a changed floor.", "test": "tests/c2.test.mjs", "always": true },
    { "id": "c3", "clause": "Keeps its heading: rotation drift at most 2.0° a minute, in every minute.", "test": "tests/c3.test.mjs", "always": true },
    { "id": "c4", "clause": "Runs on time: the run ends within 60 minutes.", "test": "tests/c4.test.mjs", "always": true }
  ],
  "builds": {
    "4.2.1": { "file": "builds/4.2.1/firmware.mjs", "about": "The firmware on the delivered robots (simulated model)." },
    "4.3.0": { "file": "builds/4.3.0/firmware.mjs", "about": "The over-the-air update (simulated model): faster, but it reads a dark mat as a drop." }
  },
  "floors": {
    "october": { "file": "floors/october.json", "about": "October: the floor the tests were written on, with the 12 test patches." },
    "january": { "file": "floors/january.json", "about": "January morning: the dark entrance mat and street gravel." }
  },
  "files": ["data/floor.json", "tests/check.mjs", "tests/sim.mjs", "tests/c1.test.mjs", "tests/c2.test.mjs", "tests/c3.test.mjs", "tests/c4.test.mjs"],
  "not_tested": "c5 on /robot (talks only to agreed places) needs traffic from a real robot on your network, so it is not in this case."
}
