{
  "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": "5951c8eb-f3ff-4d2e-a159-df7597aa8a15",
      "key": "BRESTORE",
      "title": "Backup restoration rehearsal",
      "field": "Site reliability",
      "summary": "Verify that database and object-store backups can reconstruct a coherent service.",
      "context": "A fictional reporting service has successful backup jobs but no recent restore rehearsal. Database rows reference objects with different retention schedules.",
      "stack": [
        "PostgreSQL",
        "S3-compatible storage",
        "TypeScript"
      ],
      "prerequisites": [
        "Create disposable local database and object-store fixtures with synthetic reports; author backup and corruption examples."
      ],
      "developerValue": "Practice recovery consistency, integrity validation, and honest recovery objectives.",
      "companyValue": "Replace backup-job optimism with a repeatable restoration assessment.",
      "delivery": "Deliver a local restore harness and recovery report; change no production backup policy.",
      "phases": [
        {
          "id": "inventory",
          "title": "Inventory recovery dependencies",
          "goal": "Define backup scope and consistency requirements."
        },
        {
          "id": "restore",
          "title": "Restore isolated data",
          "goal": "Reconstruct and validate a coherent snapshot."
        },
        {
          "id": "prove",
          "title": "Rehearse disruption",
          "goal": "Measure recovery and document unrecoverable gaps."
        }
      ],
      "tickets": [
        {
          "id": "0ee5a2c7-d2e6-44cb-9924-b80e3247c9f3",
          "key": "BRESTORE-101",
          "title": "Inventory the data required to restore one report",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "inventory",
          "dependsOn": [],
          "scenario": "A database backup omits the object containing the actual report.",
          "acceptanceCriteria": [
            "List database rows, objects, and configuration references.",
            "Identify authoritative and rebuildable data.",
            "Document retention mismatches."
          ],
          "implementationNotes": [
            "Use synthetic records and secret placeholders."
          ],
          "verification": [
            "Trace one report end to end.",
            "Identify a missing object as an incomplete recovery dependency."
          ],
          "deliverables": [
            "Recovery inventory."
          ],
          "rollout": "Review inventory before altering backup jobs.",
          "skills": [
            "Recovery planning"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Database engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "cb85c00a-328e-43ab-b224-3cca5203b5a0",
          "key": "BRESTORE-102",
          "title": "Define a consistent backup manifest across stores",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "inventory",
          "dependsOn": [
            "BRESTORE-101"
          ],
          "scenario": "Database and object backups represent different points in time.",
          "acceptanceCriteria": [
            "Record snapshot boundary and object version digests.",
            "Include schema and manifest versions.",
            "Reject incomplete manifests."
          ],
          "implementationNotes": [
            "Do not equate wall-clock proximity with transactional consistency."
          ],
          "verification": [
            "Build a coherent synthetic manifest.",
            "Reject a manifest referencing an unavailable object version."
          ],
          "deliverables": [
            "Backup manifest contract."
          ],
          "rollout": "Version manifests and retain the prior complete backup set.",
          "skills": [
            "Consistency",
            "Provenance"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 50
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "b9650b0e-1c8b-4292-92c3-0d7923300b8a",
          "key": "BRESTORE-103",
          "title": "Guard restore commands against non-scratch targets",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "restore",
          "dependsOn": [
            "BRESTORE-102"
          ],
          "scenario": "A restore command can overwrite an existing developer database by mistake.",
          "acceptanceCriteria": [
            "Require an explicit scratch target.",
            "Reject nonempty or unapproved destinations.",
            "Display sanitized target identity."
          ],
          "implementationNotes": [
            "No remote or production endpoints in this exercise."
          ],
          "verification": [
            "Restore into an empty named scratch database.",
            "Reject an occupied or remote destination."
          ],
          "deliverables": [
            "Restore target guard."
          ],
          "rollout": "Default to inspection-only until target validation passes.",
          "skills": [
            "Operational safety"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Site reliability",
              "percentage": 30
            },
            {
              "field": "Security",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "47c47925-5172-422a-afdf-19c488a9d82f",
          "key": "BRESTORE-104",
          "title": "Verify backup bytes before applying restored data",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "restore",
          "dependsOn": [
            "BRESTORE-102",
            "BRESTORE-103"
          ],
          "scenario": "A truncated object archive is discovered only after the application starts.",
          "acceptanceCriteria": [
            "Validate declared sizes and content digests.",
            "Reject missing or extra required archive members.",
            "Stop before promotion on any mismatch."
          ],
          "implementationNotes": [
            "Bound archive expansion and reject traversal paths."
          ],
          "verification": [
            "Verify a complete backup set.",
            "Reject corruption and an escaping archive entry."
          ],
          "deliverables": [
            "Backup integrity verifier."
          ],
          "rollout": "Keep failed restores isolated and retain diagnostic metadata.",
          "skills": [
            "Integrity",
            "Archive handling"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "4ba8ef07-7084-4fff-89e3-a8bb0c104332",
          "key": "BRESTORE-105",
          "title": "Restore database references before enabling object reads",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "restore",
          "dependsOn": [
            "BRESTORE-104"
          ],
          "scenario": "The application exposes restored metadata while referenced objects are still missing.",
          "acceptanceCriteria": [
            "Keep restored service unavailable until coherence checks pass.",
            "Reconcile every required object reference.",
            "Report dangling references without inventing replacements."
          ],
          "implementationNotes": [
            "Public readiness must not imply partial data is complete."
          ],
          "verification": [
            "Restore a coherent report set.",
            "Remove one object and keep readiness blocked."
          ],
          "deliverables": [
            "Restore readiness checks."
          ],
          "rollout": "Promote only a validated restore; preserve the original scratch failure state.",
          "skills": [
            "Readiness",
            "Data integrity"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 40
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "b233188d-9f99-42ab-9828-9bc7a9d0ebc4",
          "key": "BRESTORE-106",
          "title": "Rebuild derived indexes from restored authoritative records",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "restore",
          "dependsOn": [
            "BRESTORE-105"
          ],
          "scenario": "The backup contains stale search indexes that disagree with restored reports.",
          "acceptanceCriteria": [
            "Rebuild indexes from the restored authority.",
            "Make rebuild restartable and bounded.",
            "Verify index counts and sampled content bindings."
          ],
          "implementationNotes": [
            "Never treat an index as the source of truth."
          ],
          "verification": [
            "Rebuild after a complete restore.",
            "Interrupt rebuilding and resume without duplicate entries."
          ],
          "deliverables": [
            "Derived-data rebuild command."
          ],
          "rollout": "Keep search unavailable until its version matches restored data.",
          "skills": [
            "Data recovery",
            "Indexing"
          ],
          "fieldMix": [
            {
              "field": "Data engineering",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "92514dc4-34d8-4207-9576-2abbc636060d",
          "key": "BRESTORE-107",
          "title": "Check application compatibility against restored schema versions",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "prove",
          "dependsOn": [
            "BRESTORE-105",
            "BRESTORE-106"
          ],
          "scenario": "The latest application cannot read a backup taken before a schema contraction.",
          "acceptanceCriteria": [
            "Declare compatible application/schema pairs.",
            "Run representative reads and writes after restore.",
            "Identify migration requirements before promotion."
          ],
          "implementationNotes": [
            "Do not silently upgrade restored data without a reviewed path."
          ],
          "verification": [
            "Start a compatible build against the restore.",
            "Reject an incompatible schema with clear guidance."
          ],
          "deliverables": [
            "Restore compatibility matrix."
          ],
          "rollout": "Retain a compatible application artifact with each backup generation.",
          "skills": [
            "Schema evolution"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "80bb26c3-b7cc-4990-8344-6c5cae8578a9",
          "key": "BRESTORE-108",
          "title": "Measure recovery time and recoverable data loss separately",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "prove",
          "dependsOn": [
            "BRESTORE-107"
          ],
          "scenario": "Management asks for recovery objectives, but a single successful local restore is being treated as a guarantee.",
          "acceptanceCriteria": [
            "Measure each restore phase under stated dataset and machine limits.",
            "Compute the gap between backup boundary and failure time.",
            "Report untested scale and dependency assumptions."
          ],
          "implementationNotes": [
            "Local rehearsal establishes observations, not production RTO or RPO guarantees."
          ],
          "verification": [
            "Measure a complete synthetic recovery.",
            "Expose an unrecoverable post-backup write explicitly."
          ],
          "deliverables": [
            "Recovery assessment."
          ],
          "rollout": "Use results to propose objectives; repeat in the target environment before committing to them.",
          "skills": [
            "Reliability planning",
            "Experimental design"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 60
            },
            {
              "field": "Performance engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "e254c6b8-e2ca-47d8-98d7-c7556dde8bbd",
          "key": "BRESTORE-109",
          "title": "Rehearse recovery when the newest backup is unusable",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "prove",
          "dependsOn": [
            "BRESTORE-104",
            "BRESTORE-108"
          ],
          "scenario": "The latest backup manifest is valid but one required object version is unavailable.",
          "acceptanceCriteria": [
            "Select an older complete recovery set explicitly.",
            "Report the increased data-loss window.",
            "Preserve evidence of why the newest set was rejected."
          ],
          "implementationNotes": [
            "Never merge unrelated backup generations without a defined consistency rule."
          ],
          "verification": [
            "Recover from the previous complete set.",
            "Reject an inconsistent mix of database and object generations."
          ],
          "deliverables": [
            "Backup fallback rehearsal."
          ],
          "rollout": "Keep multiple complete generations until retention review permits removal.",
          "skills": [
            "Disaster recovery"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 70
            },
            {
              "field": "Storage systems",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "bc1bb4d9-e9be-4a38-8437-2428fe1928b8",
          "key": "BRESTORE-110",
          "title": "Write a restore handoff with promotion and abandonment criteria",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "prove",
          "dependsOn": [
            "BRESTORE-109"
          ],
          "scenario": "An operator needs to decide whether a long-running restore is safe to promote.",
          "acceptanceCriteria": [
            "List required integrity and compatibility checks.",
            "Document promotion authority and target identity.",
            "Explain how to abandon the scratch restore safely."
          ],
          "implementationNotes": [
            "Avoid destructive cleanup commands outside the named scratch directory."
          ],
          "verification": [
            "Follow the handoff to promote a valid fixture.",
            "Keep a restore with missing objects unpromoted."
          ],
          "deliverables": [
            "Restore runbook."
          ],
          "rollout": "Store the runbook with backup manifests and compatible build references.",
          "skills": [
            "Runbooks"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 100
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
