70 lines
11 KiB
YAML
70 lines
11 KiB
YAML
{
|
|
"states": {
|
|
"idea_captured": {},
|
|
"prompt_moderating": {},
|
|
"config_generating": {},
|
|
"config_validating": {},
|
|
"draft_version_creating": {},
|
|
"manifest_building": {},
|
|
"runtime_testing": {},
|
|
"draft_ready": {},
|
|
"game_ir_compiling": {},
|
|
"game_logic_validating": {},
|
|
"game_package_building": {},
|
|
"web_runtime_testing": {},
|
|
"minigame_converting": {},
|
|
"minigame_static_validating": {},
|
|
"minigame_packaging": {},
|
|
"devtool_import_smoking": {},
|
|
"generation_failed": {},
|
|
"pending_review": {},
|
|
"publish_ready": {},
|
|
"rejected": {},
|
|
"published": {},
|
|
"feed_exposed": {},
|
|
"telemetry_collecting": {},
|
|
"optimization_proposed": {},
|
|
"unpublish_pending": {},
|
|
"unpublished": { "reservedState": true }
|
|
},
|
|
"transitions": [
|
|
{ "event": "prompt_submitted", "from": "idea_captured", "to": "prompt_moderating", "required_role": "creator", "approval": "auto", "required_record": ["PromptRecord", "GenerationTask.status=queued"], "audit_event": "lifecycle.prompt_submitted", "rollback_hint": "Delete prompt draft before generation starts." },
|
|
{ "event": "prompt_moderation_passed", "from": "prompt_moderating", "to": "config_generating", "required_role": "worker", "approval": "auto", "required_record": ["PromptRecord.moderationStatus=passed"], "audit_event": "lifecycle.prompt_moderation_passed", "rollback_hint": "Mark prompt for manual review." },
|
|
{ "event": "prompt_moderation_rejected", "from": "prompt_moderating", "to": "rejected", "required_role": "worker", "approval": "auto", "required_record": ["PromptRecord.moderationStatus=rejected", "LifecycleEvent.reasonCode"], "audit_event": "lifecycle.prompt_moderation_rejected", "rollback_hint": "Creator edits prompt and resubmits." },
|
|
{ "event": "generation_started", "from": "config_generating", "to": "config_validating", "required_role": "worker", "approval": "auto", "required_record": ["GenerationTask.status=running", "GameConfig"], "audit_event": "lifecycle.generation_started", "rollback_hint": "Retry generation with same idempotency key." },
|
|
{ "event": "config_validated", "from": "config_validating", "to": "draft_version_creating", "required_role": "worker", "approval": "auto", "required_record": ["GameConfig.validationStatus=passed", "generationTaskId"], "audit_event": "lifecycle.config_validated", "rollback_hint": "Return validation errors to generation worker." },
|
|
{ "event": "draft_version_created", "from": "draft_version_creating", "to": "manifest_building", "required_role": "worker", "approval": "auto", "required_record": ["GameVersion.status=draft", "generationTaskId"], "audit_event": "lifecycle.draft_version_created", "rollback_hint": "Mark draft version failed and keep prior current version." },
|
|
{ "event": "manifest_built", "from": "manifest_building", "to": "runtime_testing", "required_role": "worker", "approval": "auto", "required_record": ["GameManifest", "manifestSha256", "generationTaskId"], "audit_event": "lifecycle.manifest_built", "rollback_hint": "Remove manifest asset and rebuild." },
|
|
{ "event": "runtime_smoke_passed", "from": "runtime_testing", "to": "draft_ready", "required_role": "worker", "approval": "auto", "required_record": ["RuntimeSmokeResult.status=passed", "GameVersion.status=draft", "generationTaskId"], "audit_event": "lifecycle.runtime_smoke_passed", "rollback_hint": "Keep draft hidden until fixed." },
|
|
{ "event": "generation_failed", "from": ["config_generating", "config_validating", "draft_version_creating", "manifest_building", "runtime_testing"], "to": "generation_failed", "required_role": "worker", "approval": "auto", "required_record": ["GenerationTask.errorCode", "LifecycleEvent.reasonCode", "generationTaskId"], "audit_event": "lifecycle.generation_failed", "rollback_hint": "Retry only with same generationTaskId or create a new task." },
|
|
{ "event": "draft_regenerate_requested", "from": ["draft_ready", "generation_failed"], "to": "config_generating", "required_role": "creator", "approval": "quick_confirm", "required_record": ["GenerationTask.status=queued"], "audit_event": "lifecycle.draft_regenerate_requested", "rollback_hint": "Cancel queued generation task." },
|
|
{ "event": "review_submitted", "from": "draft_ready", "to": "pending_review", "required_role": "creator", "approval": "explicit_user", "required_record": ["GameVersion.status=candidate", "PublishCheck.status=passed"], "audit_event": "lifecycle.review_submitted", "rollback_hint": "Return version to draft." },
|
|
{ "event": "review_approved", "from": "pending_review", "to": "publish_ready", "required_role": "operator", "approval": "operator", "required_record": ["ReviewRecord.decision=approved", "ReviewRecord.reasonCode"], "audit_event": "lifecycle.review_approved", "rollback_hint": "Create reversing review record before promotion." },
|
|
{ "event": "review_rejected", "from": "pending_review", "to": "rejected", "required_role": "operator", "approval": "operator", "required_record": ["ReviewRecord.decision=rejected", "ReviewRecord.reasonCode"], "audit_event": "lifecycle.review_rejected", "rollback_hint": "Creator regenerates or edits draft." },
|
|
{ "event": "current_version_promoted", "from": "publish_ready", "to": "published", "required_role": "system", "approval": "state_machine", "required_record": ["Game.currentVersionId", "GameVersion.status=active", "previousActive.status=archived"], "audit_event": "lifecycle.current_version_promoted", "rollback_hint": "Restore previousCurrentVersionId." },
|
|
{ "event": "feed_candidate_added", "from": "published", "to": "feed_exposed", "required_role": "system", "approval": "state_machine", "required_record": ["FeedCandidate"], "audit_event": "lifecycle.feed_candidate_added", "rollback_hint": "Remove feed candidate." },
|
|
{ "event": "telemetry_window_closed", "from": "feed_exposed", "to": "telemetry_collecting", "required_role": "system", "approval": "auto", "required_record": ["TelemetryWindow.status=closed"], "audit_event": "lifecycle.telemetry_window_closed", "rollback_hint": "Recompute telemetry window." },
|
|
{ "event": "optimization_proposed", "from": "telemetry_collecting", "to": "optimization_proposed", "required_role": "agent", "approval": "auto_suggest_only", "required_record": ["OptimizationProposal"], "audit_event": "lifecycle.optimization_proposed", "rollback_hint": "Archive proposal." },
|
|
{ "event": "candidate_version_requested", "from": "optimization_proposed", "to": "config_generating", "required_role": "creator", "approval": "explicit_user", "required_record": ["OptimizationProposal.status=accepted", "GenerationTask.status=queued"], "audit_event": "lifecycle.candidate_version_requested", "rollback_hint": "Cancel queued generation task." },
|
|
{ "event": "requirement_brief_confirmed", "from": "prompt_moderating", "to": "game_ir_compiling", "required_role": "creator", "approval": "explicit_user", "required_record": ["PromptRecord.moderationStatus=passed", "RequirementBrief"], "audit_event": "lifecycle.requirement_brief_confirmed", "rollback_hint": "Return brief to creator before IR compilation." },
|
|
{ "event": "game_ir_compiled", "from": "game_ir_compiling", "to": "game_logic_validating", "required_role": "worker", "approval": "auto", "required_record": ["GameIR"], "audit_event": "lifecycle.game_ir_compiled", "rollback_hint": "Discard compiled IR and reapply design section patches." },
|
|
{ "event": "game_logic_validated", "from": "game_logic_validating", "to": "game_package_building", "required_role": "worker", "approval": "auto", "required_record": ["GameLogicModule.validationStatus=validated", "GameLogicModule.validationReportId", "GameLogicModule.artifactPath", "GameLogicModule.checksum", "ValidationReport.result=passed", "ValidationReport.checksum matches GameLogicModule.checksum", "ValidationReport.sourceHash matches GameLogicModule sourceRef"], "audit_event": "lifecycle.game_logic_validated", "rollback_hint": "Keep module out of packaging and rerun validation with the same sourceRef." },
|
|
{ "event": "game_package_built", "from": "game_package_building", "to": "web_runtime_testing", "required_role": "worker", "approval": "auto", "required_record": ["GamePackage.targetRuntime=web"], "audit_event": "lifecycle.game_package_built", "rollback_hint": "Remove package artifact and rebuild from validated module." },
|
|
{ "event": "web_smoke_passed", "from": "web_runtime_testing", "to": "pending_review", "required_role": "worker", "approval": "auto", "required_record": ["RuntimeSmokeEvidence.status=passed"], "audit_event": "lifecycle.web_smoke_passed", "rollback_hint": "Keep version hidden and rerun web runtime smoke." },
|
|
{ "event": "minigame_conversion_requested", "from": "game_package_building", "to": "minigame_converting", "required_role": "worker", "approval": "auto", "required_record": ["GamePackage.targetRuntime=minigame", "MiniGameCodeConversion"], "audit_event": "lifecycle.minigame_conversion_requested", "rollback_hint": "Cancel conversion request and keep the source package unchanged." },
|
|
{ "event": "minigame_converted", "from": "minigame_converting", "to": "minigame_static_validating", "required_role": "worker", "approval": "auto", "required_record": ["MiniGameProject"], "audit_event": "lifecycle.minigame_converted", "rollback_hint": "Delete converted project shell and rerun conversion from source package." },
|
|
{ "event": "minigame_static_validated", "from": "minigame_static_validating", "to": "minigame_packaging", "required_role": "worker", "approval": "auto", "required_record": ["ConversionReport.status=static_validated"], "audit_event": "lifecycle.minigame_static_validated", "rollback_hint": "Return conversion report findings to the conversion worker." },
|
|
{ "event": "minigame_packaged", "from": "minigame_packaging", "to": "devtool_import_smoking", "required_role": "worker", "approval": "auto", "required_record": ["GamePackage.targetRuntime=minigame"], "audit_event": "lifecycle.minigame_packaged", "rollback_hint": "Remove mini-game package artifact and rebuild after static validation." },
|
|
{ "event": "devtool_import_smoked", "from": "devtool_import_smoking", "to": "pending_review", "required_role": "worker", "approval": "auto", "required_record": ["DevToolImportEvidence.result=passed", "DevToolImportEvidence.projectChecksum matches MiniGameProject.projectChecksum", "EvidenceRecord.result=passed", "EvidenceRecord.checksum matches DevToolImportEvidence.projectChecksum", "RuntimeSmokeEvidence.status=passed", "RuntimeSmokeEvidence.gameVersionId matches DevToolImportEvidence.gameVersionId"], "audit_event": "lifecycle.devtool_import_smoked", "rollback_hint": "Keep mini-game package out of review and rerun import smoke." },
|
|
{ "event": "unpublish_requested", "from": "published", "to": "unpublish_pending", "required_role": "operator", "approval": "operator", "required_record": ["UnpublishRequest.reasonCode"], "audit_event": "lifecycle.unpublish_requested", "rollback_hint": "Cancel pending unpublish request before execution." }
|
|
],
|
|
"guards": {
|
|
"external_distribution_mvp_status": "forbiddenInMvp",
|
|
"external_distribution_future_requires_explicit_approval": true,
|
|
"ai_cannot_promote_current_version": true,
|
|
"ai_cannot_change_review_decision": true
|
|
},
|
|
"high_risk_events": ["review_submitted", "review_approved", "review_rejected", "current_version_promoted", "unpublish_requested"],
|
|
"forbiddenEvents": ["external_distribution_requested"]
|
|
}
|