Skip to main content
Petanque Life
← Back to all features
20

Surveys & Research

36 features · 6 subsystems

Complete survey platform for the petanque ecosystem — from FIPJP rule consultations to club member satisfaction surveys.

Survey Builder

F20.01
How it works
  • F20.01.01 Shipped

    Survey creation — create surveys from scratch or clone from templates

    ✅ greenfield ff38043a.m-1
  • F20.01.02 Shipped

    Rich question types — 13 types: SingleChoice, MultiChoice, Likert, NPS, Matrix, Ranking, ShortText, LongText, Number, Date, DateRange, ImageUpload, GeoPoint

    ✅ greenfield ff38043a.m-1
  • F20.01.03 Shipped

    Conditional branching — show/hide questions based on AND/OR condition trees

    ✅ greenfield ff38043a.m-1
  • F20.01.04 Shipped

    Question translations — multi-language support per question

    ✅ greenfield ff38043a.m-1
  • F20.01.05 Shipped

    Template library — reusable templates with category taxonomy

    ✅ greenfield ff38043a.m-1

Distribution & Targeting

F20.02
How it works
  • F20.02.01 Shipped

    Multi-level targeting — tenant-wide, org-node subtree, role-based, demographic, explicit list, combined. Sju dimensioner som SKÄR mot varandra i EN SQL-fråga (aldrig en per-person-loop), med den explicita listan LAGD TILL ovanpå filtren; en dimension utan källa i tenanten redovisas i unresolved_dimensions[] och filtrerar ingenting

    ✅ greenfield-byggd i ff38043a.m-3
  • F20.02.02 Shipped

    Multi-channel distribution — in-app, email, SMS, public link, embeddable iframe. Kanalerna är TVÅ SLAG: de tre ADRESSERADE föder en inbjudan (CHECK i DDL:en), de två RENDERINGSLÄGENA kan per konstruktion inte få en

    ✅ greenfield-byggd i ff38043a.m-3
  • F20.02.03 Shipped

    Audience estimation — live estimated audience size before publishing. POST …/test-audience är en sidoeffektsfri läsning på ett KANDIDAT-dokument (talet uppdateras när filtren ändras *innan* något sparats) och svarar 422 audience_too_large med det MÄTTA talet — aldrig en tyst trunkering

    ✅ greenfield-byggd i ff38043a.m-3
  • F20.02.04 Shipped

    Reminder system — configurable cadence: none, once after 3d, weekly, every 3d. Kadensen är en REN funktion (survey.ReminderWindow) och single-fire en DB-invariant (unique (invitation_id, window_key)), inte ett if; nyckelrummet delas med den manuella knappen

    ✅ greenfield-byggd i ff38043a.m-3
  • F20.02.05 Shipped

    Invitation tracking — per user x survey x channel delivery and engagement tracking. Spårningen säger ATT, aldrig VAD: responded_at bor på inbjudan och survey_response får ingen referens tillbaka, och granulariteten är ENKÄTENS läge (aggregat för pseudonym/anonym)

    ✅ greenfield-byggd i ff38043a.m-3

Response Collection

F20.03
How it works
  • F20.03.01 Shipped

    Anonymous mode — no user_id stored, only aggregate contributions. Upprätthålls av en CHECK i survey_response, inte av en if-sats: en anonym rad KAN inte bära en referens.

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.02 Shipped

    Pseudonymous mode — hex(sha256(survey_id ‖ user_id)), dedupad av ett partiellt unikt index (aldrig av ett if)

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.03 Shipped

    Attributed mode — identitetsreferens + demografi-snapshot läst i inlämningens egen transaktion (det är vad »frusen« betyder)

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.04 Shipped

    Partial save — autospar + »fortsätt senare« via HMAC-signerat kuvert i URL-fragmentet; utkastet lever 30 dygn och gallras av survey_partial_expiry

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.05 Shipped

    Progress bar — progress_mode serveras; progressen räknas över synliga frågor. Ytan som renderar den är ff38043a.m-2.t-2 (web /enkat/…).

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.06 Shipped

    Public survey page — de fyra publika rutterna (ff38043a.m-2.t-1) + web-sidan /enkat/… (ff38043a.m-2.t-2). Bokförd avvikelse: sidan är Next.js (husets web), inte Astro — legacy-raden namngav ett ramverk som inte finns på rebuild.

    ✅ greenfield-byggd i ff38043a.m-2
  • F20.03.07 Shipped

    Embeddable iframe — embed_url + embed_snippet byggs av SERVERN (ytan bygger aldrig en egen). ⊘ postMessage av dokumenthöjd — ägare ff38043a.m-3.

    ✅ greenfield-byggd i ff38043a.m-2

