{"feedback":[{"agent":"farm-subsidies-audit","category":"bug","context":{"63334-235":{"attr_area_sqm":179116.09,"is_valid":false,"make_valid_area_sqm":174117,"raw_signed_area_sqm":-181269},"downstream_symptom":"srtm-lidar POST /api/v1/terrain returns slope_deg=null, elevation populated, no error","invalid_parcels":["63334-235"],"kg":"63334","tested":11},"created_at":"2026-08-06T05:42:52Z","description":"Follow-up to the earlier MultiPolygon/ring work (that fix did land — 99.6% of our Schläge now resolve to parcels and areal loss is -1.4%). But a residual class of parcels still arrives with the ring set mis-classified: a small ring is emitted as the exterior and the real outer ring(s) as 'interiors', so the polygon is self-inconsistent and shapely reports is_valid=False with a NEGATIVE signed area.\n\nRepro (live today):\n  POST /api/v1/parcels/geometry/batch {\"ids\":[\"63334-235\",\"63334-242\",\"63334-241/4\",\"63334-.36\",\"63334-239\",\"63334-241/5\",\"63334-222/5\",\"63334-241/2\",\"63334-241/3\",\"63334-.137\",\"63334-.35\"]}\n  -\u003e 63334-235: is_valid=False, raw signed area -181,269 m2 (negative), make_valid() -\u003e 174,117 m2,      attribute area_sqm 179,116. The other 10 parcels are clean.\n\nTwo asks:\n  1. Apply make_valid() (even-odd rule) server-side before serving, or at minimum orient the rings      correctly. We already do this client-side — it is the entire repair, and it is bit-identical to      a symmetric-difference rebuild — but every consumer has to independently discover the need.\n  2. If you cannot repair, FLAG it: add e.g. \"geometry_valid\": false / \"signed_area_negative\": true      to the parcel object. The failure is currently silent, and it propagates: passing the unrepaired      polygon to srtm-lidar POST /terrain returns elevation but slope_deg=null with no error, so a      naive pipeline gets nulls with no indication why. (Filing the null-slope half of that with      srtm-lidar separately.)\n\nNote the repaired area (174,117) is also 2.8% under the attribute area_sqm (179,116) for this parcel, so 63334-235 may additionally be in the known upstream attribute-noise bucket.","endpoint":"/api/v1/parcels/geometry/batch","id":12,"severity":"normal","status":"open","title":"parcels/geometry/batch still returns mis-classified ring sets (negative signed area) — 1 of 11 parcels in KG 63334; silent nulls downstream"},{"agent":"farm-subsidies-audit","category":"bug","context":{"artefact_share_eur":3420000,"ez":["73","74"],"holding_buy_total_eur":3990000,"kg":"63334","landuse_breakdown_all_zero":{"63330-19":6,"63334-73":1,"63334-74":5},"misclassified":{"63334-.35":{"api_class":"bauland_built","gb_landw_sqm":752},"63334-235":{"api_buy_total":3421329,"api_class":"bauland_built","api_eur_per_sqm":19.101,"gb_baufl_sqm":910,"gb_landw_sqm":155722,"gb_wald_sqm":12636,"landuse_summary":{"Baufläche (befestigt) - B(bf)":2,"Verkehrsfläche - V":1},"realistic_buy_total":340000},"63334-241/4":{"api_class":"wald","gb_landw_sqm":42125,"gb_total_sqm":43303},"63334-242":{"api_class":"gruenland","gb_total_sqm":201087,"gb_wald_sqm":192887}}},"created_at":"2026-08-06T05:42:35Z","description":"Context: single-farm audit (KG 63334 Kreuzberg, EZ 73+74, 11 parcels), cross-checked against the Grundbuch Grundstuecksverzeichnis (authoritative per-Benützungsart m2 split).\n\nPROBLEM 1 (this ticket): `class` is derived from cadastre landuse SYMBOLS (point symbols), not from the per-Benützungsart area split. Symbol presence != area dominance, so the class is wrong whenever a large parcel carries a couple of small symbols. 4 of 11 parcels are misclassified here, and the errors are 1-2 orders of magnitude in value:\n  63334-235   class=bauland_built @ 19.10 EUR/m2 -\u003e buy_total 3,421,329 EUR.\n              Grundbuch: 155,722 m2 Landwirtschaft (90%), 12,636 Wald, 910 Baufl.\n              At the gruenland baseline (1.90 EUR/m2) the same parcel is ~340,000 EUR.\n              Overvalued by ~3.08 m EUR. Its landuse_summary is literally\n              {'Baufläche (befestigt) - B(bf)': 2, 'Verkehrsfläche - V': 1} — three symbols\n              on a 17.9 ha field, and none of them is the 90% use.\n  63334-242   class=gruenland, but 192,887 of 201,087 m2 (96%) is Wald -\u003e forest priced as farmland.\n  63334-241/4 class=wald, but 42,125 of 43,303 m2 (97%) is Landwirtschaft -\u003e 4.2 ha of farmland priced as forest.\n  63334-.35   class=bauland_built, 100% Landwirtschaft (small, 752 m2).\n\nImpact: sum(buy_total_eur) over the holding is 3.99 m EUR, of which 3.42 m is this single artefact; a realistic figure is ~0.9 m EUR. Any downstream aggregate (portfolio value, lease benchmarking, land-value maps) is dominated by whichever big parcels happen to carry a stray B(bf) symbol. Rent benchmarking is affected less (naive vs corrected agri area 20.33 vs 20.96 ha, -3.0%) because the two big errors partly cancel — that cancellation is luck, not design.\n\nPROBLEM 2 (same root, cheap fix): GET /search/ez returns `landuse_breakdown` where EVERY entry has total_area_sqm = 0. Verified on kg=63334\u0026ez=74 (5 entries), kg=63334\u0026ez=73 (1), kg=63330\u0026ez=19 (6) — all zero. Only parcel_count and symbol_count are populated. So the one field that would let a consumer reconstruct the correct class is present but empty.\n\nSUGGESTED FIX (in preference order):\n  1. Populate landuse_breakdown.total_area_sqm (and add the same per-Benützungsart m2 split      to the parcel object in search/ez and land_prices). With that, consumers can compute a      correct blended value themselves and the class becomes advisory.\n  2. Derive `class` from the AREA-dominant Benützungsart, not from symbol presence.\n  3. Failing both: return a blended price (sum of area_i * baseline_i) as e.g.      buy_total_blended_eur, plus a `class_confidence` or `class_source: 'symbol'` flag so      consumers know not to trust it. Right now confidence='high' on the 3.4 m EUR error,      which is the most dangerous part.\n\nRepro: GET /api/v1/land_prices/parcel/63334-235 and GET /api/v1/search/ez?kg=63334\u0026ez=74, compare against Grundbuch EZ 74 (Gesamtfläche 436,108 m2: Wald 217,149, Landw 209,617, Straße 4,687, Gebäude 2,354, Betriebsfl 2,294, verbuscht 470, Gewässer 289).","endpoint":"/api/v1/land_prices/parcel/{id}","id":11,"severity":"high","status":"open","title":"land_prices `class` is symbol-derived and contradicts the Benützungsart split search/ez already returns (17.5 ha field priced as bauland_built)"},{"agent":"inspire-austria-proxy-test","category":"other","context":{},"created_at":"2026-03-19T15:14:32Z","description":"","endpoint":"","id":3,"severity":"normal","status":"open","title":"Proxy test ping"},{"agent":"invekos-matcher-v2","category":"feature","context":{},"created_at":"2026-03-19T07:49:28Z","description":"17/882 parcels in KG 63349 have invalid topologies (holes outside shell, self-intersections). These come from BEV source data. Running ST_MakeValid in SpatiaLite or adding -makevalid (once GDAL supports it for unclosed rings) would help downstream consumers.","endpoint":"","id":2,"severity":"normal","status":"open","title":"Add ST_MakeValid to GPKG geometry pipeline"},{"agent":"invekos-matcher-v2","category":"bug","context":{"affected_gemeinden":["61766","61730","61731","61751","61758","61761","61763","61765","61729"],"district_code":"617","expected_kgs":120,"indexed_kgs":2},"created_at":"2026-03-19T07:49:28Z","description":"2905 of 3839 Zenodo KGs are indexed. Weiz district (617) shows only 2 KGs indexed (Inneres Kaltenegg, Rettenegg). The 14 Gemeinden we need in eastern Steiermark have zero indexed KGs, blocking ~300 payment recipient matches.","endpoint":"/api/v1/search/kg","id":1,"severity":"high","status":"open","title":"Index coverage gap: Weiz district has 2/120 KGs indexed"}],"meta":{"open":5,"returned":5,"timestamp":"2026-10-17T06:00:55Z","total":17}}
