examples/tartu-development is advertised in the README as "a fully-worked reproducible project" and is the reference artifact the skill points agents at. It currently fails two checks.
$ openmapstack verify examples/tartu-development
FAIL validation.run_record_matches: inventory hash mismatch: pipeline.py
FAIL qgis.groups_match_manifest: manifest layer groups absent from the .qgz layer tree:
['candidates_tier1', 'candidates_tier2', 'candidates_highway', 'catchments',
'education_pois', 'user_overrides', 'infrastructure']
(found: ['Analysis Results', 'Educational Accessibility',
'Transportation & Overrides', 'Basemaps'])
FAILED (38 passed, 0 warnings, 2 not testable, 2 failed)
1. Stale run record
pipeline.py was changed after the last recorded run, so the run record's input inventory hash no longer matches the file. openmapstack validate reports this too:
FAIL runs.latest [runs/run-20260825-202839.json]: run input hash mismatch: pipeline.py;
inputs_hash does not match the real canonical file-set hash in ['manifest', 'report', 'run']
Why CI never caught it: .github/workflows/evals.yml smoke-tests the example with openmapstack validate --preflight, and --preflight skips exactly the output, report and run-record checks that fail here. The example has therefore never been fully validated in CI.
Fix: re-run the pipeline to regenerate the run record, then drop --preflight from the smoke test so this cannot regress. (Worth checking first whether the pipeline can regenerate offline — it fetches from an ArcGIS FeatureServer, so the CI step may need to stay preflight and gain a separate scheduled full-validation job instead.)
2. Manifest/QGIS layer-group drift
The manifest declares 7 semantic layer groups; the .qgz layer tree organises the same layers into 4 thematic ones. The check accepts either a group's id or its title, case- and separator-insensitively, so this is a genuine mismatch rather than a naming-convention artifact.
This is the failure mode mutation case 912 exists for at the dashboard level — the manifest claiming something the delivered product does not have. Fix by reconciling one to the other; the manifest's grouping is the semantic one, so the .qgz tree should probably follow it.
Why this matters beyond the example
The skill teaches that a manifest's claims must be true of the delivered product, and this is the artifact it holds up as the model. Only openmapstack verify (#13, B2) catches the second one at all — validate does not inspect the .qgz against the manifest.
Refs #13.
examples/tartu-developmentis advertised in the README as "a fully-worked reproducible project" and is the reference artifact the skill points agents at. It currently fails two checks.1. Stale run record
pipeline.pywas changed after the last recorded run, so the run record's input inventory hash no longer matches the file.openmapstack validatereports this too:Why CI never caught it:
.github/workflows/evals.ymlsmoke-tests the example withopenmapstack validate --preflight, and--preflightskips exactly the output, report and run-record checks that fail here. The example has therefore never been fully validated in CI.Fix: re-run the pipeline to regenerate the run record, then drop
--preflightfrom the smoke test so this cannot regress. (Worth checking first whether the pipeline can regenerate offline — it fetches from an ArcGIS FeatureServer, so the CI step may need to stay preflight and gain a separate scheduled full-validation job instead.)2. Manifest/QGIS layer-group drift
The manifest declares 7 semantic layer groups; the
.qgzlayer tree organises the same layers into 4 thematic ones. The check accepts either a group'sidor itstitle, case- and separator-insensitively, so this is a genuine mismatch rather than a naming-convention artifact.This is the failure mode mutation case 912 exists for at the dashboard level — the manifest claiming something the delivered product does not have. Fix by reconciling one to the other; the manifest's grouping is the semantic one, so the
.qgztree should probably follow it.Why this matters beyond the example
The skill teaches that a manifest's claims must be true of the delivered product, and this is the artifact it holds up as the model. Only
openmapstack verify(#13, B2) catches the second one at all —validatedoes not inspect the.qgzagainst the manifest.Refs #13.