Analytics & Statistics

F20.04
How it works
  • F20.04.01 Shipped

    Descriptive statistics — mean, median, stddev, 95% CI per question. KI:t använder z för n ≥ 30 och t(0,975, n−1) för n < 30 ur husets ENDA Student-t (internal/stats); talen rundas EN gång vid utgången och determinismen ligger i ORDNINGEN, så två körningar ger byte-identisk per_question

    ✅ greenfield ff38043a.m-4
  • F20.04.02 Shipped

    NPS calculation — classic Net Promoter Score with promoters/passives/detractors. nps_score: null bärs ALLTID av ett nps_reason — en nolla där ett tal saknas är en osanning som ser mätt ut

    ✅ greenfield ff38043a.m-4
  • F20.04.03 Shipped

    Correlation matrix — Pearson/Spearman between numeric questions. Spearman räknas som Pearson på MIDRANKS, aldrig med d²-genvägen (som bara gäller utan bindningar — och en femgradig skala över hundra svar är nästan bara bindningar); de rena funktionerna är låsta mot EXTERNT räknat scipy-facit, inklusive genvägens FEL värde. Paren lagras med sina RÅA p-värden och FDR tillämpas vid LÄSNING över familjen; diagonalen serveras aldrig

    ✅ greenfield ff38043a.m-5
  • F20.04.04 Shipped

    Cramer's V — categorical association strength. Ligger ADDITIVT på segmentsvaret (fråga × dimension) och på query builderns korstabell, med strength som SERVERNS dom över sitt eget tal — aldrig ytans

    ✅ greenfield ff38043a.m-5
  • F20.04.05 Shipped

    Chi-square test — independence test for segment breakdowns. p ur husets ENDA regulariserade gammafunktion (internal/stats, låst mot scipy.special.gammaincc). Grinden är FAIL-CLOSED: en tabell med en DOLD cell testas aldrig (ett chi² där är en ekvation vars enda obekanta ÄR den dolda cellen, och för df = 1 löser den den exakt), och varje E_ij ≥ 5 är ett KRAV — varje utebliven dom bär sitt skäl

    ✅ greenfield ff38043a.m-5
  • F20.04.06 Shipped

    Segment breakdowns — pivot by age, gender, region, license type, discipline, role. Läses ur den FÖRBERÄKNADE snapshoten; unknown är ett eget segment, och en icke-attribuerad enkät svarar segments: null med no_demographics i stället för en tom tabell

    ✅ greenfield ff38043a.m-4
  • F20.04.07 Shipped

    Small-cell suppression — k-anonymity (n<5) for GDPR compliance. EN ren funktion (survey.SuppressTable) med FYRA deklarerade anropare och en tröskel som ALDRIG är ett argument från en tenant: cellen blir "<5", marginalen räknas om utan den, och en ensam kvarvarande cell på en RAD döljs komplementärt till fixpunkt

    ✅ greenfield ff38043a.m-4
  • F20.04.08 Shipped

    Text analysis — TF-IDF, k-means clustering, word frequency. Bär TERMER och TAL — aldrig en mening, ett utdrag eller en människa (tabellen saknar med flit varje sådan kolumn, och frånvaron MÄTS). En term redovisas först vid df ≥ 5 OLIKA svar och ett kluster först vid 5 medlemmar; de bortsållade räknas. Klustrets etikett är dess EGET toppord — ett påhittat tema byggs aldrig. Porten TextAnalysisProvider väljs ur miljön (local/sidecar/none); okänt namn är ett FEL

    ✅ greenfield ff38043a.m-5
  • F20.04.09 Shipped

    Borda count — ranking aggregation for preference questions. k − rank per post med first_place_count bredvid; vid lika poäng avgör frågans EGEN alternativordning (tie-regeln för dubbla rangtal är bokförd som EJ TILLÄMPLIG — ett rankingsvar är en ordnad lista)

    ✅ greenfield ff38043a.m-4
  • F20.04.10 Shipped

    Query builder — ad-hoc analytics queries with crosstab support. Suppressionens TREDJE anropare (samma SuppressTable som segmentpivoten — båda döljer bevisligen exakt samma celler), marginaler och procent omräknade ur enbart de SYNLIGA cellerna, och en filtrerad population under tröskeln besvaras UTAN tabell. Differencing-risken är bokförd och motad med fyra synliga medel: eget mandat surveys:query, tak 30/min, EN audit-rad per körning (frågans form, aldrig ett svar) och populationsgolvet

    ✅ greenfield ff38043a.m-5
  • F20.04.11 Shipped

    Export — CSV, XLSX, JSON export with privacy mode enforcement. Hävden ligger i SQL-FRÅGAN: anonym ⇒ 403 export_blocked_anonymous FÖRE taket, pseudonym ⇒ hashen utan att demografikolumnerna ens väljs, attribuerad ⇒ de sju kolumnerna med "<5" per KOLUMN medan raden står kvar. Husets EGEN OOXML-skrivare — ingen ny beroende

    ✅ greenfield ff38043a.m-4

