Contributing a TMGoat fixture
July 10, 2026 · View on GitHub
A fixture = one system at one difficulty, with inputs and a ground-truth answer key.
Steps
fixtures/<NN-sector>/<tier>/— create the folder.manifest.yaml— tag it; validate againstschema/manifest.schema.json.inputs/— the artifacts a tool ingests:diagrams/(drawio preferred),intake/(docs + OpenAPI),code/,iac/. Keep component names consistent across artifacts — cross-source correlation is part of what we test.solution/threat-model.yaml— the answer key; validate againstschema/threat-model.schema.json. Mark every intentional threatplanted: trueand give itcwe+standardsmappings.python harness/score.py ...to sanity-check, then add a row tocatalog.md.
Tagging guidance (the important rule)
Difficulty is not size. Tag the three axes honestly in manifest.yaml:
architectural_complexity, threat_subtlety, input_completeness.
Deliberately break the size↔subtlety correlation. We want fixtures that are:
- small but subtle (few components, one nasty design flaw), and
- large but obvious (many components, only textbook issues).
If every "difficult" fixture is just "bigger," the benchmark only measures parsing, not reasoning.
Robustness fixtures
Most fixtures are input_completeness: rich (all artifacts present and agreeing). Please also contribute
partial (e.g. code + a vague description, no diagram) and adversarial (contradictory artifacts)
variants — that's where automated modelers actually break.
Safety
These designs contain intentional weaknesses. Label them as such; never present fixture code/IaC as production guidance.