Files

6.8 KiB

ADDED Requirements

Requirement: Server-scoped gift package CRUD

The system SHALL provide effective-user-authorized create, read, update, enable/disable, and delete operations for gift packages and typed items scoped to one server instance and compatible plugin/game version.

Scenario: User has gift read access only

  • WHEN the current session has server.game-client.read but lacks server.game-client.maintenance
  • THEN package data and delivery history remain readable while create/edit/enable/delete controls are unavailable and direct mutation requests are forbidden

Scenario: Operator creates a valid package

  • WHEN an operator with effective server.game-client.maintenance submits a name, classification, eligibility/limit rules, and bounded quantities of plugin-catalogued item keys
  • THEN Platform stores the package and items for the target server without storing raw RCON, shell, SQL, or arbitrary command strings

Scenario: Package item is invalid

  • WHEN a package contains an unknown or incompatible item key, duplicate item, out-of-range quantity, or game-version mismatch
  • THEN Platform rejects the change and preserves the previous package

Scenario: Package is deleted

  • WHEN an authorized operator confirms deletion of a package not protected by an active delivery
  • THEN Platform removes or retires the package without deleting immutable completed delivery facts

Requirement: Plugin-owned immutable gift catalog and transport

Gift item aliases, compatibility rules, quantities, and delivery transport declarations SHALL come only from versioned digest-referenced assets in the plugin package and, where executable, the generated Run package.

Scenario: Catalog or transport digest changed

  • WHEN a package or frozen delivery references a catalog/transport version or digest that no longer matches the active compatible plugin package
  • THEN Platform rejects creation or dispatch and SHALL NOT translate the item into an arbitrary command or newer unreviewed alias

Requirement: Validated gift eligibility and limits

The system SHALL evaluate package eligibility and atomically reserve database-backed per-player, per-server, and configured period limits in the server's declared timezone before a delivery can dispatch.

Scenario: Player belongs to another server

  • WHEN a caller attempts to deliver a package to a player record outside the package's server instance
  • THEN Platform rejects the request before creating a delivery or Run job

Scenario: Period limit is reached

  • WHEN a player already has the allowed number of reserved, in-progress, partial, unknown, or delivered grants in the active daily/weekly or declared period boundary
  • THEN Platform rejects another delivery without relying on an in-memory count

Scenario: Concurrent eligibility requests occur

  • WHEN two workers request the same limited package for the same player and period concurrently
  • THEN a server-scoped uniqueness/idempotency constraint allows at most one request to reserve the remaining entitlement

Scenario: Delivery conclusively did not execute

  • WHEN Run returns a conclusive failure proving that no gift effect occurred
  • THEN Platform may release the reserved period entitlement transactionally; partial or unknown outcomes SHALL continue to hold it until reconciled

Requirement: Frozen and idempotent gift delivery

The system SHALL freeze the target player, package/item definitions, plugin/game version, and delivery parameters before dispatch and SHALL use a stable server-scoped delivery ID and idempotency key.

Scenario: Package changes after delivery request

  • WHEN an operator edits or disables a package after a delivery has been created
  • THEN the existing delivery retains its frozen target/items/version and the edit does not mutate an in-flight or completed delivery

Scenario: Same idempotency key is submitted again

  • WHEN the same scoped delivery request is repeated or submitted concurrently
  • THEN Platform returns the original delivery and queues no duplicate effect

Scenario: Run receives a delivery

  • WHEN a user with current effective server.game-client.command confirms an eligible frozen delivery
  • THEN Run receives only the plugin-declared typed item aliases/quantities and stable delivery identity, not arbitrary browser commands

Requirement: Conclusive delivery outcomes

The system SHALL record a gift as delivered only after conclusive Run execution evidence, and ambiguous or partial outcomes SHALL not trigger automatic whole-package redelivery.

Scenario: Job is queued or accepted

  • WHEN Run has only claimed, acknowledged, or begun the delivery job
  • THEN Platform records the delivery as in progress and SHALL NOT create a successful claim/receipt

Scenario: Delivery succeeds conclusively

  • WHEN Run returns a schema-valid success receipt for every required item under the delivery idempotency key
  • THEN Platform records the delivery as delivered exactly once

Scenario: Connection is lost after possible execution

  • WHEN delivery may have executed but the result is missing, timed out, cancelled, or cannot be confirmed
  • THEN Platform records an unknown outcome, performs confirmation before any explicit retry, and never automatically queues the entire delivery again

Scenario: Multi-item delivery is partial

  • WHEN the transport cannot guarantee atomic delivery and only some item receipts are conclusive
  • THEN Platform records per-item receipts and a partial/unknown package outcome and SHALL NOT label the whole package delivered or blindly redeliver confirmed items

Scenario: Notification fails after delivery

  • WHEN all items are confirmed delivered but a post-delivery notification fails
  • THEN Platform preserves the delivered fact, records the notification failure separately, and SHALL NOT redeliver the package

Requirement: Gift management surface and history

The gift page SHALL provide statistics, a searchable/filterable paginated package table, package create/edit/detail/delete controls, a real player selector, a reviewed send dialog, and server-scoped delivery history without Workflow terminology.

Scenario: Operator opens gift management

  • WHEN local gift data is available
  • THEN the page shows package totals/enabled counts/delivery statistics, package contents and limits, and compact row actions without a hard-coded starter-pack, fixed player cards, or fixed notification text

Scenario: Operator reviews delivery result

  • WHEN a delivery is in progress, delivered, failed, unknown, partial, or has a notification failure
  • THEN the page shows the ordinary gift-delivery result and safe reason without exposing a Workflow instance, Workflow step, raw command, or audit-initiation action