"""Editorial use-case assessment; update REVIEWED_AT when reassessing capabilities."""

REVIEWED_AT = "2026-09-07"
BASELINE = "b5116da"
REFERENCE = "https://salgo60.github.io/Stockholm_Archipelago_Trail/Notebook/output/dashboard.html"

# Original identifiers and titles are retained for comparison, not renumbered.
PERSONAS = [
    "Local business owner", "Daytrip hikers", "Weekend tenting hikers",
    "Weekend beginner tenting hikers", "Good food & exclusive stay hikers",
    "Group hiking organizers", "Hikers with boat access", "Non-Swedish speaking visitors",
    "MTB (mountain bike) riders", "Community sites (ideella föreningar, hembygdsföreningar)",
    "Commercial tourist sites (Airbnb, glamping, aktivitetsbolag)", "Dog owners & walkers",
    "Trail runners", "Accessibility-focused hikers", "Environmental monitors & researchers",
    "Photographers & content creators", "Bird watchers & nature enthusiasts",
    "Digital nomads / remote workers", "Active seniors & healthy aging hikers",
    "Families with children", "Solo travelers & singles", "Culture & heritage explorers",
    "Eco-conscious travelers", "Wellness & retreat travelers", "Educational groups & field trips",
    "Författare av reseböcker", "Trip sharers & trail community", "Naturvårdsverket",
    "Myndighetsnätverket för friluftsliv", "Boverket", "Folkhälsomyndigheten",
    "Havs- och vattenmyndigheten", "Jordbruksverket", "Konsumentverket",
    "Myndigheten för delaktighet (MFD)", "Länsstyrelsen Stockholm", "Tillväxtverket",
    "Kommuner längs leden", "Reseinfluencers & media", "Vintercampare",
    "Trail planners & maintainers", "Friluftskartskapare & GIS-utvecklare", "Ledägare & förvaltare",
]

