{
  "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": "DREL",
      "title": "Promote one immutable release through every environment",
      "field": "DevOps",
      "summary": "Replace rebuild-per-environment delivery with verified artifact promotion and reversible rollout.",
      "context": "A fictional scheduling API is rebuilt separately for test, staging, and production-like local environments. The resulting images differ, release notes list the branch instead of the artifact, and rollback rebuilds old source with new dependencies. Use a local registry simulator and synthetic deployments; no cluster or customer traffic is supplied.",
      "stack": [
        "TypeScript",
        "OCI metadata",
        "Git",
        "Deployment simulator"
      ],
      "prerequisites": [
        "Artifact digests",
        "Release states",
        "Health checks"
      ],
      "developerValue": "Practice immutable promotion, release authority, compatibility gates, canaries, and rollback.",
      "companyValue": "Review a delivery flow that can identify exactly what is running and restore a known artifact without rebuilding it.",
      "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": "6d153361-5f16-43bd-b0d7-8798363d84eb",
          "key": "DREL-101",
          "title": "Bind release identity to an artifact digest",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [],
          "scenario": "The deployment record stores image:latest and commit branch, so two releases display the same identity after the tag moves.",
          "acceptanceCriteria": [
            "Release stores immutable artifact digest, source revision, and build manifest hash",
            "Mutable tags resolve to a digest before approval",
            "Display distinguishes requested tag from deployed digest"
          ],
          "implementationNotes": [
            "Use the local registry simulator and never pull public images."
          ],
          "verification": [
            "Resolve and deploy one fixture tag while retaining its digest.",
            "Move the tag and confirm the approved release identity does not change."
          ],
          "deliverables": [
            "Immutable release record and moved-tag test"
          ],
          "rollout": "Require digest resolution before any environment accepts a new release.",
          "skills": [
            "Artifact identity",
            "Release metadata"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Platform engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "7d8aafd3-11b6-4368-bb95-4372cfc5b61b",
          "key": "DREL-102",
          "title": "Generate release notes from the promoted revision range",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "baseline",
          "dependsOn": [
            "DREL-101"
          ],
          "scenario": "Notes include commits merged after the artifact was built because they query the current branch head.",
          "acceptanceCriteria": [
            "Notes bind previous and current immutable source revisions",
            "Each change links to its synthetic pull-request identity",
            "Empty, missing, and nonancestor ranges have explicit outcomes"
          ],
          "implementationNotes": [
            "Do not use current branch state after release creation."
          ],
          "verification": [
            "Generate notes for a declared three-change revision range.",
            "Advance the branch and confirm the existing notes remain unchanged."
          ],
          "deliverables": [
            "Revision-bound notes generator and history fixtures"
          ],
          "rollout": "Publish notes as draft until artifact and range reconciliation pass.",
          "skills": [
            "Git history",
            "Release communication"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "eb3f4d08-f1c5-4c5b-8a56-4c7d7fbd8e5b",
          "key": "DREL-103",
          "title": "Promote the built artifact instead of rebuilding it",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "baseline",
          "dependsOn": [
            "DREL-101"
          ],
          "scenario": "Staging and production-like environments run images compiled at different times from the same source label.",
          "acceptanceCriteria": [
            "Build creates one content-addressed artifact",
            "Promotion changes environment references without changing bytes",
            "Environment record retains promotion actor, time, and source environment"
          ],
          "implementationNotes": [
            "Configuration remains external and versioned; it is not baked differently into each image."
          ],
          "verification": [
            "Promote one digest through two fixture environments and compare bytes.",
            "Attempt promotion with a mismatching manifest and block the transition."
          ],
          "deliverables": [
            "Promotion command and byte-identity tests"
          ],
          "rollout": "Adopt from test to staging before changing the final environment.",
          "skills": [
            "Artifact promotion",
            "Immutability"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "a353edb1-9ede-4d47-b034-85a0d7751dc1",
          "key": "DREL-104",
          "title": "Gate promotion on database compatibility",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "control",
          "dependsOn": [
            "DREL-103"
          ],
          "scenario": "A release expects a renamed column while rollback still expects the old one, making the nominal rollback artifact unusable.",
          "acceptanceCriteria": [
            "Manifest declares required and provided schema compatibility window",
            "Promotion checks current environment schema before deployment",
            "Rollback target is validated against post-migration schema"
          ],
          "implementationNotes": [
            "Use fixture schema versions; do not execute migrations against a real database."
          ],
          "verification": [
            "Promote an expand-compatible release and validate its rollback target.",
            "Attempt a contract-first release and show the gate identifies the incompatible direction."
          ],
          "deliverables": [
            "Schema compatibility gate and rollout matrix"
          ],
          "rollout": "Require expand, migrate, contract phases for destructive changes.",
          "skills": [
            "Database migrations",
            "Compatibility",
            "Rollback planning"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Database engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "23cfe1d5-b2bc-49c8-a618-9ef36e17940c",
          "key": "DREL-105",
          "title": "Canary one cohort with a measurable abort rule",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DREL-103",
            "DREL-104"
          ],
          "scenario": "A canary is called healthy because no one watched it for long, despite a synthetic error spike in one endpoint.",
          "acceptanceCriteria": [
            "Canary binds cohort, duration, traffic minimum, and comparison baseline",
            "Abort evaluates declared error and latency thresholds",
            "Insufficient observations remain inconclusive"
          ],
          "implementationNotes": [
            "Use deterministic synthetic traffic; thresholds apply only to this exercise."
          ],
          "verification": [
            "Run a healthy canary through the full observation window.",
            "Inject an endpoint-specific regression and confirm automatic halt before wider rollout."
          ],
          "deliverables": [
            "Canary policy, evaluator, and regression fixtures"
          ],
          "rollout": "Expand only after a conclusive passing result.",
          "skills": [
            "Progressive delivery",
            "Release analysis"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "f95388c5-7823-4bd0-9c23-9b3d54c0e678",
          "key": "DREL-106",
          "title": "Pause a release when deployment state drifts",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "control",
          "dependsOn": [
            "DREL-103"
          ],
          "scenario": "A manual fixture change replaces one replica image, but the release controller continues and records the target digest as complete.",
          "acceptanceCriteria": [
            "Reconciliation compares desired and observed digest per instance",
            "Unexpected drift pauses rollout and identifies affected instances",
            "Repair requires an explicit decision to restore desired state or adopt a new release"
          ],
          "implementationNotes": [
            "Do not overwrite drift before recording it."
          ],
          "verification": [
            "Complete a rollout whose observations match the release.",
            "Change one instance out of band and confirm the controller pauses without erasing evidence."
          ],
          "deliverables": [
            "Drift detector and paused-release flow"
          ],
          "rollout": "Begin with report-only drift detection in the simulator.",
          "skills": [
            "Reconciliation",
            "Configuration drift"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Platform engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "af9474f3-ffe4-4f1d-a560-d1143b6f58a8",
          "key": "DREL-107",
          "title": "Authorize release approval for the exact artifact",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "control",
          "dependsOn": [
            "DREL-101",
            "DREL-105"
          ],
          "scenario": "An approval made for one digest remains valid after the release record is edited to point at another artifact.",
          "acceptanceCriteria": [
            "Approval binds artifact digest, environment, policy version, and expiry",
            "Any bound-field change invalidates approval",
            "Requester cannot satisfy a required independent approval role"
          ],
          "implementationNotes": [
            "Use synthetic identities and permissions; this is workflow authorization, not proof of code authorship."
          ],
          "verification": [
            "Approve and promote the exact eligible release.",
            "Change digest and replay the approval token, then verify denial and audit."
          ],
          "deliverables": [
            "Release approval boundary and replay tests"
          ],
          "rollout": "Require explicit approval for the final simulated environment first.",
          "skills": [
            "Authorization",
            "Release governance",
            "Audit"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Security",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "f4b2bfa9-4da7-4896-86e6-9c8f99554548",
          "key": "DREL-108",
          "title": "Rollback to a known artifact without rebuilding source",
          "type": "CHORE",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "handoff",
          "dependsOn": [
            "DREL-104",
            "DREL-105",
            "DREL-106"
          ],
          "scenario": "The rollback command checks out an old tag and rebuilds it with current dependencies, producing bytes never previously tested.",
          "acceptanceCriteria": [
            "Rollback selects a previously promoted immutable digest",
            "Compatibility gate evaluates current schema and configuration",
            "Release history records the failed and restored identities"
          ],
          "implementationNotes": [
            "Rollback does not delete the failed artifact or rewrite its record."
          ],
          "verification": [
            "Roll forward, trigger the abort rule, and restore the exact prior digest.",
            "Remove the prior artifact from the registry fixture and block rollback with a recovery instruction."
          ],
          "deliverables": [
            "Digest-based rollback command and rehearsal"
          ],
          "rollout": "Maintain at least one verified compatible rollback target per environment.",
          "skills": [
            "Rollback",
            "Artifact retention",
            "Incident response"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "c1ba6b1b-9de4-4ae3-a869-01afe8558711",
          "key": "DREL-109",
          "title": "Resume promotion after the registry response disappears",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 360,
          "phaseId": "handoff",
          "dependsOn": [
            "DREL-103",
            "DREL-108"
          ],
          "scenario": "The registry accepts a promotion tag and drops the response; retry sees the tag but cannot tell whether it was created by this operation.",
          "acceptanceCriteria": [
            "Promotion uses deterministic operation identity",
            "Retry reads digest and operation metadata before mutation",
            "Conflicting existing tag becomes visible and blocks automatic continuation"
          ],
          "implementationNotes": [
            "The registry adapter is local and provider responses are treated as untrusted input."
          ],
          "verification": [
            "Promote and replay one operation with the same result.",
            "Drop the acceptance response and separately precreate a conflicting tag."
          ],
          "deliverables": [
            "Idempotent promotion adapter and ambiguity tests"
          ],
          "rollout": "Enable one registry namespace while retaining digest-only deployment.",
          "skills": [
            "Idempotency",
            "Registry APIs",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 60
            },
            {
              "field": "Integrations",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "8f4e8668-22ec-4080-af14-1aea48e1da60",
          "key": "DREL-110",
          "title": "Publish a release ledger that answers what is running",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "handoff",
          "dependsOn": [
            "DREL-102",
            "DREL-106",
            "DREL-108",
            "DREL-109"
          ],
          "scenario": "During a rehearsal, responders compare commit hashes from logs because there is no single view of release, artifact, configuration, and schema identity.",
          "acceptanceCriteria": [
            "Ledger shows desired and observed artifact per environment",
            "Entries include configuration and schema compatibility identities",
            "Failed, paused, rolled-back, and superseded releases remain inspectable"
          ],
          "implementationNotes": [
            "The ledger is append-oriented planning and operational data; it is not candidate evidence."
          ],
          "verification": [
            "Trace a promotion, pause, and rollback from ledger entries.",
            "Remove an observation and confirm the view displays uncertainty rather than inferred state."
          ],
          "deliverables": [
            "Release ledger projection and responder guide"
          ],
          "rollout": "Use the ledger during a full local rollback rehearsal before handoff.",
          "skills": [
            "Release observability",
            "Audit trails",
            "Runbooks"
          ],
          "fieldMix": [
            {
              "field": "DevOps",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        }
      ],
      "id": "92ac7bad-92e7-478c-b25e-6cd40d07548c"
    }
  ]
}
