neon-sprawl/docs/decomposition/modules/E7_M4_ContractMissionGenera...

5.7 KiB
Raw Blame History

E7.M4 — ContractMissionGenerator

Summary

Field Value
Module ID E7.M4
Epic Epic 7 — Quest / Faction
Stage target Pre-production
Status In Progress — Slice 4 backlog E7M4-pre-production-backlog.md: E7M4-01 NEO-144E7M4-11 NEO-154. Upstream: E5.M3 Ready, E7.M3 Ready; E4.M1 zone graph deferred (content-only zoneDifficultyBand in Slice 4 v1).

Purpose

Semi-procedural repeatable contracts from templates, keyed by zone difficulty (E4.M1), encounter templates (E5.M3), and faction state (E7.M3).

Responsibilities

  • Emit validated ContractTemplate instances from ContractSeed; record ContractOutcome.

Key contracts

Contract Role
ContractTemplate Parameterized mission skeleton.
ContractSeed RNG or daily seed inputs.
ContractOutcome Completion and reward linkage.

Module dependencies

  • E4.M1 — ZoneGraphAndTravelRules (live zone read deferred; content band in Slice 4 v1).
  • E5.M3 — EncounterAndRewardTables.
  • E7.M3 — FactionReputationLedger.

Dependents (by design)

  • Live ops and content pipelines; validate against economy/parity rules per epic.

Epic 7 Slice 4contract_issued, contract_complete, reward anomalies. Backlog: E7M4-pre-production-backlog.md.

Prototype Slice 4 freeze (E7M4-01)

One frozen template; objective encounter_clear on prototype_combat_pocket; repeat payout via completionRewardBundle (separate idempotency from quest + first-time encounter loot).

ContractTemplate.id zoneDifficultyBand encounterTemplateId minFactionStanding completionRewardBundle
prototype_contract_clear_combat_pocket 1 prototype_combat_pocket prototype_faction_grid_operators 0 scrap_metal_bulk ×5; salvage 15 (mission_reward)

Band policy (E7M4-07): band 1 caps — max 10 per item grant, 25 skill XP per grant, 10 rep per grant.

Idempotency: {playerId}:contract_complete:{contractInstanceId}. Active cap: one active contract per player (prototype).

CI (NEO-144): content/contracts/prototype_contract_templates.json validated by scripts/validate_content.py — schema, single-template roster, freeze table, encounter/item/skill/faction cross-refs, band-1 economy caps. Schemas: contract-template.schema.json, contract-seed.schema.json.

Server load (NEO-145): host fail-fast load of content/contracts/*_contract_templates.json via ContractTemplateCatalogLoader + IContractTemplateRegistry — same E7M4 gates as CI at startup; server README — Contract template catalog.

Runtime stores (NEO-146): per-player IContractInstanceStore (one active instance) + append-only IContractOutcomeStore; server README — Contract instance store.

Generator operations (NEO-147): ContractGeneratorOperations.TryIssue — template selection, deterministic instance ids, structured deny codes; server README — Contract generator operations.

Economy validation at issue (NEO-150): ContractEconomyValidation.TryValidateTemplate — band caps + reward-bundle cross-refs before persist; deny economy_cap_exceeded / invalid_reward_bundle; server README — Contract generator operations.

Reward parity stub: prototype band caps enforce Slice 4 policy only. Full E6.M4 RewardParityMap and E3.M5 balance dashboards are deferred.

Contract reward router (NEO-148): RewardRouterOperations.TryDeliverContractCompletion — idempotent contract completionRewardBundle apply with key {playerId}:contract_complete:{contractInstanceId}; server README — Reward router.

Contract completion wiring (NEO-149): ContractCompletionOperations.TryCompleteOnEncounterClear — encounter clear completes matching active instance + outcome audit; server README — Contract completion operations.

Contract HTTP (NEO-151): POST …/contracts/issue + GET …/contracts — issue envelope + per-player list with encounterTemplateId and completionRewardSummary on completed rows; Bruno bruno/neon-sprawl-server/contracts/; server README — Contract issue HTTP (NEO-151), Per-player contract list HTTP (NEO-151); plan NEO-151.

Source anchors