{
  "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": "ee9b7116-54b1-444c-b503-3e7ca805c2ad",
      "key": "ACONFIG",
      "title": "Release configuration without restarting every service",
      "field": "Platform engineering",
      "summary": "Validate, version and distribute runtime configuration with bounded staleness.",
      "context": "A fictional internal reporting platform changes feature and timeout settings through environment edits. Partial rollouts leave API and worker processes interpreting different values.",
      "stack": [
        "TypeScript",
        "PostgreSQL",
        "HTTP"
      ],
      "prerequisites": [
        "Create local API and worker configuration consumers.",
        "Use fabricated settings without secrets."
      ],
      "developerValue": "Practice configuration contracts, compatibility and failure recovery.",
      "companyValue": "Review controlled configuration delivery with inspectable blast radius.",
      "delivery": "Ten scoped tickets across three phases. Build a synthetic local service or select a ticket after recreating its prerequisites; estimates exclude setup.",
      "phases": [
        {
          "id": "schema",
          "title": "Make settings explicit",
          "goal": "Define typed settings and safe defaults."
        },
        {
          "id": "release",
          "title": "Distribute revisions",
          "goal": "Publish compatible snapshots and control adoption."
        },
        {
          "id": "operate",
          "title": "Handle stale consumers",
          "goal": "Observe adoption and recover rejected changes."
        }
      ],
      "tickets": [
        {
          "id": "b2ad83b8-66fd-41cb-b6bc-211d129915f4",
          "key": "ACONFIG-101",
          "title": "Inventory runtime settings with owners and restart requirements",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "schema",
          "dependsOn": [],
          "scenario": "Operators cannot tell whether changing a timeout requires a worker restart or takes effect on the next request.",
          "acceptanceCriteria": [
            "List type, owner, default and adoption boundary for each setting.",
            "Separate secrets from nonsecret runtime configuration.",
            "Mark unknown behavior as unresolved before rollout."
          ],
          "implementationNotes": [
            "Use a small fictional inventory of eight settings."
          ],
          "verification": [
            "Trace one dynamic setting through its read boundary.",
            "Identify a startup-only setting and prevent a dynamic edit."
          ],
          "deliverables": [
            "Configuration inventory and adoption contract"
          ],
          "rollout": "Review the inventory before exposing edits; keep unresolved settings read-only.",
          "skills": [
            "Configuration management",
            "Technical documentation"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "c4fd64b5-2baf-40ca-9f03-f13c8cdba256",
          "key": "ACONFIG-102",
          "title": "Reject invalid timeout combinations as one configuration unit",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "schema",
          "dependsOn": [
            "ACONFIG-101"
          ],
          "scenario": "A retry timeout exceeds the entire request deadline, causing requests to continue working after callers have disconnected.",
          "acceptanceCriteria": [
            "Validate relationships between attempt, retry and total deadlines.",
            "Reject the complete candidate snapshot on any invalid relation.",
            "Return field paths with safe values only."
          ],
          "implementationNotes": [
            "Use explicit duration units; reject implicit unit conversion."
          ],
          "verification": [
            "Accept a documented valid retry budget.",
            "Reject a larger attempt timeout than total deadline without changing active settings."
          ],
          "deliverables": [
            "Snapshot validator and deadline fixtures"
          ],
          "rollout": "Add validation to drafts; preserve the active snapshot on any rejection.",
          "skills": [
            "Validation",
            "Deadline budgets"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 80
            },
            {
              "field": "Backend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "43ea31c9-9a97-4843-b404-92d91b6e0785",
          "key": "ACONFIG-103",
          "title": "Define an immutable configuration snapshot envelope",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "schema",
          "dependsOn": [
            "ACONFIG-101",
            "ACONFIG-102"
          ],
          "scenario": "A config endpoint returns a mutable object with no revision, so incident reports cannot establish which settings were read.",
          "acceptanceCriteria": [
            "Include revision, canonical hash and schema version.",
            "Published snapshot content cannot be edited in place.",
            "Exclude secret material from serialization and logs."
          ],
          "implementationNotes": [
            "Use opaque IDs and UTC publication metadata."
          ],
          "verification": [
            "Read the same revision twice and compare hashes.",
            "Attempt an in-place edit and reject it."
          ],
          "deliverables": [
            "Snapshot contract and immutability checks"
          ],
          "rollout": "Start versioned publication alongside legacy reads; retain published revisions for recovery.",
          "skills": [
            "Versioning",
            "Immutability"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "f89ccbe1-05bf-466a-ad17-c37957288310",
          "key": "ACONFIG-104",
          "title": "Atomically adopt a validated configuration snapshot in each process",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "release",
          "dependsOn": [
            "ACONFIG-103"
          ],
          "scenario": "A process updates settings one field at a time, briefly combining a new retry count with an old deadline.",
          "acceptanceCriteria": [
            "Validate the full snapshot before replacing the active reference.",
            "Each request captures one revision for its lifetime.",
            "Failed adoption retains the complete previous snapshot."
          ],
          "implementationNotes": [
            "Avoid mutating shared configuration objects after publication."
          ],
          "verification": [
            "Switch snapshots during requests and observe one revision per request.",
            "Reject one invalid field and retain every previous value."
          ],
          "deliverables": [
            "Atomic consumer adapter and concurrent-read probe"
          ],
          "rollout": "Canary a local worker consumer; pin its previous revision if adoption fails.",
          "skills": [
            "Concurrency",
            "Configuration delivery"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 60
            },
            {
              "field": "Backend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "4f55c0ae-868b-4426-a23c-655dd5904323",
          "key": "ACONFIG-105",
          "title": "Publish configuration only against the revision reviewed by the operator",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "release",
          "dependsOn": [
            "ACONFIG-103",
            "ACONFIG-104"
          ],
          "scenario": "Two operators edit the same draft; the last publisher activates changes based on a stale review.",
          "acceptanceCriteria": [
            "Require expected draft revision and reviewed hash.",
            "Commit publication and active selection together.",
            "Return a conflict with safe revision metadata on stale publication."
          ],
          "implementationNotes": [
            "Record actor and reason in an append-only audit record."
          ],
          "verification": [
            "Publish an unchanged reviewed snapshot.",
            "Race two publishers and assert one accepted active transition."
          ],
          "deliverables": [
            "Optimistic publication command and race test"
          ],
          "rollout": "Enable publication for a synthetic operator role; disable writes if audit persistence fails.",
          "skills": [
            "Optimistic concurrency",
            "Audit logs"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 60
            },
            {
              "field": "Database engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "17994255-b8c0-4be6-844f-b7a92cfc1ea3",
          "key": "ACONFIG-106",
          "title": "Keep incompatible consumers on their last valid configuration",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "release",
          "dependsOn": [
            "ACONFIG-104",
            "ACONFIG-105"
          ],
          "scenario": "A new configuration schema reaches an older worker that silently ignores a field needed to preserve retry limits.",
          "acceptanceCriteria": [
            "Consumers declare accepted schema versions.",
            "Incompatible snapshots are rejected with explicit adoption status.",
            "Critical missing configuration fails closed under the documented startup policy."
          ],
          "implementationNotes": [
            "Do not coerce unknown versions into the current schema."
          ],
          "verification": [
            "Adopt compatible settings in old and new local consumers.",
            "Send a new unsupported schema and preserve the old snapshot or fail startup as declared."
          ],
          "deliverables": [
            "Compatibility handshake and failure matrix"
          ],
          "rollout": "Deploy compatible readers before publishing new schema; repoint to the older supported revision if needed.",
          "skills": [
            "Compatibility",
            "Fail-closed design"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 80
            },
            {
              "field": "API design",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "1706ef70-de4b-4861-a799-1671f55d4738",
          "key": "ACONFIG-107",
          "title": "Stage a timeout revision for a named consumer cohort",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 180,
          "phaseId": "release",
          "dependsOn": [
            "ACONFIG-105",
            "ACONFIG-106"
          ],
          "scenario": "The team wants to test a timeout change on background reports before affecting interactive requests.",
          "acceptanceCriteria": [
            "Bind cohort selection to stable nonpersonal service identity.",
            "Show intended and acknowledged revision per cohort.",
            "Unselected consumers retain their current target revision."
          ],
          "implementationNotes": [
            "Use deterministic synthetic cohort membership."
          ],
          "verification": [
            "Adopt a revision in the report-worker cohort only.",
            "Use an unknown cohort and reject publication without target changes."
          ],
          "deliverables": [
            "Cohort rollout command and targeting cases"
          ],
          "rollout": "Begin with one synthetic cohort; restore its previous target revision on errors.",
          "skills": [
            "Progressive delivery",
            "Targeting"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "56898142-45ed-46bf-9614-6a87b75bb333",
          "key": "ACONFIG-108",
          "title": "Report configuration staleness separately from application health",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "operate",
          "dependsOn": [
            "ACONFIG-106",
            "ACONFIG-107"
          ],
          "scenario": "A healthy process missed several configuration polls, but a green liveness check hides that it is running stale limits.",
          "acceptanceCriteria": [
            "Expose active and target revision plus last successful poll time.",
            "Distinguish stale, incompatible and unavailable states.",
            "Avoid including configuration values in generic health payloads."
          ],
          "implementationNotes": [
            "Use a fake clock for staleness boundaries."
          ],
          "verification": [
            "Advance target while a consumer stays behind and report stale.",
            "Lose the configuration endpoint and keep the declared last-known-good behavior visible."
          ],
          "deliverables": [
            "Adoption status projection"
          ],
          "rollout": "Add the status endpoint before alerts; disable noisy alerts without hiding adoption state.",
          "skills": [
            "Observability",
            "Health semantics"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 60
            },
            {
              "field": "Platform engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "0983f778-385e-4435-a52d-d62bab50a5e7",
          "key": "ACONFIG-109",
          "title": "Rollback configuration by selecting a prior immutable snapshot",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "operate",
          "dependsOn": [
            "ACONFIG-105",
            "ACONFIG-108"
          ],
          "scenario": "An operator attempts to repair a bad timeout by manually rewriting the active record, erasing the incident's configuration history.",
          "acceptanceCriteria": [
            "Rollback appends a selection event with reason and actor.",
            "Validate old snapshot compatibility before selection.",
            "Retain the bad revision and its adoption record."
          ],
          "implementationNotes": [
            "Use the same guarded publication boundary as forward changes."
          ],
          "verification": [
            "Select a compatible prior revision and observe consumer adoption.",
            "Attempt rollback to an incompatible schema and leave the target unchanged."
          ],
          "deliverables": [
            "Audited rollback command"
          ],
          "rollout": "Rehearse on synthetic consumers; pin a known compatible revision if adoption stalls.",
          "skills": [
            "Recovery",
            "Auditability"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "032603c0-aea6-494f-8b6e-0cf13ccc70cb",
          "key": "ACONFIG-110",
          "title": "Exercise configuration service loss during a rolling deployment",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "operate",
          "dependsOn": [
            "ACONFIG-106",
            "ACONFIG-109"
          ],
          "scenario": "The configuration endpoint becomes unavailable while old and new workers are starting with different cached snapshots.",
          "acceptanceCriteria": [
            "Describe startup and running-process behavior separately.",
            "Prove critical settings cannot start from an unvalidated cache.",
            "Record revision selection and recovery for both consumer versions."
          ],
          "implementationNotes": [
            "Use local fault injection; no production configuration changes."
          ],
          "verification": [
            "Disconnect the endpoint after valid adoption and retain the declared bounded behavior.",
            "Start with a corrupt cache during outage and reject startup safely."
          ],
          "deliverables": [
            "Outage drill and compatibility trace"
          ],
          "rollout": "Run before rollout; halt the deployment if a consumer cannot demonstrate its selected revision.",
          "skills": [
            "Fault injection",
            "Operational readiness"
          ],
          "fieldMix": [
            {
              "field": "Platform engineering",
              "percentage": 50
            },
            {
              "field": "Site reliability",
              "percentage": 30
            },
            {
              "field": "Quality engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