# Each localized field is (Swedish, English). Evidence identifies inspected source files.
CASES = [
    dict(id="SAT-01", refs=[2, 7, 23], stage="before", status="partial", priority="P0",
         title=("Planera en dagstur och komma hem", "Plan a day hike and get home"),
         need=("Jag vill välja en etapp som passar min tid och hinna med sista båten hem.",
               "I want a stage that fits my available time and a return before the last boat."),
         current=("Dashboarden visar etapper, POI och kartor; ledrapporten visar OSM-geometri och distance där det finns.",
                  "The dashboard shows stages, POIs and maps; the trail report shows OSM geometry and distance where supplied."),
         gap=("Ingen sammanhängande dörr-till-dörr-planering, tidtabellsanpassad gångtid eller reservresa vid inställd båt. Bryggor är inte avgångar.",
              "No end-to-end journey planner, timetable-aware walking time or fallback for a cancelled boat. Piers are not departures."),
         done=("En daterad tur visar start, mål, gångtidsantaganden, byten, sista retur och alternativ vid missad anslutning, med källa och uppdateringstid.",
               "A dated itinerary shows start, finish, walking-time assumptions, connections, last return and a missed-connection alternative, with source and update time."),
         owner=("SAT + trafikoperatörer; kontrollera Trafiklab/operatörernas API-villkor.",
                "SAT + transport operators; assess Trafiklab/operator API terms."),
         tools=["sat_poi_dashboard.html", "sat_osm_trail_report.html"], evidence=["generate_poi_dashboard.py", "generate_osm_trail_report.py"]),
    dict(id="SAT-02", refs=[3, 4, 40], stage="before", status="partial", priority="P0",
         title=("Övernatta med tält och ha en reservplan", "Camp overnight with a backup plan"),
         need=("Jag vill hitta tillåten övernattning, vatten och skydd även utanför sommaren.",
               "I want permitted overnight stays, water and shelter, including outside summer."),
         current=("POI-kategorier och OSM-rapporten hjälper till att hitta camping, vindskydd, vatten och eldplatser.",
                  "POI categories and the OSM report help locate camping, shelters, water and fire sites."),
         gap=("Ingen verifierad tillgång på vatten/ved, kapacitet, säsongsstatus eller sammanställda lokala tält- och eldningsregler.",
              "No verified water/firewood availability, capacity, seasonal status or consolidated local camping and fire rules."),
         done=("Varje nattstopp har daterade regler från ansvarig källa, säsong, vattenstatus och ett nåbart reservstopp. Okänd status visas som okänd.",
               "Each overnight stop has dated rules from the responsible source, season, water status and a reachable backup. Unknown status remains unknown."),
         owner=("Markägare, reservatsförvaltare och serviceoperatörer.", "Landowners, reserve managers and service operators."),
         tools=["sat_poi_dashboard.html", "sat_osm_ref_report.html"], evidence=["generate_poi_dashboard.py", "generate_osm_ref_report.py"]),
    dict(id="SAT-03", refs=[13, 18, 19, 20], stage="during", status="partial", priority="P0",
         title=("Hitta fungerande service längs turen", "Find working services along the hike"),
         need=("Jag behöver dricksvatten, toalett, rastplats, mat eller laddning innan nästa långa sträcka.",
               "I need drinking water, a toilet, rest stop, food or charging before the next long stretch."),
         current=("Kart- och kategorifilter hittar registrerade servicepunkter. Taggrapporter visar bland annat vilka uppgifter som saknas.",
                  "Map and category filters locate recorded services. Tag reports show missing information."),
         gap=("Registrerad plats och opening_hours bevisar inte att vatten är drickbart, toaletten fungerar eller uttaget är tillgängligt just nu.",
              "A recorded place and opening_hours do not prove water is potable, a toilet works or a socket is available right now."),
         done=("Visa avstånd längs leden, observerad status, tidpunkt, källa och giltighetstid; hantera motstridiga rapporter och ge ett alternativ.",
               "Show distance along the route, observed condition, timestamp, source and expiry; handle conflicting reports and offer an alternative."),
         owner=("Serviceoperatörer + modererade fältrapporter.", "Service operators + moderated field observations."),
         tools=["sat_poi_dashboard.html", "sat_osm_ref_report.html"], evidence=["generate_poi_dashboard.py", "generate_osm_ref_report.py"]),
    dict(id="SAT-04", refs=[14, 19, 20, 35], stage="before", status="partial", priority="P0",
         title=("Bedöma en tillgänglig tur utifrån egna behov", "Assess a route against personal access needs"),
         need=("Jag behöver veta om hela kedjan båt–brygga–led–toalett fungerar för mina förutsättningar.",
               "I need to know whether the boat–pier–trail–toilet chain works for my requirements."),
         current=("TODO-kartan kan visa förekomst av wheelchair-taggar; OSM-rapporterna kan visa underlag och andra registrerade egenskaper.",
                  "The TODO map can show the presence of wheelchair tags; OSM reports expose surface and other recorded properties."),
         gap=("En wheelchair-tagg är ingen garanti för en sammanhängande tillgänglig sträcka. Lutning, bredd, hinder, båtombordstigning och verifieringsdatum saknas ofta.",
              "A wheelchair tag does not certify an accessible route. Slope, width, obstacles, boarding and verification dates are often missing."),
         done=("Användaren kan ange egna krav; varje delsträcka visar belägg och okända värden. En testtur granskas med berörda användare, utan generell säkerhetsgaranti.",
               "Users can specify requirements; every segment shows evidence and unknowns. A trial route is reviewed with affected users, without a blanket safety guarantee."),
         owner=("Tillgänglighetsorganisationer, led- och trafikförvaltare.", "Accessibility groups, trail and transport managers."),
         tools=["sat_todo_map.html", "sat_osm_trail_report.html"], evidence=["generate_todo_map.py", "generate_osm_trail_report.py"]),
    dict(id="SAT-05", refs=[8], stage="before", status="partial", priority="P1",
         title=("Planera på mitt språk", "Plan in my language"),
         need=("Jag vill förstå kartan, reglerna och bokningsstegen utan att kunna svenska.",
               "I want to understand the map, rules and booking steps without speaking Swedish."),
         current=("Dashboarden har språkval och länkade etiketter; Om-sidan och flera verktyg har svenska/engelska.",
                  "The dashboard has language selection and linked labels; About and several tools support Swedish/English."),
         gap=("Gränssnittsspråk garanterar inte översatta platsnamn, säkerhetstexter, föreskrifter eller externa bokningssidor.",
              "Interface language does not guarantee translated place names, safety text, regulations or external booking pages."),
         done=("En användare kan följa en tur på sitt språk. Saknad översättning markeras, originalkälla finns kvar och kritiska texter granskas av en människa.",
               "A user can follow a journey in their language. Missing translations are labelled, originals remain accessible and critical text has human review."),
         owner=("SAT-redaktion, översättare och respektive källägare.", "SAT editors, translators and each source owner."),
         tools=["sat_poi_dashboard.html", "sat_about.html"], evidence=["generate_poi_dashboard.py", "generate_about.py"]),
    dict(id="SAT-06", refs=[9, 12, 17, 23, 40], stage="during", status="partial", priority="P0",
         title=("Förstå regler för hund, cykel, eld och natur", "Understand dog, cycling, fire and nature rules"),
         need=("Jag vill veta vad som gäller här och idag, inte bara vad som brukar vara tillåtet.",
               "I want to know what is permitted here today, not merely what is usually allowed."),
         current=("OSM-objekt och deras taggar kan granskas och länkas till ursprungskällan.",
                  "OSM objects and their tags can be inspected and linked to their source."),
         gap=("Ingen fullständig tids- och platsberoende regelmotor för reservat, fågelskydd, koppel, MTB eller eldningsförbud. Vandring innebär inte automatiskt cykeltillstånd.",
              "No complete time- and location-aware rules for reserves, bird protection, leashes, MTB or fire bans. A hiking trail does not imply cycling permission."),
         done=("Regler visas med geografi, giltighetsperiod och ansvarig myndighets källa. Utgångna och saknade besked får aldrig presenteras som tillstånd.",
               "Rules show geography, validity period and the responsible authority's source. Expired or missing information must never be shown as permission."),
         owner=("Reservatsförvaltare, kommuner och ansvariga myndigheter.", "Reserve managers, municipalities and responsible authorities."),
         tools=["sat_osm_ref_report.html"], evidence=["generate_osm_ref_report.py"]),
    dict(id="SAT-07", refs=[2, 4, 21, 40], stage="during", status="partial", priority="P0",
         title=("Klara dåligt nät och ändrade förhållanden", "Handle poor connectivity and changing conditions"),
         need=("Jag behöver behålla karta, turplan och nödvändig information när täckning eller batteri sviker.",
               "I need to retain my map, itinerary and essential information when coverage or battery fails."),
         current=("Dashboarden kan exportera ett POI-urval som JSON. TODO-kartan visar ett AED-lager.",
                  "The dashboard can export a POI selection as JSON. The TODO map shows an AED layer."),
         gap=("JSON-export är inte en offlinekarta. Ingen komplett offline-/GPX-tur, vädervarning, incheckning eller räddningsfunktion. Ett AED-objekt garanterar inte åtkomst.",
              "JSON export is not an offline map. No complete offline/GPX itinerary, weather alert, check-in or rescue service. An AED record does not guarantee access."),
         done=("Testa flygplansläge: sparad karta, rutt, källålder och koordinater ska fungera. Visa tydligt vad som kräver nät och att appen inte är en räddningstjänst.",
               "Test airplane mode: saved map, route, source age and coordinates must work. Clearly show what requires a network and that this is not a rescue service."),
         owner=("SAT-produktteam + relevanta varningskällor; offlinekartors licenser måste klarläggas.",
                "SAT product team + relevant alert sources; offline map licensing must be resolved."),
         tools=["sat_poi_dashboard.html", "sat_todo_map.html"], evidence=["generate_poi_dashboard.py", "generate_todo_map.py"]),
    dict(id="SAT-08", refs=[1, 5, 11, 18, 24], stage="before", status="partial", priority="P1",
         title=("Hitta och boka mat, boende och aktiviteter", "Find and book food, stays and activities"),
         need=("Jag vill hitta en öppen verksamhet, se om det finns plats och slutföra en bokning.",
               "I want to find an open business, check availability and complete a booking."),
         current=("POI-kategorier och källänkar hjälper till att hitta verksamheter; kvalitetshistoriken följer bland annat bokningslänkar.",
                  "POI categories and source links help locate businesses; quality history tracks booking links among other fields."),
         gap=("En bokningslänk är inte liveinventering, pris, bekräftelse eller avbokning. Ingen verifierad wifi-/arbetsplats- eller paketbokning.",
              "A booking link is not live inventory, pricing, confirmation or cancellation. No verified workspace/wifi or package booking."),
         done=("En testbokning går till rätt operatör och datum. Tillgänglighet har tidsstämpel och prisvillkor; person- och betalningsdata hanteras av avtalad part.",
               "A test booking reaches the correct operator and dates. Availability is timestamped with price terms; personal/payment data is handled by an agreed party."),
         owner=("Boende-, restaurang- och aktivitetsoperatörer; API-/bokningsavtal krävs.",
                "Accommodation, restaurant and activity operators; API/booking agreements required."),
         tools=["sat_poi_dashboard.html", "sat_poi_quality_history.html"], evidence=["generate_poi_dashboard.py", "generate_poi_quality_history.py"]),
    dict(id="SAT-09", refs=[6, 19, 20, 21, 25], stage="before", status="partial", priority="P1",
         title=("Planera en familje-, grupp- eller skolutflykt", "Plan a family, group or school outing"),
         need=("Jag vill anpassa distans, raster, kapacitet och reservplan till deltagarnas behov.",
               "I want to adapt distance, rest stops, capacity and a backup plan to participants' needs."),
         current=("Etapp- och serviceöversikter ger ett underlag för manuell planering.",
                  "Stage and service overviews provide a basis for manual planning."),
         gap=("Inga kontrollerade gruppstorlekar, bokningar, barnanpassade delsträckor, samtyckesflöden eller utbildningsmaterial.",
              "No verified group capacities, reservations, child-suitable segments, consent workflows or educational materials."),
         done=("En arrangör kan dela en daterad turplan med samlingsplats, raster, transportkapacitet, ansvarig och reservplan utan att publicera deltagarnas personuppgifter.",
               "An organizer can share a dated plan with meeting place, breaks, transport capacity, responsible contact and fallback without publishing participants' personal data."),
         owner=("Grupparrangörer, skolor och service-/trafikoperatörer.", "Group organizers, schools and service/transport operators."),
         tools=["sat_poi_dashboard.html", "sat_osm_trail_report.html"], evidence=["generate_poi_dashboard.py", "generate_osm_trail_report.py"]),
    dict(id="SAT-10", refs=[10, 16, 17, 22, 24, 26, 39], stage="during", status="partial", priority="P2",
         title=("Upptäcka natur, kultur och fotoplatser", "Discover nature, heritage and photo spots"),
         need=("Jag vill hitta intressanta stopp och återanvända fakta och bilder med korrekt källhänvisning.",
               "I want interesting stops and reusable facts and images with correct attribution."),
         current=("Dashboarden länkar platser till Wikidata, Wikipedia, Commons och andra bildkällor när länkar finns.",
                  "The dashboard links places to Wikidata, Wikipedia, Commons and other image sources where available."),
         gap=("Ingen komplett kuratering av berättelser, artobservationer, lugna platser eller fototider. Commons-länk innebär inte att varje bild har samma licens.",
              "No complete curation of stories, wildlife observations, quiet places or photo timing. A Commons link does not imply every image has the same licence."),
         done=("Ett valt stopp har källbelagd berättelse och bild med upphovsperson/licens. Känsliga arter och platser skyddas; lokala regler länkas.",
               "A selected stop has a sourced story and an image with creator/licence. Sensitive species and locations are protected; local rules are linked."),
         owner=("Kultur- och naturförvaltare, lokala föreningar och bildbidragsgivare.",
                "Heritage/nature managers, local associations and image contributors."),
         tools=["sat_poi_dashboard.html"], evidence=["generate_poi_dashboard.py"]),
    dict(id="SAT-11", refs=[15, 16, 27, 39], stage="after", status="planned", priority="P2",
         title=("Dela en vandring och bidra med observationer", "Share a hike and contribute observations"),
         need=("Jag vill dela spår, bilder och erfarenheter på ett återanvändbart sätt.",
               "I want to share tracks, photos and experiences in a reusable way."),
         current=("Länkar till externa källor och Commons är byggstenar, inte ett inbyggt turflöde. Referensen föreslår Share Your Hike.",
                  "External source and Commons links are building blocks, not an integrated trip feed. The reference proposes Share Your Hike."),
         gap=("Ingen publicerad tjänst i detta repo för turuppladdning, profiler, moderering, samtycke, radering eller medborgarforskning.",
              "No published service in this repo for trip uploads, profiles, moderation, consent, deletion or citizen science."),
         done=("Ett pilotflöde kan publicera och radera en licensmärkt tur, dölja privata start/slutpunkter och rapportera olämpligt innehåll.",
               "A pilot can publish and delete a licensed trip, hide private start/end points and report inappropriate content."),
         owner=("Communitymoderatorer + ansvarig tjänsteägare/personuppgiftsansvarig.",
                "Community moderators + accountable service owner/data controller."),
         tools=["sat_about.html"], evidence=["generate_about.py"]),
    dict(id="SAT-12", refs=[1, 10, 21, 27], stage="during", status="planned", priority="P1",
         title=("Få relevanta evenemang och förändringsnotiser", "Receive relevant events and change notifications"),
         need=("Jag vill veta om något ändras på min tur och hitta evenemang på rätt plats och datum.",
               "I want to know when my itinerary changes and find events at the right place and date."),
         current=("Flyerna beskriver livebåtar, evenemang och prenumerationer som en vision; daglig sidgenerering är inte en notistjänst.",
                  "Flyers describe live boats, events and subscriptions as a vision; daily page generation is not a notification service."),
         gap=("Ingen ansluten eventkalender, push-/e-postprenumeration, avregistrering eller leveransövervakning i dessa verktyg.",
              "No connected event calendar, push/email subscriptions, unsubscribe flow or delivery monitoring in these tools."),
         done=("Ett avgränsat pilotflöde hanterar inställda event, tidszon, relevans, samtycke, dubbletter, utgångna varningar och avregistrering.",
               "A scoped pilot handles cancelled events, time zones, relevance, consent, duplicates, expired alerts and unsubscribe."),
         owner=("Eventarrangörer, trafikoperatörer och notistjänstens ägare.", "Event organizers, transport operators and notification-service owner."),
         tools=["sat_about.html"], evidence=["generate_about.py", ".github/workflows/regen-dashboard.yml"]),
    dict(id="SAT-13", refs=[27, 41, 42, 43], stage="after", status="partial", priority="P0",
         title=("Rapportera ett fel och följa åtgärden", "Report a problem and follow its resolution"),
         need=("Jag vill att en trasig spång eller felaktig uppgift når rätt ansvarig och får ett tydligt svar.",
               "I want a broken boardwalk or incorrect record to reach the right owner and receive a clear response."),
         current=("TODO-verktyg, OSM-redigeringslänkar, OSM Notes-uppgifter och GitHub-förslag stödjer manuell datavård.",
                  "TODO tools, OSM edit links, OSM Notes tasks and GitHub suggestions support manual data maintenance."),
         gap=("Ingen sammanhängande felkedja med mottagare, kvittens, triage, åtgärdsstatus och återkoppling. OSM-redigering är inte en beställning av underhåll.",
              "No complete reporting chain with recipient, acknowledgement, triage, resolution and feedback. An OSM edit is not a maintenance request."),
         done=("En provrapport får stabilt objekt-/segment-ID, tid, ansvarig mottagare och status från mottagen till verifierad åtgärd, med revisionsspår.",
               "A trial report has a stable object/segment ID, time, accountable recipient and states from received to verified resolution, with an audit trail."),
         owner=("Led- och serviceförvaltare + datavårdare; ansvar måste avtalas.", "Trail/service managers + data stewards; responsibility must be agreed."),
         tools=["sat_todo_map.html", "sat_todo_list.html"], evidence=["generate_todo_map.py", "generate_todo_list.py"]),
    dict(id="SAT-14", refs=[1, 10, 11, 26, 38, 41, 42, 43], stage="manage", status="available", priority="P1",
         title=("Granska en plats och dess källkopplingar", "Inspect a place and its source links"),
         need=("Som datavårdare vill jag hitta en plats och jämföra dess SAT-, OSM- och Wikidata-identiteter.",
               "As a data steward I want to find a place and compare its SAT, OSM and Wikidata identities."),
         current=("Dashboardfilter, SAT-karta/JSON-länkar, OSM-/Wikidata-länkar och rapporter finns. Ett POI-urval kan exporteras som JSON.",
                  "Dashboard filters, SAT map/JSON links, OSM/Wikidata links and reports exist. A POI selection can be exported as JSON."),
         gap=("Detta smala granskningsflöde finns, men källorna kan vara ofullständiga eller oense. Det innebär varken automatisk synkning eller fullständigt stöd för målgruppens övriga behov.",
              "This narrow inspection workflow exists, but sources may be incomplete or disagree. It implies neither automatic synchronization nor full support for the persona's other needs."),
         done=("Hitta en befintlig POI, öppna dess SAT-JSON och tillgängliga OSM/Wikidata-källor, och exportera urvalet utan att ändra källdata.",
               "Find an existing POI, open its SAT JSON and available OSM/Wikidata sources, and export the selection without modifying source data."),
         owner=("SAT Sync-datavårdare; respektive plattform ansvarar för sin data.", "SAT Sync data stewards; each platform governs its own data."),
         tools=["sat_poi_dashboard.html", "sat_osm_ref_report.html"], evidence=["generate_poi_dashboard.py", "generate_osm_ref_report.py"]),
    dict(id="SAT-15", refs=[15, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 41, 42], stage="manage", status="partial", priority="P2",
         title=("Analysera servicegap och samhällsnytta", "Analyze service gaps and public value"),
         need=("Som planerare vill jag jämföra tillgång, kvalitet och ansvar mellan etapper och kommuner.",
               "As a planner I want to compare access, quality and responsibility across stages and municipalities."),
         current=("Kommunfilter, led- och objektstatistik samt datakvalitetshistorik ger inventeringsunderlag.",
                  "Municipality filters, trail/object statistics and data-quality history provide an inventory baseline."),
         gap=("Taggtäckning mäter inte faktisk tillgänglighet, folkhälsa, besökstryck, naturpåverkan eller måluppfyllelse. Nationella myndighetsbehov kräver andra dataset och definitioner.",
              "Tag coverage does not measure actual accessibility, public health, visitor pressure, ecological impact or policy outcomes. National agency needs require additional datasets and definitions."),
         done=("En pilot för ett definierat servicegap redovisar nämnare, bortfall, metod, geografi, licens och osäkerhet; resultaten granskas med den tänkta användaren.",
               "A pilot for a defined service gap reports denominators, missingness, method, geography, licence and uncertainty; results are reviewed with the intended user."),
         owner=("Kommuner, forskare och respektive myndighet; förslag, inte ingångna samarbeten.",
                "Municipalities, researchers and each authority; proposed participants, not agreed partnerships."),
         tools=["sat_poi_quality_history.html", "sat_osm_trail_report.html", "sat_osm_ref_report.html"],
         evidence=["generate_poi_quality_history.py", "generate_osm_trail_report.py", "generate_osm_ref_report.py"]),
    dict(id="SAT-16", refs=[29, 36, 38, 42, 43], stage="manage", status="partial", priority="P0",
         title=("Förvalta pålitliga data från källa till användare", "Maintain trustworthy data from source to user"),
         need=("Jag vill veta vem som ansvarar för en uppgift, när den observerades och hur ändringar sprids.",
               "I want to know who owns a record, when it was observed and how changes propagate."),
         current=("SAT-/OSM-/Wikidata-ID:n, operatörsuppgifter när de finns, JSON-rapporter, snapshots och schemalagd regenerering ger spårbarhet.",
                  "SAT/OSM/Wikidata IDs, operator details where available, JSON reports, snapshots and scheduled regeneration provide traceability."),
         gap=("Inga gemensamma datakontrakt för observationstid, giltighet, borttagning, versionering, konflikter, driftslöften eller auktoriserade uppdateringar hos alla aktörer.",
              "No shared data contracts for observation time, validity, deletion, versioning, conflicts, service levels or authorized updates across all actors."),
         done=("En pilotkälla kan uppdatera, korrigera och dra tillbaka en uppgift med stabilt ID, licens, ansvarig, tidsstämplar och validering; fel blir synliga och kan följas upp.",
               "A pilot source can update, correct and withdraw a record with a stable ID, licence, owner, timestamps and validation; failures are visible and traceable."),
         owner=("Källägare + SAT-dataförvaltning. Varje källa förblir ansvarig för sitt område; SSOT är inte en magisk gemensam databas.",
                "Source owners + SAT data governance. Each source retains authority in its domain; SSOT is not a magic shared database."),
         tools=["sat_poi_quality_history.html", "sat_todo_list.html"],
         evidence=["README.md", "generate_poi_quality_history.py", ".github/workflows/regen-dashboard.yml"]),
]
