{
  "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": "DDEV",
      "title": "Make local development reproducible without hiding dependencies",
      "field": "DevOps",
      "summary": "Define bootstrap, service readiness, data reset, offline behavior, and cross-platform parity.",
      "context": "A fictional support portal requires a database, cache, object store, and mail catcher. Setup lives in personal notes, reset scripts sometimes target shared resources, and offline work fails after package caches are cleared. Build a local-only development contract with synthetic data; no shared staging system or production credentials are supplied.",
      "stack": [
        "TypeScript",
        "Containers",
        "PowerShell and POSIX shell",
        "Local services"
      ],
      "prerequisites": [
        "Environment variables",
        "Service health",
        "Database migrations"
      ],
      "developerValue": "Practice developer-environment automation, safe reset boundaries, portability, and diagnostic quality.",
      "companyValue": "Reduce onboarding and support cost while making local dependencies and destructive operations explicit.",
      "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": "276ce689-0acd-40be-9e86-e91372146730",
          "key": "DDEV-101",
          "title": "Turn the setup notes into one preflight report",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [],
          "scenario": "A new developer follows six documents and reaches application startup before learning that the required runtime version is unsupported.",
          "acceptanceCriteria": [
            "Preflight checks runtime, package manager, container engine, ports, and required files",
            "Each result says detected, required, and remediation",
            "Checks are read-only and return one aggregate status"
          ],
          "implementationNotes": [
            "Do not install software or change host settings from preflight."
          ],
          "verification": [
            "Run against a complete declared fixture environment.",
            "Simulate multiple missing dependencies and report all of them in one pass."
          ],
          "deliverables": [
            "Read-only preflight command and environment fixtures"
          ],
          "rollout": "Link preflight from the existing setup guide before removing manual checks.",
          "skills": [
            "Developer experience",
            "Environment diagnostics"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "87b6076f-72a1-4f53-95ec-5d62edbd3668",
          "key": "DDEV-102",
          "title": "Start local services only after validating port ownership",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [
            "DDEV-101"
          ],
          "scenario": "Bootstrap sees a port in use and assumes the expected database is running, but the listener belongs to another application.",
          "acceptanceCriteria": [
            "Readiness validates protocol and fixture service identity",
            "Port collision names the port without terminating the owner",
            "Bootstrap records which processes or containers it started"
          ],
          "implementationNotes": [
            "Never kill an unknown process or bind beyond loopback in this exercise."
          ],
          "verification": [
            "Reuse a healthy owned fixture service and start a missing one.",
            "Place an unrelated listener on the port and fail with remediation."
          ],
          "deliverables": [
            "Service identity probes and collision tests"
          ],
          "rollout": "Require identity checks before automated startup.",
          "skills": [
            "Service discovery",
            "Safe automation"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Platform engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "78afbe4a-e67c-4f3c-8bbd-61f0930a59c4",
          "key": "DDEV-103",
          "title": "Apply migrations exactly once during concurrent bootstrap",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "baseline",
          "dependsOn": [
            "DDEV-102"
          ],
          "scenario": "Two local application processes start together and both run the same migration, leaving one failed and the schema state unclear.",
          "acceptanceCriteria": [
            "Migration ownership uses the database-supported lock",
            "Waiters observe the final applied version",
            "Failure leaves the migration retryable and visible"
          ],
          "implementationNotes": [
            "Use migrations; do not replace the workflow with schema push."
          ],
          "verification": [
            "Start two bootstrap processes against an empty fixture database.",
            "Interrupt the migration owner and verify a later run can safely resolve state."
          ],
          "deliverables": [
            "Migration coordination and concurrent-start test"
          ],
          "rollout": "Keep manual migration available until the bootstrap path is repeatable.",
          "skills": [
            "Database migrations",
            "Concurrency",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Database engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9df80cc5-bf65-480d-9568-d0244b940f80",
          "key": "DDEV-104",
          "title": "Seed deterministic accounts without creating duplicates",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "control",
          "dependsOn": [
            "DDEV-103"
          ],
          "scenario": "Every bootstrap appends another demo organization and screenshots depend on whichever duplicate is returned first.",
          "acceptanceCriteria": [
            "Seed identities are stable and unique",
            "Repeated seed reconciles declared values idempotently",
            "User-owned local additions remain untouched"
          ],
          "implementationNotes": [
            "Synthetic fixtures must be clearly labeled and never selected outside local Demo mode."
          ],
          "verification": [
            "Seed twice and compare identities, counts, and relations.",
            "Change one fixture revision and verify an intentional update without duplicate rows."
          ],
          "deliverables": [
            "Versioned seed reconciler and repeat-run tests"
          ],
          "rollout": "Require explicit local Demo mode before seeding.",
          "skills": [
            "Test data",
            "Idempotency",
            "Data safety"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Database engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "2da31ae9-f161-4f65-9892-e29e68e50210",
          "key": "DDEV-105",
          "title": "Reset only resources created by this workspace",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DDEV-102",
            "DDEV-104"
          ],
          "scenario": "A cleanup command deletes every container with a generic project label, including another checkout's database.",
          "acceptanceCriteria": [
            "Workspace identity is stable, explicit, and included on owned resources",
            "Reset previews exact absolute targets and service identities",
            "Foreign and ambiguous resources are refused"
          ],
          "implementationNotes": [
            "The command operates only on generated local fixtures and requires an explicit reset flag."
          ],
          "verification": [
            "Preview and reset one isolated fixture workspace.",
            "Add a second workspace and an ambiguous unlabeled resource, then prove both survive."
          ],
          "deliverables": [
            "Scoped reset command and cross-workspace safety tests"
          ],
          "rollout": "Ship preview-only first and document recovery limits.",
          "skills": [
            "Safe automation",
            "Resource ownership",
            "Destructive-operation design"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Security",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9956e319-b6b2-416e-887d-298ef86f950e",
          "key": "DDEV-106",
          "title": "Report readiness by dependency instead of waiting blindly",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DDEV-102",
            "DDEV-103"
          ],
          "scenario": "Bootstrap sleeps thirty seconds, then starts the application even if object storage is still initializing or the database failed permanently.",
          "acceptanceCriteria": [
            "Each dependency has a bounded identity-aware readiness probe",
            "Transient and terminal failures have separate retry behavior",
            "Overall report shows ready, waiting, failed, and skipped dependencies"
          ],
          "implementationNotes": [
            "Use injected time and local probes; fixed sleep is not readiness."
          ],
          "verification": [
            "Start dependencies with staggered readiness and complete when all required services pass.",
            "Return a permanent schema error and stop retrying with an actionable report."
          ],
          "deliverables": [
            "Dependency readiness graph and timing tests"
          ],
          "rollout": "Display reports beside the existing startup path before enforcing them.",
          "skills": [
            "Readiness",
            "Retry policy",
            "Diagnostics"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "5df6ec4f-1102-4d82-aa29-60254eff94e7",
          "key": "DDEV-107",
          "title": "Support an offline bootstrap from a verified local cache",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "control",
          "dependsOn": [
            "DDEV-101",
            "DDEV-106"
          ],
          "scenario": "Developers lose network access during an incident rehearsal and bootstrap cannot tell which packages and service images are already available locally.",
          "acceptanceCriteria": [
            "Offline manifest lists exact package and image digests",
            "Bootstrap verifies every cached artifact before use",
            "Missing items produce a complete acquisition list without partial startup"
          ],
          "implementationNotes": [
            "Do not bypass integrity checks or contact a network when offline mode is selected."
          ],
          "verification": [
            "Bootstrap from a complete verified cache with network access denied.",
            "Remove and corrupt separate artifacts and report both before starting services."
          ],
          "deliverables": [
            "Offline manifest, verifier, and disconnected tests"
          ],
          "rollout": "Treat offline support as explicit mode with a generated cache preparation step.",
          "skills": [
            "Offline workflows",
            "Artifact integrity",
            "Dependency management"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Developer tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "3634dd46-7515-46f3-835e-eb309f928173",
          "key": "DDEV-108",
          "title": "Keep Windows and POSIX commands behaviorally equivalent",
          "type": "CHORE",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "handoff",
          "dependsOn": [
            "DDEV-101",
            "DDEV-105",
            "DDEV-106"
          ],
          "scenario": "The PowerShell reset resolves symlinks differently from the POSIX script and deletes a fixture path the other implementation refuses.",
          "acceptanceCriteria": [
            "Both entry points call one typed cross-platform core",
            "Path, quoting, exit status, and signal differences have contract tests",
            "Unsupported platform behavior fails visibly"
          ],
          "implementationNotes": [
            "Tests use temporary directories and do not invoke destructive commands through another shell."
          ],
          "verification": [
            "Run the shared fixture matrix through both thin entry points.",
            "Use paths with spaces, links, and metacharacters and compare safe outcomes."
          ],
          "deliverables": [
            "Cross-platform command core and parity report"
          ],
          "rollout": "Keep platform scripts as wrappers and review every behavioral difference.",
          "skills": [
            "Cross-platform tooling",
            "Shell safety",
            "Contract testing"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "1cd0f27b-4f89-423f-bff9-324e605eb440",
          "key": "DDEV-109",
          "title": "Diagnose local startup without collecting source or secrets",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "handoff",
          "dependsOn": [
            "DDEV-106",
            "DDEV-108"
          ],
          "scenario": "A support bundle recursively archives the workspace to explain startup failures, capturing source files and environment secrets.",
          "acceptanceCriteria": [
            "Bundle allowlist contains tool versions, bounded health results, safe config identities, and recent bootstrap events",
            "Source, environment values, tokens, database rows, and payload logs are excluded",
            "User previews exact included files and fields"
          ],
          "implementationNotes": [
            "Use sentinel secrets and synthetic source fixtures to prove exclusion."
          ],
          "verification": [
            "Generate a useful bundle for a failed readiness probe.",
            "Place sentinels in every prohibited source and confirm none appear in archive bytes."
          ],
          "deliverables": [
            "Redacted support bundle and leak regression suite"
          ],
          "rollout": "Keep bundle generation local and user initiated.",
          "skills": [
            "Diagnostics",
            "Privacy",
            "Redaction"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Privacy engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "f547310a-897a-4313-a750-385fb9666051",
          "key": "DDEV-110",
          "title": "Prove onboarding from a clean machine profile",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "handoff",
          "dependsOn": [
            "DDEV-104",
            "DDEV-107",
            "DDEV-108",
            "DDEV-109"
          ],
          "scenario": "The setup succeeds only on long-lived developer machines that already contain undeclared packages and cached service state.",
          "acceptanceCriteria": [
            "Test starts from a declared clean profile with empty workspace-owned state",
            "Online and prepared-offline paths produce the same fixture application behavior",
            "Duration report separates downloads, builds, migrations, seeds, and readiness"
          ],
          "implementationNotes": [
            "The profile is a local disposable fixture, not a production host image."
          ],
          "verification": [
            "Complete onboarding twice from clean profiles and compare outcomes.",
            "Remove one declared prerequisite and verify preflight fails before mutation."
          ],
          "deliverables": [
            "Clean-profile onboarding rehearsal and timing report"
          ],
          "rollout": "Use the rehearsal in documentation review before changing team onboarding policy.",
          "skills": [
            "Onboarding automation",
            "Reproducibility",
            "Performance analysis"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            }
          ],
          "patterns": []
        }
      ],
      "id": "52784e0d-6b6f-43a1-967c-d9b7736f422b"
    }
  ]
}
