diff --git a/api/tests/test_canon_log_schema.py b/api/tests/test_canon_log_schema.py index 326d289..c5b3908 100644 --- a/api/tests/test_canon_log_schema.py +++ b/api/tests/test_canon_log_schema.py @@ -1,4 +1,3 @@ -import copy import json from pathlib import Path @@ -56,3 +55,16 @@ def test_empty_optional_arrays_are_allowed(): doc["active_quests"] = [] doc["humiliations"] = [] assert validate_canon_log(doc) == [] + + +def test_root_level_stray_field_is_rejected(): + # §2/§7: stats/HP/inventory must never enter the log — additionalProperties:false at root. + doc = _valid() + doc["hp"] = 10 + assert validate_canon_log(doc) != [] + + +def test_negative_turn_is_rejected(): + doc = _valid() + doc["humiliations"][0]["turn"] = -1 + assert validate_canon_log(doc) != [] diff --git a/docs/schemas/canon-log.schema.json b/docs/schemas/canon-log.schema.json index 795a2e9..9853159 100644 --- a/docs/schemas/canon-log.schema.json +++ b/docs/schemas/canon-log.schema.json @@ -72,7 +72,7 @@ "additionalProperties": false, "required": ["id", "text", "weight", "turn"], "properties": { - "id": { "type": "string", "minLength": 1 }, + "id": { "type": "string", "minLength": 1, "pattern": "^[a-z0-9_]+$" }, "text": { "type": "string", "minLength": 1 }, "weight": { "type": "integer", "minimum": 1, "maximum": 10 }, "turn": { "type": "integer", "minimum": 0 }