Surveys & Research
35 features · 6 subsystems
Complete survey platform for the petanque ecosystem — from FIPJP rule consultations to club member satisfaction surveys.
Survey Builder
F20.01- 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- 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- 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- 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- 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- F20.06.01 Shipped
Cross-tenant distribution — FIPJP/CEP can distribute surveys to member nations
✅ PL-T079 - F20.06.02 Shipped
Opt-in acceptance — receiving tenant must accept before distribution
✅ PL-T079 - F20.06.03 Shipped
Cross-tenant analytics — aggregated results visible to origin tenant
✅ PL-T079
No features match your filters.