docs/current/media-and-community.md
Download Markdown

Music, videos, Gallery artwork, Journal entries, lore and light novels share the Gynara Legend universe. A useful character conversation needs the published work's context, not just a filename or a one-line caption.
What a video contributes
Published videos have an authored description, associated public Gynoids and optional album/track links. Music-video context can therefore include the linked song's existing lyrics and album identity. The publishing standard requires a substantive description (200–4,000 characters), eligible public cast, and valid lyric-bearing music links when supplied. Authors describe the premise, character connection, themes and observable events; they should identify interpretation and avoid inventing unseen scenes.
The initial catalog connects Mistress of the Night to Rykara and its song, Eccentric Doll to The Eccentric Doll and its song, and Akari and the Clock to Akari as a standalone video. These are maintained content relationships, not a title-matching guess in the browser.
A tagged reply
Community safety before publication
Journal, Video, Gallery and Novel chapter comments and replies use the same server-side safety gate. Links/contact addresses are rejected before persistence or inference, including common Markdown/HTML, Unicode, percent-encoded and disguised-dot forms. The original member text is preserved; normalization is only used for screening. No URL is fetched. The widget explains rejections and retains the draft.
The separate CommunityCommentModeration AI role reviews the whole submission with at most six public
ancestors and four recent public posts by its author. It receives no character card, private chat,
personal memory, credentials or tools. An allowlisted structured decision is required to publish.
Spam, scams, impersonation, targeted abuse, real-world threats, privacy violations, prompt manipulation
and uncertain results remain hidden. Provider failure, overload, malformed/truncated output and a
25-second review deadline also produce a private admin hold. Safety checks do not require or spend
member AI credits. Mature fictional discussion and ordinary criticism are legitimate content.
Specific claims that a member's account is compromised, friendly offers to recover/verify it, and member-to-member recovery instructions are held even without a link. Account-security concerns go privately to an admin through Support. General education warning about these scams is allowed.
Held submissions create no public reply, Gynoid generation request, or body-preview notification.
They use the existing soft-removal state and a reserved AutomatedSafetyReview report, associated with
the author for existing ownership/erasure rules; this is not a report made by that member and does not
consume the member report allowance. No schema migration is required. Admins see the held text and
parent context in Community Moderation and can Approve Post or Keep Hidden. Decisions record
the operator, time and note, and notify the author privately. Approval restores text only; it does not
start a delayed paid Gynoid reply. Deleted parents, restricted authors and links prevent restoration.
Members can use Report spam or abuse on another member's comment, reply or Gynoid reply, including the Scam and Account security scam reasons. Reporter identity is never public. Reports are deduplicated per member/post and limited to 20 per day. A member report queues human review without automatically hiding another member's post; this limits malicious mass-reporting. Account discipline remains a human decision in the existing member-standing workflow. New submissions remain subject to the existing verified-adult, antiforgery, account-standing and write-rate limits.
There are at most two concurrent safety inferences per web process, with no inference wait queue. Per-member posting/reporting coordination uses a bounded process-local gate; relational review transactions are serializable. Before scaling to multiple public replicas, configure shared ingress abuse limits as well. Exact repeated long posts are held on the third occurrence in the recent sample. Generated Gynoid replies cannot publish links or automatically override a moderation hold either.
The moderation policy is code-owned; custom character prompt templates cannot replace it. AI decisions can be mistaken, which is why member reports, reversible holds and admin review remain necessary. Existing posts are not retroactively rescanned by this change. Admins should clear the review queue regularly, especially after provider outages. Deployment and email-verification rollout are separate.
The implementation follows layered validation and human-review guidance from OWASP prompt-injection prevention, input validation, and OAT-017 Spamming.
Owners: Services/Social/CommunityCommentSafety*.cs,
Infrastructure/Social/ApplicationDbContextCommunitySafetyContext.cs,
src/DrakimaCore.Runtime/Ai/CommunitySafetyPrompt.cs, ContentEngagementService, and
CommunityModerationService. Regression coverage includes CommunityCommentSafetyTests,
CommunityThreadRefreshTests, Gallery moderation cases and community-comment-position.test.cjs.
November 7, 2026 local verification
Verified on Windows, .NET 10, PostgreSQL 17 and headless Edge from base 7f13b7e61 plus this change:
- Release Full solution and Debug everyday solution builds passed without warnings or errors. PublicWeb's explicit development Arcade preparation cold-admitted the updated host graph without gameplay or database changes. Installed game releases were not republished.
- Focused Release .NET runs passed: 346 unit tests (Community, ContentEngagement, AI access/context,
Gynoid presence and LM Studio), 110 host tests (Community, NovelReader, Gallery and AkariWorkroom),
and four
ApplicationDbContextFactoryTestschecking both active model snapshots without a database. - The two Community JavaScript suites passed all 10 tests; the desktop/mobile
community-comment-position.test.cjsbrowser journey passed, including held replies and retained drafts. All 269 source JavaScript files passed syntax checks. Decomposition ratchet fixtures passed all nine cases. - Changed C# files passed formatting verification. The full formatting check still reports pre-existing
whitespace in
VisualNovelCampaignTests.csandCurrentRuntimeInspection.cs. - The transitive NuGet audit reported no known vulnerable packages in the configured sources.
Public, Studio and Workers Release packages passed
Test-DrakimaSplitPublishPackages.ps1in a temporary publish directory. This was package validation, not deployment. - Repository size guards passed before and after the work (50.884 GiB final against 60 GiB allowed). Verification hosts were stopped and inactive repository Release output was cleaned.
- The configured local Gemma model classified all 11 synthetic examples correctly. Real browser posts by an ordinary Member published normal discussion and anti-scam education, held credential bait and a friendly compromised-account warning, and rejected a link before persistence. A second temporary Member verified private reporting. The Member could not access Admin moderation; the Admin kept the account-security bait hidden and resolved the test report. Five fixture posts, three reports, their notifications and the temporary second account were removed. The requested QA Member was retained.
The broad JavaScript invocation also included unrelated game and recovery-fixture categories: 1,209
passed, two failed and five skipped. Failures were the folder-migration dry-run assertion (before its
backup-producing branch) and the existing Valkyrie lilith/photon-crossfire sound-binding expectation.
Those suites were not repeated. Full .NET gameplay/recovery suites were excluded under the owner's
manual-gameplay/no-backup policy. These results are focused moderation evidence, not a full beta sign-off.
Email delivery/verification rollout and external deployment remain later acceptance work.
Character replies
The community workflow resolves an eligible mention, the published parent resource, the discussion and its existing character-participation rules. Video context combines the approved description, public cast/lore and linked lyrics within a bounded source payload. It does not inspect video frames automatically, import a member's private-room conversation or rewrite a character card.
The generated candidate passes the existing review/publication owner. A queued mention is not a guarantee of an immediate reply. Community replies let the provider determine output length; an incomplete provider result is not published as a finished answer. Public comments remain public participation, distinct from private Gynoid chats and their billing/history contracts.
Playback and refreshing
Gallery artwork posts use a centered reading column with the full description and lore below the image. Gallery links and artwork enlargement use the shared cycling bat cursors described in media and sprites. Selecting the artwork opens a lightbox fitted to the whole image, with its pink border at the image edge, a bottom-center X, Escape and backdrop dismissal. Community threads support likes, replies, reports and Gynoid mentions through the same participation and moderation services as Journal posts. Each artwork has its own discussion identity and notification destination. Tagged replies receive the published title, summary and authored description, subject to the existing context limit; this does not give the model visual access to the image. Public artwork, image and character visibility are checked again before queued replies can be generated or published. Gallery polling requests only the admitted artwork identity and thread fragment, preserving the page and open lightbox.
Watch pages retain their player, related videos and collection context. Comment polling uses the thread-fragment route and coalesces overlapping refreshes so a new reply does not restart the whole watch-page query. Leaving a page can still cancel its request normally. Clearing notifications updates the current page's inbox state without forcing navigation to the Notifications page.
See content and publishing for the authoring standard, AI and speech for provider contracts, and media ownership for asset handling.
Implementation evidence: Services/Videos/PublicVideoLibraryService.cs, Services/Community,
src/DrakimaCore.Public.Web/Areas/Media/Controllers/VideosController.cs,
src/DrakimaCore.Public.Web/Controllers/AccountNotificationsController.cs,
Tests/DrakimaCore.HostIntegrationTests/CommunityThreadRefreshTests.cs.