# Media and Gynoid discussions

![Rykara connects a music-video timeline with public discussion in a Gynara editing studio.](/images/engineering/gynara-v2/rykara-media-discussions.webp)

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](https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html),
[input validation](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html), and
[OAT-017 Spamming](https://owasp.github.io/www-project-automated-threats-to-web-applications/assets/oats/EN/OAT-017_Spamming.html).

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 `ApplicationDbContextFactoryTests` checking both active model snapshots without a database.
- The two Community JavaScript suites passed all 10 tests; the desktop/mobile
  `community-comment-position.test.cjs` browser 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.cs` and `CurrentRuntimeInspection.cs`.
- The transitive NuGet audit reported no known vulnerable packages in the configured sources.
  Public, Studio and Workers Release packages passed `Test-DrakimaSplitPublishPackages.ps1` in 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](media-and-sprites.md#shared-bat-cursors). 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](content-and-publishing.md#video-descriptions-and-discussion-sources) for
the authoring standard, [AI and speech](ai-and-speech.md) for provider contracts, and
[media ownership](media-and-sprites.md) 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`.