Quality Control

F20.05
How it works
  • F20.05.01 Shipped

    Straight-lining detection — flags responses with identical Likert values. Kräver minst TRE Likert-värden (matrisrader med column_kind: likert räknas med) — två lika är ingen linje

    ✅ greenfield ff38043a.m-4
  • F20.05.02 Shipped

    Speed outlier detection — flags responses faster than 10% of median. Fälls bara med minst FEM tidsatta svar; under den gränsen säger speed_outlier_basis insufficient_sample i klartext i stället för att döma på tre tal

    ✅ greenfield ff38043a.m-4
  • F20.05.03 Shipped

    Drop-off analysis — tracks where respondents abandon the survey. question_id: null är sin EGEN punkt och står FÖRST: ett utkast utan ett enda svar stannade före första frågan, inte på den

    ✅ greenfield ff38043a.m-4
  • F20.05.04 Shipped

    Quality flags — per-response quality signals for filtering. Flaggorna är svepets DOM och räknas om varje gång underlaget rör sig (de kan alltså tas TILLBAKA); de VISAS och exkluderar aldrig automatiskt någon ur aggregatet — exclude_flagged är en människas uttryckliga val i exporten

    ✅ greenfield ff38043a.m-4

Cross-Tenant Federation

F20.06
How it works
  • F20.06.01 Shipped

    Cross-tenant distribution — FIPJP/CEP can distribute surveys to member nations. Avsändarens typ prövas (fipjp|continental, annars 422 origin_not_eligible) — nation → nation är ett ÄGARBESLUT, inte en default; varje mål får sitt EGET skäl vid ett nej (unknown|ineligible_type|inactive|self) och en dubblett är 409 already_distributed, aldrig en halv distribution

    ✅ greenfield ff38043a.m-6
  • F20.06.02 Shipped

    Opt-in acceptance — receiving tenant must accept before distribution. Beslutet är F1-6:s, i MOTTAGARENS tenant, och fattas på två likvärdiga vägar (enkätinkorgen eller /arenden) — hookparet är kopians och statusens ENDA skrivare och kör i beslutets EGEN transaktion. Kopian föds som draft med cross_tenant_origin, är strukturellt LÅST men språkligt öppen (422 cross_tenant_copy_locked med fältpekare), kan inte raderas (409 survey_received_copy) — och ursprungets close/archive drar tillbaka varje obeslutat ärende (withdrawn) i samma transaktion

    ✅ greenfield ff38043a.m-6
  • F20.06.03 Shipped

    Cross-tenant analytics — aggregated results visible to origin tenant. Sammanslagningen läser mottagarnas snapshoter (merge_primitives), ALDRIG deras svarsrader, är förberäknad av analys-svepets andra plikt och tillämpar k-anonymiteten en FJÄRDE gång efter merge (3 + 4 blir synligt, 3 + 1 förblir dolt). Bidragslistan visar DELTAGANDE — n som tal ≥ 5, annars "<5", null för en icke-accepterad — och korrelationer/textanalys slås aldrig ihop (not_mergeable_from_aggregates)

    ✅ greenfield ff38043a.m-6
  • F20.06.04 Shipped

    Operatörens översikt (ny rad, m-6/D-14) — GET /v1/sys/surveys/overview: enkätvolym, svarsfrekvens, svepens hälsa och flaggade fastnade distributioner tvärs tenants, bakom husets befintliga sys.console.access. LÄS-ONLY och aggregat-only — operatören ser aldrig ett enskilt svar, en respondent eller en distributions message

    ✅ greenfield ff38043a.m-6