{
  "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": "2f2e66a5-cabc-4b08-b389-3e4ca4825dab",
      "key": "BCOST",
      "title": "Object-storage cost controls",
      "field": "Cloud infrastructure",
      "summary": "Make storage growth and transfer costs inspectable without compromising retained records.",
      "context": "A fictional analytics service stores exports and intermediate artifacts indefinitely. Finance sees a rising bill but engineers cannot explain which lifecycle policy is responsible.",
      "stack": [
        "TypeScript",
        "S3-compatible storage",
        "CSV"
      ],
      "prerequisites": [
        "Create synthetic object inventories and a local object-store double; author fictional unit prices as explicit assumptions."
      ],
      "developerValue": "Practice cost attribution, lifecycle modeling, and safe retention controls.",
      "companyValue": "Produce reviewable storage-cost options with recovery and data-retention consequences.",
      "delivery": "Deliver an offline cost model and local policy rehearsal; delete no real cloud objects.",
      "phases": [
        {
          "id": "inventory",
          "title": "Attribute storage",
          "goal": "Describe objects, ownership, and cost assumptions."
        },
        {
          "id": "control",
          "title": "Model lifecycle changes",
          "goal": "Evaluate retention and transfer controls safely."
        },
        {
          "id": "review",
          "title": "Review savings proposals",
          "goal": "Compare options and expose uncertainty."
        }
      ],
      "tickets": [
        {
          "id": "8ffb3566-63c9-4e68-a67f-cfb1406692bb",
          "key": "BCOST-101",
          "title": "Normalize object inventory units and ownership labels",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "inventory",
          "dependsOn": [],
          "scenario": "Inventory exports mix byte counts, rounded sizes, and missing owners.",
          "acceptanceCriteria": [
            "Use bytes as the canonical size unit.",
            "Separate unknown owners from shared infrastructure.",
            "Preserve inventory time and source identity."
          ],
          "implementationNotes": [
            "Use synthetic names without customer identifiers."
          ],
          "verification": [
            "Normalize mixed display units accurately.",
            "Reject negative sizes and report missing ownership."
          ],
          "deliverables": [
            "Inventory parser."
          ],
          "rollout": "Run read-only attribution before proposing lifecycle changes.",
          "skills": [
            "Data normalization"
          ],
          "fieldMix": [
            {
              "field": "Data engineering",
              "percentage": 60
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "ed66d2df-c232-4173-ac0c-e1a69d36e525",
          "key": "BCOST-102",
          "title": "Model storage, requests, and transfer costs separately",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "inventory",
          "dependsOn": [
            "BCOST-101"
          ],
          "scenario": "A storage-only estimate ignores the cost of regenerating and downloading exports.",
          "acceptanceCriteria": [
            "Version explicit fictional unit-price assumptions.",
            "Calculate each cost component separately.",
            "Show unknown request or transfer volume."
          ],
          "implementationNotes": [
            "Do not present modeled savings as observed billing results."
          ],
          "verification": [
            "Reconcile a hand-calculated synthetic example.",
            "Refuse a total when a required unit conversion is ambiguous."
          ],
          "deliverables": [
            "Offline cost calculator."
          ],
          "rollout": "Keep original assumptions with every report.",
          "skills": [
            "Cost modeling"
          ],
          "fieldMix": [
            {
              "field": "Cloud infrastructure",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "fe92ac53-95bb-4418-b74a-0e8676787b54",
          "key": "BCOST-103",
          "title": "Classify objects by recovery and retention requirements",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "control",
          "dependsOn": [
            "BCOST-101"
          ],
          "scenario": "A broad expiry rule would remove the only copy of finalized reports.",
          "acceptanceCriteria": [
            "Distinguish authoritative, reproducible, and temporary objects.",
            "Attach minimum retention and recovery requirements.",
            "Block lifecycle proposals for unclassified objects."
          ],
          "implementationNotes": [
            "Retention requirements are scenario inputs, not legal advice."
          ],
          "verification": [
            "Allow expiry of a declared temporary object.",
            "Block deletion of an authoritative unclassified report."
          ],
          "deliverables": [
            "Object lifecycle classification."
          ],
          "rollout": "Start with temporary classes only; preserve unknown objects.",
          "skills": [
            "Data lifecycle"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 50
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "74f448e4-1a40-4ef2-a781-5df103e310a8",
          "key": "BCOST-104",
          "title": "Simulate lifecycle transitions before object deletion",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "control",
          "dependsOn": [
            "BCOST-103"
          ],
          "scenario": "Operators cannot see which objects a new rule would affect.",
          "acceptanceCriteria": [
            "Produce a dry-run object set and byte total.",
            "Bind the plan to inventory and policy digests.",
            "Reject execution if the reviewed plan is stale."
          ],
          "implementationNotes": [
            "The exercise uses only a disposable local object store."
          ],
          "verification": [
            "Preview an eligible temporary set.",
            "Change policy inputs and reject the stale plan."
          ],
          "deliverables": [
            "Lifecycle dry-run planner."
          ],
          "rollout": "Require review of the exact plan; keep deletion disabled by default.",
          "skills": [
            "Change safety",
            "Integrity"
          ],
          "fieldMix": [
            {
              "field": "Cloud infrastructure",
              "percentage": 40
            },
            {
              "field": "Storage systems",
              "percentage": 40
            },
            {
              "field": "Security",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "7ccebcaf-4884-48ce-b6c8-9c5a8c2e592c",
          "key": "BCOST-105",
          "title": "Account for retrieval delay in colder storage proposals",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "control",
          "dependsOn": [
            "BCOST-102",
            "BCOST-103"
          ],
          "scenario": "A cheaper storage tier may violate the reporting team's recovery expectations.",
          "acceptanceCriteria": [
            "Model retrieval time and per-request charges explicitly.",
            "Compare ordinary access and restore scenarios.",
            "Exclude objects whose declared recovery target is incompatible."
          ],
          "implementationNotes": [
            "Use simulated tier behavior and labeled assumptions."
          ],
          "verification": [
            "Compare two fictional tier policies.",
            "Reject a cheap option that misses the recovery requirement."
          ],
          "deliverables": [
            "Tier tradeoff report."
          ],
          "rollout": "Pilot only reproducible artifacts with a tested restore path.",
          "skills": [
            "Cloud economics",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Cloud infrastructure",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "21766ec3-6407-476b-b32b-2ede6c058380",
          "key": "BCOST-106",
          "title": "Bound export retention per tenant without crossing ownership",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "control",
          "dependsOn": [
            "BCOST-104"
          ],
          "scenario": "One tenant's cleanup job selects similarly named exports belonging to another.",
          "acceptanceCriteria": [
            "Scope inventory and policy evaluation by tenant identity.",
            "Use opaque object references rather than name prefixes alone.",
            "Audit planned and completed cleanup identities."
          ],
          "implementationNotes": [
            "Repository boundaries must enforce scope."
          ],
          "verification": [
            "Expire eligible exports for one tenant.",
            "Attempt cross-tenant cleanup and verify denial."
          ],
          "deliverables": [
            "Scoped retention evaluator."
          ],
          "rollout": "Trial on one synthetic tenant; stop on inventory discrepancies.",
          "skills": [
            "Authorization",
            "Storage"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "3230ee07-e9a3-4309-a026-54745bf9b181",
          "key": "BCOST-107",
          "title": "Reduce repeated downloads with integrity-aware caching",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "control",
          "dependsOn": [
            "BCOST-102"
          ],
          "scenario": "Unchanged exports are repeatedly transferred because clients cannot validate their cache.",
          "acceptanceCriteria": [
            "Expose stable content validators for immutable exports.",
            "Honor conditional reads correctly.",
            "Invalidate cached authority when access is revoked."
          ],
          "implementationNotes": [
            "A content digest is not an access credential."
          ],
          "verification": [
            "Return unchanged status for an authorized matching validator.",
            "Deny a revoked client despite its cached validator."
          ],
          "deliverables": [
            "Conditional-download contract."
          ],
          "rollout": "Enable for immutable exports first; retain full-download fallback.",
          "skills": [
            "HTTP caching",
            "Authorization"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 40
            },
            {
              "field": "API design",
              "percentage": 30
            },
            {
              "field": "Security",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "4cd1c3f0-0d09-4564-abdc-422e7832c9bc",
          "key": "BCOST-108",
          "title": "Compare retention changes against rebuild workload and budget",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "review",
          "dependsOn": [
            "BCOST-105",
            "BCOST-106",
            "BCOST-107"
          ],
          "scenario": "Deleting intermediate files saves storage but may shift cost into repeated computation.",
          "acceptanceCriteria": [
            "Model storage, rebuild, transfer, and operational effort together.",
            "Run bounded local rebuild measurements with declared inputs.",
            "Show uncertainty ranges and excluded costs."
          ],
          "implementationNotes": [
            "No claim of real bill reduction from synthetic data."
          ],
          "verification": [
            "Compare a retained and regenerated artifact policy.",
            "Expose the case where regeneration costs more."
          ],
          "deliverables": [
            "Cost-control decision record."
          ],
          "rollout": "Choose a reversible policy for reproducible data; preserve authoritative copies.",
          "skills": [
            "Tradeoff analysis",
            "FinOps"
          ],
          "fieldMix": [
            {
              "field": "Cloud infrastructure",
              "percentage": 50
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "00feb5e4-5a7e-4003-87d2-0391784933e4",
          "key": "BCOST-109",
          "title": "Add budget alerts that distinguish actual and forecast usage",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "review",
          "dependsOn": [
            "BCOST-108"
          ],
          "scenario": "A forecast estimate appears in the same chart as already-incurred usage.",
          "acceptanceCriteria": [
            "Label measured inventory cost and forecast separately.",
            "Define alert thresholds and data freshness.",
            "Avoid duplicate alerts for one reporting window."
          ],
          "implementationNotes": [
            "Alerts remain local outputs; send no external notifications."
          ],
          "verification": [
            "Trigger a synthetic budget threshold.",
            "Show stale inventory as uncertain instead of a current total."
          ],
          "deliverables": [
            "Budget alert fixtures."
          ],
          "rollout": "Run advisory reports before operational notification wiring.",
          "skills": [
            "Observability",
            "Cost controls"
          ],
          "fieldMix": [
            {
              "field": "Cloud infrastructure",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "4ad505bc-1447-4556-a6f5-a7f2cf9a645b",
          "key": "BCOST-110",
          "title": "Document restoration before approving local expiry rules",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "review",
          "dependsOn": [
            "BCOST-109"
          ],
          "scenario": "Cleanup reviewers need to understand which deleted artifacts can be recreated.",
          "acceptanceCriteria": [
            "Identify rebuild inputs and commands.",
            "State unrecoverable classes explicitly.",
            "Include the latest dry-run plan identity."
          ],
          "implementationNotes": [
            "Do not promise recovery without retained inputs."
          ],
          "verification": [
            "Rebuild an expired synthetic intermediate artifact.",
            "Reject expiry when required rebuild inputs are absent."
          ],
          "deliverables": [
            "Retention review checklist."
          ],
          "rollout": "Attach to policy proposals and re-review after input changes.",
          "skills": [
            "Runbooks"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 50
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
