{
  "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": [
    {
      "key": "DPREVIEW",
      "title": "Create review environments that clean themselves up",
      "field": "DevOps",
      "summary": "Provision isolated previews with bounded cost, tenant-safe data, verified readiness, and deletion recovery.",
      "context": "A fictional product team creates local preview environments for pull requests. Names collide, fixtures copy more data than needed, failed provisioning leaks resources, and merged changes leave previews running. Build an infrastructure simulator with fake DNS, storage, and deployment providers; no cloud account or live domain is supplied.",
      "stack": [
        "TypeScript",
        "Infrastructure model",
        "Fake DNS",
        "Queue adapter"
      ],
      "prerequisites": [
        "Resource graphs",
        "Idempotency",
        "Tenant isolation"
      ],
      "developerValue": "Practice ephemeral environment lifecycle, scoped configuration, cleanup, quotas, and provider reconciliation.",
      "companyValue": "Review changes in isolated representative environments while controlling leakage, resource growth, and abandoned infrastructure.",
      "delivery": "Ten linked tickets across three phases. Use a local repository and fake providers; deliver workflow code, failure tests, a rollback rehearsal, and a concise runbook.",
      "phases": [
        {
          "id": "baseline",
          "title": "Make the delivery contract visible",
          "goal": "Replace implicit workflow assumptions with reviewable inputs and outcomes."
        },
        {
          "id": "control",
          "title": "Control change and failure",
          "goal": "Add bounded concurrency, authority checks, and restart-safe transitions."
        },
        {
          "id": "handoff",
          "title": "Operate and improve",
          "goal": "Measure the workflow, rehearse recovery, and document ownership."
        }
      ],
      "tickets": [
        {
          "id": "ffbb8ae1-5f3a-4164-928b-167ff2b74868",
          "key": "DPREVIEW-101",
          "title": "Derive a collision-resistant preview identity",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [],
          "scenario": "Two repositories both open pull request 42 and receive the same environment name, causing one preview to replace the other.",
          "acceptanceCriteria": [
            "Identity binds repository, immutable revision, and pull-request identity",
            "Human-readable alias maps to one immutable environment ID",
            "Length and character limits are enforced before provider calls"
          ],
          "implementationNotes": [
            "Do not use branch text as the sole authority or resource identity."
          ],
          "verification": [
            "Create previews for same-number requests in two repositories.",
            "Use oversized and normalization-colliding names and confirm no resource mutation."
          ],
          "deliverables": [
            "Preview identity contract and collision tests"
          ],
          "rollout": "Adopt IDs in state first while retaining old aliases for display.",
          "skills": [
            "Resource identity",
            "Input validation"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "348fa0d8-3ceb-40a7-8b0a-5e83ea22e178",
          "key": "DPREVIEW-102",
          "title": "Compile a minimal preview configuration",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [
            "DPREVIEW-101"
          ],
          "scenario": "Preview inherits production-like integrations and tries to send fixture events to undeclared external endpoints.",
          "acceptanceCriteria": [
            "Preview configuration selects only fake or explicitly allowed providers",
            "Network policy defaults to deny and lists required local dependencies",
            "Secrets are references to preview-scoped fixtures"
          ],
          "implementationNotes": [
            "No production credential, customer data, or public callback is permitted."
          ],
          "verification": [
            "Compile a preview using only declared fake providers.",
            "Reference an external endpoint and a production-like secret scope, then block compilation."
          ],
          "deliverables": [
            "Preview configuration policy and denial tests"
          ],
          "rollout": "Require policy compilation before any resource plan.",
          "skills": [
            "Environment isolation",
            "Configuration policy",
            "Security"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Security",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "d508bc1b-c8f5-47c4-912e-ceaf794954cc",
          "key": "DPREVIEW-103",
          "title": "Plan the resource graph before creating anything",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "baseline",
          "dependsOn": [
            "DPREVIEW-101",
            "DPREVIEW-102"
          ],
          "scenario": "Provisioning creates storage before discovering the requested database class exceeds the preview quota, leaving an orphan.",
          "acceptanceCriteria": [
            "Plan resolves complete dependency graph and quota cost",
            "Validation lists every blocking reason before mutation",
            "Plan has immutable revision used by apply"
          ],
          "implementationNotes": [
            "Fake provider discovery is read-only and bounded."
          ],
          "verification": [
            "Plan a valid preview and reconcile its declared resource order.",
            "Exceed compute and storage quotas together and confirm zero creates."
          ],
          "deliverables": [
            "Preview planner and multi-error quota tests"
          ],
          "rollout": "Expose plan-only operation before apply is enabled.",
          "skills": [
            "Infrastructure planning",
            "Quotas",
            "Dependency graphs"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "d39c3f8d-3f57-4b9e-a471-fda575a9fd26",
          "key": "DPREVIEW-104",
          "title": "Apply preview resources idempotently after interruption",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "control",
          "dependsOn": [
            "DPREVIEW-103"
          ],
          "scenario": "Provisioning stops after database creation. Retry creates a second database because local state was not saved before the provider call.",
          "acceptanceCriteria": [
            "Each resource has deterministic operation identity",
            "Apply reconciles provider state before create",
            "Completed resources resume without recreating or skipping dependencies"
          ],
          "implementationNotes": [
            "Provider calls execute outside state transactions and return untrusted observations."
          ],
          "verification": [
            "Apply a complete plan and replay it without changes.",
            "Interrupt after one accepted create and confirm retry adopts the matching resource."
          ],
          "deliverables": [
            "Idempotent preview applier and interruption drill"
          ],
          "rollout": "Limit concurrent previews while reconciliation behavior is observed.",
          "skills": [
            "Idempotency",
            "Infrastructure automation",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Distributed systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "8d72454d-8fbf-4102-bb09-b8e3b02e52ef",
          "key": "DPREVIEW-105",
          "title": "Seed representative data without copying customer records",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DPREVIEW-102",
            "DPREVIEW-104"
          ],
          "scenario": "A convenient preview script proposes copying a small slice of the production-like database, including free-text notes.",
          "acceptanceCriteria": [
            "Seed generator produces synthetic entities matching declared schema constraints",
            "Relationships and edge cases are deterministic from a versioned seed",
            "No source connector for customer data exists in preview composition"
          ],
          "implementationNotes": [
            "Do not claim synthetic distributions reproduce real customer behavior."
          ],
          "verification": [
            "Seed two previews with the same revision and compare logical fixtures.",
            "Attempt to configure an undeclared source connector and fail before data access."
          ],
          "deliverables": [
            "Synthetic preview seeder and schema-edge fixtures"
          ],
          "rollout": "Review fixture usefulness separately from data-safety enforcement.",
          "skills": [
            "Synthetic data",
            "Privacy",
            "Database seeding"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Privacy engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "e2ba3ba7-9b0a-4f07-a908-64746947ecb1",
          "key": "DPREVIEW-106",
          "title": "Publish the preview URL only after identity-aware readiness",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DPREVIEW-104",
            "DPREVIEW-105"
          ],
          "scenario": "The bot posts a URL when the load balancer responds, but it points to an older preview that still owns the recycled alias.",
          "acceptanceCriteria": [
            "Readiness proves environment ID, revision, schema, and seed version",
            "URL publication compares alias ownership immediately before update",
            "Failure remains pending or failed with exact dependency status"
          ],
          "implementationNotes": [
            "Use fake DNS and loopback probes; no public record is created."
          ],
          "verification": [
            "Publish a ready matching preview alias.",
            "Return healthy content from an older environment and block publication."
          ],
          "deliverables": [
            "Identity-aware readiness gate and stale-alias test"
          ],
          "rollout": "Show URLs only after the new gate succeeds.",
          "skills": [
            "Readiness",
            "DNS",
            "Identity validation"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Networking",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "3bb23150-9669-4b46-aa5d-6f3f4636fa5d",
          "key": "DPREVIEW-107",
          "title": "Enforce preview quotas across concurrent requests",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "control",
          "dependsOn": [
            "DPREVIEW-103",
            "DPREVIEW-104"
          ],
          "scenario": "Two valid plans each fit the remaining quota, then apply concurrently and exceed the team limit together.",
          "acceptanceCriteria": [
            "Quota reservation and environment admission are atomic",
            "Expired reservations are reclaimed through identity-checked leases",
            "Provider failure releases or reconciles reservation deterministically"
          ],
          "implementationNotes": [
            "Do not hold a database transaction open across provider operations."
          ],
          "verification": [
            "Admit concurrent plans whose combined cost fits exactly.",
            "Race two plans over the limit and verify only one obtains authority to apply."
          ],
          "deliverables": [
            "Quota reservation protocol and concurrency tests"
          ],
          "rollout": "Start with conservative team quotas and visible denials.",
          "skills": [
            "Concurrency",
            "Leases",
            "Quota enforcement"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Distributed systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "da238bc2-ff17-4d1f-b0ae-e05b156263ad",
          "key": "DPREVIEW-108",
          "title": "Expire previews without deleting an active replacement",
          "type": "CHORE",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "handoff",
          "dependsOn": [
            "DPREVIEW-101",
            "DPREVIEW-104"
          ],
          "scenario": "A delayed cleanup job for an old preview alias deletes storage now owned by a newer environment.",
          "acceptanceCriteria": [
            "Cleanup binds immutable environment and resource identities",
            "Deletion compares current provider ownership before action",
            "Alias reuse cannot transfer cleanup authority"
          ],
          "implementationNotes": [
            "Use fake providers and delete only resources returned by the scoped plan."
          ],
          "verification": [
            "Expire one environment and remove exactly its resource graph.",
            "Reuse its alias for a new environment before delayed cleanup and confirm new resources survive."
          ],
          "deliverables": [
            "Fenced expiry job and alias-reuse regression"
          ],
          "rollout": "Run cleanup in report-only mode before enabling deletions.",
          "skills": [
            "Cleanup",
            "Fencing",
            "Resource ownership"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "b2e31a8b-87a8-47b7-a867-8e68519ed649",
          "key": "DPREVIEW-109",
          "title": "Resume partial preview deletion without losing unresolved resources",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "handoff",
          "dependsOn": [
            "DPREVIEW-108"
          ],
          "scenario": "DNS deletion succeeds, storage deletion times out after acceptance, and the environment is marked deleted despite an unknown storage outcome.",
          "acceptanceCriteria": [
            "Deletion tracks each resource as pending, deleted, absent, failed, or unknown",
            "Retry reconciles unknown provider state before mutation",
            "Environment closes only when every resource reaches a resolved terminal state"
          ],
          "implementationNotes": [
            "Unknown does not equal absent; provider responses remain untrusted until identity reconciliation."
          ],
          "verification": [
            "Delete a full graph and replay the job idempotently.",
            "Lose a storage-delete response and confirm the environment remains visibly unresolved."
          ],
          "deliverables": [
            "Deletion state machine and partial-failure drill"
          ],
          "rollout": "Alert on aged unresolved cleanup rather than hiding it.",
          "skills": [
            "Lifecycle state",
            "Provider reconciliation",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "ce70d63e-a047-4ac2-a86e-4c5d61552824",
          "key": "DPREVIEW-110",
          "title": "Report preview value and cost without vanity counts",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "handoff",
          "dependsOn": [
            "DPREVIEW-106",
            "DPREVIEW-107",
            "DPREVIEW-109"
          ],
          "scenario": "A dashboard celebrates total previews created while ignoring failed readiness, time-to-review, idle duration, and leaked resources.",
          "acceptanceCriteria": [
            "Report creation-to-ready time, ready duration, cleanup latency, failures, and declared resource cost",
            "Metrics use bounded repository and outcome dimensions",
            "Unresolved deletion remains included until reconciled"
          ],
          "implementationNotes": [
            "Do not infer developer productivity or individual performance from preview usage."
          ],
          "verification": [
            "Reconcile a mixed fixture cohort from request through deletion.",
            "Omit cleanup observations and confirm the report shows incomplete cost and lifecycle data."
          ],
          "deliverables": [
            "Preview lifecycle report and interpretation guide"
          ],
          "rollout": "Use the report to tune lifecycle policy, not rank people.",
          "skills": [
            "Operational metrics",
            "Cost attribution",
            "Responsible analytics"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        }
      ],
      "id": "92882874-daf4-419f-b640-f607fe581727"
    }
  ]
}
