{
  "policy": {
    "version": 5,
    "patterns": {
      "version": 1,
      "method": "CURATED_PRACTICE_TOPIC",
      "notice": "Pattern topics identify design choices to practice. Read the ticket's acceptance criteria and justify the simplest suitable approach. Tags are not capability or ownership evidence; an untagged ticket has no curated pattern topic assigned."
    },
    "fieldMix": {
      "version": 1,
      "method": "CURATED_ESTIMATE",
      "notice": "Field percentages are editorial estimates of the ticket's engineering focus. They total 100%; they are not measured time, proficiency scores, or ownership evidence."
    },
    "contentStatus": "PRACTICE_BRIEF",
    "assessmentStatus": "NOT_QUALIFIED",
    "evidenceUse": "NONE",
    "aiPolicy": "AI tools are welcome during implementation. Record assumptions, review the result, and verify its behavior.",
    "notice": "Fictional engineering practice briefs. Starter repositories, fixtures, automated grading, and verified ownership are not included.",
    "outcomeEvidence": "Tests, patches, and runbooks are requested deliverables. They become Outcome Evidence only through a qualified Mission and immutable Evidence IDs.",
    "ownershipEvidence": "Independent adaptation must be observed under a declared verification policy and cite immutable Evidence IDs. Completing a planning ticket establishes no Ownership Evidence."
  },
  "patternTopics": [
    {
      "id": "factory-method",
      "label": "Factory Method",
      "group": "Creational"
    },
    {
      "id": "abstract-factory",
      "label": "Abstract Factory",
      "group": "Creational"
    },
    {
      "id": "builder",
      "label": "Builder",
      "group": "Creational"
    },
    {
      "id": "prototype",
      "label": "Prototype",
      "group": "Creational"
    },
    {
      "id": "singleton",
      "label": "Singleton",
      "group": "Creational"
    },
    {
      "id": "adapter",
      "label": "Adapter",
      "group": "Structural"
    },
    {
      "id": "bridge",
      "label": "Bridge",
      "group": "Structural"
    },
    {
      "id": "composite",
      "label": "Composite",
      "group": "Structural"
    },
    {
      "id": "decorator",
      "label": "Decorator",
      "group": "Structural"
    },
    {
      "id": "facade",
      "label": "Facade",
      "group": "Structural"
    },
    {
      "id": "flyweight",
      "label": "Flyweight",
      "group": "Structural"
    },
    {
      "id": "proxy",
      "label": "Proxy",
      "group": "Structural"
    },
    {
      "id": "chain-of-responsibility",
      "label": "Chain of Responsibility",
      "group": "Behavioral"
    },
    {
      "id": "command",
      "label": "Command",
      "group": "Behavioral"
    },
    {
      "id": "interpreter",
      "label": "Interpreter",
      "group": "Behavioral"
    },
    {
      "id": "iterator",
      "label": "Iterator",
      "group": "Behavioral"
    },
    {
      "id": "mediator",
      "label": "Mediator",
      "group": "Behavioral"
    },
    {
      "id": "memento",
      "label": "Memento",
      "group": "Behavioral"
    },
    {
      "id": "observer",
      "label": "Observer",
      "group": "Behavioral"
    },
    {
      "id": "state",
      "label": "State",
      "group": "Behavioral"
    },
    {
      "id": "strategy",
      "label": "Strategy",
      "group": "Behavioral"
    },
    {
      "id": "template-method",
      "label": "Template Method",
      "group": "Behavioral"
    },
    {
      "id": "visitor",
      "label": "Visitor",
      "group": "Behavioral"
    },
    {
      "id": "ports-and-adapters",
      "label": "Ports and Adapters",
      "group": "Architectural"
    },
    {
      "id": "cqrs",
      "label": "CQRS",
      "group": "Architectural"
    },
    {
      "id": "strangler-fig",
      "label": "Strangler Fig",
      "group": "Architectural"
    },
    {
      "id": "saga",
      "label": "Saga",
      "group": "Distributed and reliability"
    },
    {
      "id": "transactional-outbox",
      "label": "Transactional Outbox",
      "group": "Distributed and reliability"
    },
    {
      "id": "circuit-breaker",
      "label": "Circuit Breaker",
      "group": "Distributed and reliability"
    },
    {
      "id": "bulkhead",
      "label": "Bulkhead",
      "group": "Distributed and reliability"
    }
  ],
  "projects": [
    {
      "id": "ebf9937a-23c7-42f3-8025-beea18139db6",
      "key": "ARESTORE",
      "title": "Prove a PostgreSQL backup can restore usable application state",
      "field": "Database engineering",
      "summary": "Build a bounded backup inventory and rehearse restoration with consistency checks.",
      "context": "A fictional case-management team has nightly backup files but has never tested application behavior after restore. Missing roles and external artifact references may make a successful database restore unusable.",
      "stack": [
        "PostgreSQL",
        "TypeScript",
        "Object storage"
      ],
      "prerequisites": [
        "Create a disposable synthetic database and local backup directory.",
        "Never connect these drills to production or overwrite a shared database."
      ],
      "developerValue": "Practice restore verification, provenance and operational recovery.",
      "companyValue": "Review evidence that recovery produces coherent usable state under declared limits.",
      "delivery": "Ten scoped tickets across three phases. Build a synthetic local service or select a ticket after recreating its prerequisites; estimates exclude setup.",
      "phases": [
        {
          "id": "inventory",
          "title": "Identify recovery inputs",
          "goal": "Record backup identity and application dependencies."
        },
        {
          "id": "restore",
          "title": "Restore and verify",
          "goal": "Use isolated targets and validate relational/application state."
        },
        {
          "id": "drill",
          "title": "Exercise recovery failures",
          "goal": "Measure local recovery and document missing guarantees."
        }
      ],
      "tickets": [
        {
          "id": "7a445df7-5e4f-4f6a-8611-da4b2edb8cb2",
          "key": "ARESTORE-101",
          "title": "Inventory database recovery inputs beyond the dump file",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "inventory",
          "dependsOn": [],
          "scenario": "A test restore contains tables but cannot start the application because expected roles and extensions are absent.",
          "acceptanceCriteria": [
            "List schema, roles, extensions, migration version and artifact dependencies.",
            "Separate secret configuration from backup contents.",
            "Record unresolved dependencies explicitly."
          ],
          "implementationNotes": [
            "Use a disposable synthetic database with a minimal application."
          ],
          "verification": [
            "Start the application from a complete declared inventory.",
            "Omit an extension in a fixture and identify the missing prerequisite."
          ],
          "deliverables": [
            "Recovery dependency inventory"
          ],
          "rollout": "Review inventory before claiming restore readiness; keep unresolved prerequisites visible.",
          "skills": [
            "Backup planning",
            "Database operations"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 20
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "16c4cb2b-8dea-40f5-8727-ec340da53f70",
          "key": "ARESTORE-102",
          "title": "Create a backup manifest that binds bytes to schema revision",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "inventory",
          "dependsOn": [
            "ARESTORE-101"
          ],
          "scenario": "Operators find three similarly named dump files and cannot tell which migration version or time each represents.",
          "acceptanceCriteria": [
            "Record byte hash, size, UTC capture time and migration identity.",
            "Bind the manifest to the exact backup artifact.",
            "Reject a missing or mismatched manifest before restore."
          ],
          "implementationNotes": [
            "Use synthetic data and avoid credentials in command logs."
          ],
          "verification": [
            "Verify a backup and matching manifest.",
            "Alter backup bytes and reject the restore plan."
          ],
          "deliverables": [
            "Backup manifest command and integrity checks"
          ],
          "rollout": "Create manifests for new backups; label unverified older files as uncertain.",
          "skills": [
            "Provenance",
            "Checksums"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 60
            },
            {
              "field": "Storage systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "11a15c93-1e1f-4e3d-bf32-4bd895312a56",
          "key": "ARESTORE-103",
          "title": "Validate that a restore target is isolated before running destructive steps",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "inventory",
          "dependsOn": [
            "ARESTORE-101",
            "ARESTORE-102"
          ],
          "scenario": "A copied restore command could replace the development database instead of the disposable drill target.",
          "acceptanceCriteria": [
            "Require an explicit disposable target identity and expected marker.",
            "Resolve and inspect target connection metadata before mutation.",
            "Reject shared, production-like or unmarked targets."
          ],
          "implementationNotes": [
            "Use exact database names and task-specific credentials; no wildcard cleanup."
          ],
          "verification": [
            "Plan a restore to a marked disposable target.",
            "Point at an unmarked synthetic target and verify zero destructive calls."
          ],
          "deliverables": [
            "Restore-target guard and denial tests"
          ],
          "rollout": "Make the guard mandatory for drills; abort if target identity changes.",
          "skills": [
            "Operational safety",
            "Input validation"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 50
            },
            {
              "field": "Security",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "668f52de-40a3-4cac-8ad7-381e43955761",
          "key": "ARESTORE-104",
          "title": "Restore a verified backup into a new database generation",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "restore",
          "dependsOn": [
            "ARESTORE-102",
            "ARESTORE-103"
          ],
          "scenario": "The current procedure restores directly over the active database and leaves no usable environment if it fails halfway.",
          "acceptanceCriteria": [
            "Create and restore into a distinct verified disposable generation.",
            "Keep the prior target untouched until checks complete.",
            "Record each restore stage and failure without exposing data contents."
          ],
          "implementationNotes": [
            "Use bounded local synthetic backups only."
          ],
          "verification": [
            "Restore a valid backup and inspect the new generation.",
            "Fail mid-restore and verify the previous synthetic application still reads its original database."
          ],
          "deliverables": [
            "Generation-based restore script"
          ],
          "rollout": "Use a new target for every drill; remove only verified owned failed generations after review.",
          "skills": [
            "Recovery isolation",
            "Database restore"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "d91de79b-a890-44e2-975e-34ea6653dc28",
          "key": "ARESTORE-105",
          "title": "Check relational invariants after restoration",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 180,
          "phaseId": "restore",
          "dependsOn": [
            "ARESTORE-104"
          ],
          "scenario": "A restore exits successfully but an earlier disabled constraint allowed orphan case assignments into the backup.",
          "acceptanceCriteria": [
            "Check expected foreign keys, unique constraints and required indexes.",
            "Run explicit orphan and duplicate queries on restored data.",
            "Fail application activation when invariants do not hold."
          ],
          "implementationNotes": [
            "Compare actual catalog metadata with the declared migration contract."
          ],
          "verification": [
            "Validate a clean synthetic restored database.",
            "Restore a deliberately inconsistent fixture and report exact invariant failures."
          ],
          "deliverables": [
            "Post-restore SQL verification suite"
          ],
          "rollout": "Run before connecting application traffic; retain the failed generation for bounded diagnosis.",
          "skills": [
            "Relational integrity",
            "Schema verification"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 70
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "90bef672-ef52-4112-aa7b-48e2e8beff7c",
          "key": "ARESTORE-106",
          "title": "Reconcile restored database references with external artifacts",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "restore",
          "dependsOn": [
            "ARESTORE-101",
            "ARESTORE-104",
            "ARESTORE-105"
          ],
          "scenario": "Case attachments point to objects created after the backup cutoff, and some objects referenced by restored rows are missing.",
          "acceptanceCriteria": [
            "Compare immutable object versions and hashes for referenced artifacts.",
            "Report missing, extra and mismatched objects separately.",
            "Do not replace missing artifacts with similarly named current objects."
          ],
          "implementationNotes": [
            "Use a local object-store fixture and explicit backup cutoff."
          ],
          "verification": [
            "Restore matching database and object manifests.",
            "Remove a referenced object and keep the application readiness result incomplete."
          ],
          "deliverables": [
            "Artifact reconciliation command"
          ],
          "rollout": "Keep artifact-dependent routes unavailable until their references verify; preserve missing-reference reports.",
          "skills": [
            "Cross-store consistency",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 40
            },
            {
              "field": "Storage systems",
              "percentage": 40
            },
            {
              "field": "Distributed systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "dd671a74-9fa9-4b34-8fbd-b44ca4672f18",
          "key": "ARESTORE-107",
          "title": "Prevent post-restore background jobs from repeating completed side effects",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "restore",
          "dependsOn": [
            "ARESTORE-104",
            "ARESTORE-105",
            "ARESTORE-106"
          ],
          "scenario": "A restored outbox contains delivery records whose external effects happened after the database backup but before the outage.",
          "acceptanceCriteria": [
            "Document the database/external-side-effect recovery gap.",
            "Reconcile provider identities before redispatching restored records.",
            "Preserve unknown outcomes rather than asserting they were never sent."
          ],
          "implementationNotes": [
            "Use fake providers with durable synthetic request identities; send no messages."
          ],
          "verification": [
            "Restore a completed external operation and reconcile it without duplication.",
            "Make provider status unavailable and keep redispatch blocked under the declared policy."
          ],
          "deliverables": [
            "Outbox recovery protocol and provider probe"
          ],
          "rollout": "Start restored workers paused; release only reconciled work and retain unknown cases.",
          "skills": [
            "Distributed recovery",
            "Idempotency"
          ],
          "fieldMix": [
            {
              "field": "Distributed systems",
              "percentage": 50
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "cebd3782-1dc6-4c3b-9ddf-4f3f519a05eb",
          "key": "ARESTORE-108",
          "title": "Measure local restore time with complete verification included",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 180,
          "phaseId": "drill",
          "dependsOn": [
            "ARESTORE-104",
            "ARESTORE-105",
            "ARESTORE-106",
            "ARESTORE-107"
          ],
          "scenario": "The team's restore-time figure measures only dump loading and excludes artifact checks and application readiness.",
          "acceptanceCriteria": [
            "Record hardware, versions, dataset size and cache conditions.",
            "Measure load, verification and readiness stages separately.",
            "Repeat the same synthetic restore three times and report spread."
          ],
          "implementationNotes": [
            "These observations do not establish a production RTO."
          ],
          "verification": [
            "Run the declared complete restore drill and record all stages.",
            "Fail an invariant check and report recovery incomplete despite dump success."
          ],
          "deliverables": [
            "Reproducible local restore timing report"
          ],
          "rollout": "Use measurements to improve the drill; revise targets only after representative environment testing.",
          "skills": [
            "Operational measurement",
            "Recovery objectives"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 40
            },
            {
              "field": "Database engineering",
              "percentage": 40
            },
            {
              "field": "Performance engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "ab6f17ec-2fa5-4902-8c5f-fcdb52823325",
          "key": "ARESTORE-109",
          "title": "Rehearse backup corruption and missing-manifest failure paths",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "drill",
          "dependsOn": [
            "ARESTORE-102",
            "ARESTORE-103",
            "ARESTORE-108"
          ],
          "scenario": "Operators need a practiced response when the newest backup is unusable rather than trying increasingly risky manual restore commands.",
          "acceptanceCriteria": [
            "Reject corrupt artifacts before activating a generation.",
            "Select an earlier verified backup with an explicit data-gap statement.",
            "Record the cutoff and unresolved external effects."
          ],
          "implementationNotes": [
            "Create disposable corrupted copies rather than altering the retained good backup."
          ],
          "verification": [
            "Restore from the prior verified synthetic backup.",
            "Present a missing manifest and corrupted newest artifact and keep both untrusted."
          ],
          "deliverables": [
            "Backup-failure drill and recovery decision trace"
          ],
          "rollout": "Run periodically in disposable targets; preserve good backups and stop when no verified candidate exists.",
          "skills": [
            "Recovery planning",
            "Integrity"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 50
            },
            {
              "field": "Site reliability",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "e70f56ef-c614-4412-8a35-2a93c235c6ae",
          "key": "ARESTORE-110",
          "title": "Write an application-level database recovery handoff",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "drill",
          "dependsOn": [
            "ARESTORE-107",
            "ARESTORE-108",
            "ARESTORE-109"
          ],
          "scenario": "A successful command transcript is handed to on-call staff without clear activation criteria or a statement of potentially missing data.",
          "acceptanceCriteria": [
            "List verification gates and the selected recovery cutoff.",
            "Include worker pause/release and artifact availability steps.",
            "State measured local limits and unresolved production dependencies."
          ],
          "implementationNotes": [
            "Use fabricated case records in the worked example."
          ],
          "verification": [
            "Follow the handoff from verified backup to synthetic application readiness.",
            "Follow the no-verified-backup branch and stop without claiming recovery."
          ],
          "deliverables": [
            "Recovery runbook and worked handoff"
          ],
          "rollout": "Review with a fresh local drill; update the runbook when schema or provider contracts change.",
          "skills": [
            "Runbooks",
            "Recovery communication"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
