Strategy spec (v1, July 2026) for collecting, crunching, and acting on player feedback across creature designs, balance, moves, items, floors, bugs, and systems — sized for one developer. Extends the Analytics & Telemetry plan (Creature Feedback System, hypothesis C6). One sentence: every channel funnels into one warehouse, an AI pass agglomerates tickets into counted themes nightly, and the dev triages ~10 themes a week instead of reading 300 messages.
Requirements traceability
Design note
Delivered by
"Ticket system organized by subject, filtered and agglomerated by subject by AI, so I can decide to work on or discard each feedback and see what got the most attention from the community."
Unified tickets table + nightly AI pass (classify → cluster → score) + themes with an attention score and a work/discard status workflow, surfaced in a triage console.
"Creature stars are only dev visible, but any visitor can rate them. Require steam auth?"
Star widget on creature.html; aggregates render only in admin mode. Ruling below: anonymous stars allowed at reduced weight, Steam sign-in required for any text. Flagged as an amendment to the analytics spec.
Principles
Principle
Rule
One warehouse
Every source — codex widgets, Discord forums, slash command, in-game button, Steam reviews — normalizes into one D1 tickets table. Nothing lives only in a Discord scroll. What isn't in the warehouse doesn't exist.
Meet players where they are
Feedback SaaS vendors converge on one finding: standalone portals go unused; players vent where they already hang out. Our two "where they are" surfaces both exist — the codex (already the reference destination) and the Discord. No third destination is built.
Themes are the unit of work
Tickets are cheap and unbounded; the dev's attention is not. Triage happens at the theme level — a cluster of tickets about the same thing with a count attached. Work/discard decisions are made once per theme, never once per message.
Attention = unique voices
The attention score counts distinct authors (tier-weighted) plus reactions — never raw message volume. One person posting ten times is one voice. Nothing is discarded for scoring low; it just ranks low. Same doctrine as the analytics feedback weighting.
Bugs and opinions are two tracks
The Mojang model: a structured bug tracker and an upvote-style feedback surface are separate intakes with separate templates. A bug needs version + floor + repro steps; an opinion needs a subject + text. Same warehouse, different forms, different console lenses.
Close the loop or it dies
People file good reports only while reports visibly land. Status changes propagate back out: staff tags on Discord threads, a weekly digest post, ship-notifications in the original threads. Every source consulted treats this as the single highest-leverage habit.
Dev-only scores
Creature star aggregates are never public. This also removes the entire payoff of brigading — review-bombing a hidden number influences one reader who can see the raw data behind it.
Free tier only
Cloudflare Worker + D1 (already specced for analytics), GitHub Actions cron, one nightly small-model LLM pass (cents/month). Zero fixed cost, consistent with the backend cost doctrine.
Human decides, AI crunches
The AI classifies, clusters, summarizes, and ranks. It never auto-files work, never auto-replies to players, never auto-discards. Community devs are unanimous that auto-ticketing every Discord message produces noise and bad-idea tickets; the human gate is the quality filter.
What other games & tools do
Source
Practice
What we take
Mojang — Minecraft
Two-track intake: feedback.minecraft.net (upvote portal) for ideas, bugs.mojang.com (public Jira, "Mojira") for defects. Community-moderated; search-before-submit; one issue per report; clear-title + repro-steps guidelines; duplicate votes consolidate onto the original.
The two-track split; search-first culture; one-issue-per-report; structured bug template. We skip the public tracker itself — dev-only console instead.
Coffee Stain — Satisfactory
questions.satisfactorygame.com — a dedicated upvote Q&A portal plus relentless dev-to-community transparency, widely credited for turning feedback into the roadmap.
Upvoting as prioritization signal. We get the same signal free from Discord's default-reaction 👍 + Top sort and widget volume, without hosting a portal.
Discord's own game-dev guide
Recommends Forum channels (not text) for #feedback and #bug-reports; post guidelines enforcing repro steps, platform, version; staff tags like "Under Review" / "Implemented"; dev presence — one genuine reply a day beats a monthly wall of text.
The entire Discord-side structure, verbatim.
Forum-channel practice (community guides)
Required tags (8–15 well-named beats fifty vague); default reaction emoji + "Top" sort turns a forum into an upvote board; lifecycle tags ([open]/[reproduced]/[fixed]/[wontfix]); one job per channel; post titles are the highest-signal text for analysis.
Tag taxonomy below; 👍 default reaction; titles feed the AI clusterer first.
BetaHub (Discord QA tooling)
Bot builds structured reports from casual messages and auto-detects duplicates — five identical crash reports become one issue with a frequency count. Warns that most testers won't fill templates unprompted; tooling must lower the friction.
Exactly the agglomeration shape requested: duplicates collapse into one counted theme. The /feedback command is the low-friction path.
AI feedback SaaS (Chatter, Kinn, GameDataCore, Oplix)
Commercial products doing precisely this for studios: monitor Discord/Steam/forums, cluster related feedback ("47 messages about matchmaking become one pain point with a count"), rank by mention count + growth, auto-notify reporters when a fix ships, weekly digests. Also: spam filtering and translation in the ingest pass.
Validates the design; we self-build the same loop on free infrastructure. Growth-rate ranking (trend), ship-notification, and digest are adopted. Translation folded into the classify pass.
Turtle Rock — Evolve (via analytics plan)
Paired community sentiment with per-character telemetry before moving balance levers.
Already codified as hypothesis C6 — feedback × telemetry quadrants. This pipeline is the feedback half of that join; the shared identity hash makes the join native.
Fig. 1 — Four intakes, one warehouse, one nightly crunch, one console. Dashed intakes are deferred phases. The gold return path is the part most pipelines skip and then die from.
Intake surfaces
A — Codex site (extends the analytics Creature Feedback System)
Element
Spec
Creature stars
On creature.html: ★1–5 + fixed tag chips (Too weak · Too strong · Boring kit · Fun to use · Confusing · Love the art · Art needs work) + optional comment ≤500 chars. One rating per identity per creature, editable, history kept. Aggregates render only in admin mode — visitors see their own rating, never the average.
General feedback form
Floating quill button on codex pages → kind selector (Creature design · Balance · Move · Item · Floor · System · Art · Other) + subject autocomplete fed from the codex CSVs (creatures, moves, items, floors) + text ≤1000 chars. Subject binding at intake is what makes per-subject agglomeration cheap and exact.
Bug report form
Separate form, separate template: build version · realm · floor · steps to reproduce · expected · actual, ≤1500 chars. Steam sign-in required (accountability + dedupe by author).
Later widgets
The same star/tag widget generalizes by subject_ref to item.html, floor.html, and move rows once the creature version is proven. Not v1.
B — Discord restructure
Element
Spec
#suggestions
Forum channel (not text). Required tags: Creature · Move · Balance · Item · Floor · System · Art · UI · Other. Default reaction 👍 + "Top" sort = native upvote board. Post guidelines (shown on every New Post): search first; one idea per post; title = subject + claim ("Omnichimera S3 — Eldritch kit feels passive").
#bug-reports
Forum channel. Required tags: Crash · Battle · UI · Save · Economy · Visual · Other. Post guidelines embed the bug template (version / realm / floor / repro / expected / actual). Attachments enabled — screenshots and videos are half of every bug report's value.
Staff lifecycle tags
Dev-applied only: Under ReviewPlannedIn ProgressShippedDeclinedDuplicateNeeds Info. These mirror theme status and are the visible half of the loop.
/feedback command
Slash command served by the Worker via Discord HTTP interactions — zero hosted bot. Modal with the same kind/subject/text fields, writes straight to D1. The low-friction path for players who will never write a forum post.
Ingestion
Scheduled Worker (cron) polls both forums via Discord REST: new posts → tickets (title + body + tags + 👍 count + thread URL); reaction counts refreshed on poll. Replies are not auto-ticketed — the opening post is the ticket; discussion stays human-read via the thread link.
C — Deferred intakes
In-game report button (F4): one keypress in the Unity client posts to the same Worker endpoint with build, realm, floor, and recent battle context auto-attached — the friction-killer every playtest guide recommends. Rides the backend roadmap step, not before. Steam reviews (post-launch): nightly pull of new reviews via the public storefront API into tickets at low weight — review text is sentiment-rich but subject-poor, so it feeds themes rather than creating them.
subject_ref, author_hash, tier, stars, ts — separate from tickets; powers the dev-only aggregates.
subject_ref is the agglomeration key and reuses codex identity: creature:DFMC-285, move:<id>, item:<id>, floor:41, system:breeding, or none. author_hash is the same salted-hash identity as analytics — the C6 feedback × telemetry join costs nothing.
The nightly AI pass
Pass
What it does
1 — Classify
For each state=new ticket: assign kind; extract subject_ref against the codex CSVs ("Omnichimera hits like a wet noodle" → creature:DFMC-285, Balance); translate non-English to English (community includes JP — no Mojang-style English-only wall); flag spam/empty → state=spam.
2 — Cluster
Embed title+body. Cosine above threshold joins the nearest open theme with matching kind/subject; otherwise a new theme is opened. The model writes or refreshes each touched theme's label and two-sentence summary with one representative quote. Themes never merge automatically — merge is a console button.
3 — Score
attention = Σ unique-author tier weights + 0.1 × reactions; trend_7d = attention gained this week (what's heating up). Nothing is deleted for scoring low — low just ranks low.
Output
Monday digest: top 10 themes by attention, top movers by trend, new themes, totals — one crunched read. A dev-only copy lands in the console; a public copy (minus scores) is postable to #dev-updates.
Runs as a GitHub Actions cron calling the OpenAI API, writing back through an admin-token Worker endpoint. At a few hundred tickets a week on a small model this costs cents per month. Raw feedback text never enters the public repo — it stays in D1.
Triage console — feedback-inbox.html (build item)
Admin-gated page in Dev Tools. Themes ranked by attention; filters by kind, status, subject; each theme expands to its member tickets with source links (jump straight to the Discord thread). One-click status buttons across InboxConsideringPlannedIn ProgressShippedDeclined — Declined requires a one-line decision_note, which becomes the reply material when the loop closes. A ratings board lists lowest-rated / most-rated creatures from the dev-only star data, and the codex admin overlay shows per-creature aggregates in place. Once the telemetry plane lands, the C6 quadrant view (loved-but-weak / hated-but-strong …) joins here.
Closing the loop
Mechanism
Spec
Status sync
Console status change → Worker edits the staff tag on every linked Discord thread. Players watch their post move from Under Review to Planned without asking.
Ship-notify
When a theme goes Shipped, the bot replies once in each member thread: "Landed in patch X.Y — thanks." The single cheapest retention mechanic any of the studied tools offer.
Weekly digest post
Public digest copy to #dev-updates: what's top of mind, what moved status this week. Declined themes are listed with their one-line reason — visible "no" beats silent void.
Patch-note linkage
Patch notes cite theme IDs; the analytics patch protocol already logs every lever change — the theme ID rides in that log entry, so charts, patches, and community asks stay cross-referenced.
Auth ruling — stars vs text
Tier
Who
Can do
Weight
0 — Anonymous
Any visitor; signed cookie UUID + IP rate cap
Star ratings only. No text of any kind.
×0.25
1 — Steam signed-in
Steam OpenID (one click, no password, no account of ours)
Stars, tag chips, comments, feedback tickets, bug reports
×1
2 — Verified climber
Tier 1 + telemetry join shows real playtime (e.g. ≥50 battles; ≥50 with the creature for creature feedback)
Same as Tier 1, badge in console
×2
Answer to the note: do not require Steam auth for stars; require it for anything with text. The reasoning is specific to this design: because aggregates are dev-only, brigading a hidden number has no audience and no payoff, so the classic reason to gate ratings disappears — while the friction cost of forced login on a one-click star is total. Text is different: comments and tickets need accountability, per-author rate caps, and author-dedupe, and OpenID costs the player one click. Anonymous stars are down-weighted, not trusted equally, and the tier is visible per-vote in the console.
Amendment flag: the Analytics & Telemetry page currently specs the creature widget as Steam-auth-gated for all input. This ruling amends it to the tiered model above (anonymous stars at ×0.25). Pending approval; on approval, the analytics page's Auth/Widget rows get a one-line edit.
Moderation, abuse & privacy
Concern
Control
Spam / flooding
Per-identity rate caps (e.g. 20 tickets/day, 1 rating per creature, edits allowed); banned-word filter at the Worker; AI pass flags junk to state=spam. Admin delete is a shadow-discard — excluded from clustering, never surfaced back.
Sockpuppet stars
Cookie + IP caps blunt volume; ×0.25 weight bounds impact; the console can filter aggregates to Tier ≥1 in one click whenever a number looks manipulated.
Discord-side noise
Server verification level gates very new accounts; required tags stop untagged sludge; moderator "Duplicate" tag folds copies onto the original, matching the Mojang consolidation habit.
Privacy
Only salted hashes of SteamID64 / Discord author IDs are stored — never raw IDs, matching the analytics identity doctrine. Free text is the one PII surface; the Export My Data / Delete Account flows already promised for analytics extend to tickets and ratings.
Rollout
Phase
Lands with
Delivers
F0 — now, zero code
An evening of Discord admin
Both forum channels with required tags, post guidelines, 👍 default reaction + Top sort, staff lifecycle tags. Manual weekly skim continues meanwhile. Everything later ingests this structure retroactively.
F1 — site intake
Analytics P3 (independent — any time)
Worker + D1 + Steam OpenID; creature star widget with tiered auth; general feedback + bug forms with subject autocomplete.
F2 — Discord ingestion
After F1
Cron poll of both forums into tickets; /feedback slash command via HTTP interactions.
F3 — the crunch
After F2
Nightly AI pass, attention + trend scoring, Monday digest, feedback-inbox.html console. The design-note requirement is fully live here.
F4 — loop + client
Console live; Unity backend step for the client half
Status sync to thread tags, ship-notify replies, public digest post; in-game report button; Steam review pull post-launch.
Cost
Cloudflare Worker + D1 free tier (the same instance the analytics plan provisions — 100k writes/day of headroom); GitHub Actions cron, free; nightly small-model classification at a few hundred tickets a week, cents per month on the existing OpenAI account; Discord slash command as HTTP interactions on the Worker — no hosted bot, no VPS. Fixed cost: $0.