{
  "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": "8bed83db-0f26-4d1d-82a8-1f469de2a232",
      "key": "CMIGR",
      "title": "A safe source migration for a deprecated configuration API",
      "field": "Compiler and language tooling",
      "summary": "Transform one deprecated call shape through syntax-aware, reviewable file edits.",
      "context": "Fictional package Laurel replaces configure(name, options) with configure({name, options}). Build synthetic TypeScript-like AST fixtures or use the repository's installed parser; source is analyzed, never executed.",
      "stack": [
        "TypeScript",
        "AST adapter",
        "Filesystem adapter",
        "Vitest"
      ],
      "prerequisites": [
        "Create synthetic supported and ambiguous call-site fixtures.",
        "Define the exact old/new API contract and a dedicated output directory."
      ],
      "developerValue": "Practice conservative automated refactoring and reviewable uncertainty.",
      "companyValue": "Inspect whether migration automation reduces repetitive work without silent semantic changes.",
      "delivery": "Only the declared API migration is covered; ambiguous cases must remain manual.",
      "phases": [
        {
          "id": "discovery",
          "title": "Find eligible calls",
          "goal": "Resolve syntax and binding identity."
        },
        {
          "id": "transform",
          "title": "Produce conservative edits",
          "goal": "Preserve comments and reject ambiguity."
        },
        {
          "id": "delivery",
          "title": "Apply and verify safely",
          "goal": "Make changes reviewable and recoverable."
        }
      ],
      "tickets": [
        {
          "id": "2c38d56a-b1d6-462d-9ee1-a49cfb36130e",
          "key": "CMIGR-101",
          "title": "Identify deprecated configuration imports by resolved binding",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "discovery",
          "dependsOn": [],
          "scenario": "Text search matches unrelated local functions named configure. Discover calls through the imported binding.",
          "acceptanceCriteria": [
            "Imported binding matches",
            "Aliased import matches",
            "Unrelated local name does not match"
          ],
          "implementationNotes": [
            "Scope is the declared module identifier only."
          ],
          "verification": [
            "Find direct and aliased import",
            "Use unrelated local configure"
          ],
          "deliverables": [
            "Call-site discovery and cases"
          ],
          "rollout": "Report candidates without editing if resolution is uncertain.",
          "skills": [
            "Static analysis",
            "Bindings"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "74169c04-1304-4749-a37b-e18bd8da12ce",
          "key": "CMIGR-102",
          "title": "Exclude comments and string literals from configuration migration candidates",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "discovery",
          "dependsOn": [
            "CMIGR-101"
          ],
          "scenario": "A prototype replaces examples inside strings and comments. Use syntax node kinds for candidate selection.",
          "acceptanceCriteria": [
            "Executable call nodes alone qualify",
            "Comment text remains unchanged",
            "String contents remain unchanged"
          ],
          "implementationNotes": [
            "Source analysis does not execute expressions."
          ],
          "verification": [
            "Find real call",
            "Include matching text in comment and string"
          ],
          "deliverables": [
            "Syntax filter and fixtures"
          ],
          "rollout": "Disable text-based fallback entirely.",
          "skills": [
            "AST",
            "Parsing"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "81931904-e124-4978-9ce8-9d5123cb56ec",
          "key": "CMIGR-103",
          "title": "Report ambiguous configuration calls for manual review",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "discovery",
          "dependsOn": [
            "CMIGR-101",
            "CMIGR-102"
          ],
          "scenario": "Spread arguments and reassigned bindings make transformation unsafe. Return explicit skipped reasons.",
          "acceptanceCriteria": [
            "Supported two-argument calls qualify",
            "Spread or reassigned cases skip",
            "Skipped locations are listed"
          ],
          "implementationNotes": [
            "Do not invent argument meaning from names."
          ],
          "verification": [
            "Classify supported call",
            "Classify spread and reassignment"
          ],
          "deliverables": [
            "Eligibility report and cases"
          ],
          "rollout": "Keep ambiguous files unchanged.",
          "skills": [
            "Program analysis",
            "Uncertainty"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "40459a57-15b7-4391-a94b-61dd5aa49f06",
          "key": "CMIGR-104",
          "title": "Transform the supported configuration call shape without reordering evaluation",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "transform",
          "dependsOn": [
            "CMIGR-103"
          ],
          "scenario": "Wrapping arguments into an object could reorder side-effecting expressions. Preserve the old left-to-right evaluation order.",
          "acceptanceCriteria": [
            "Name expression remains first",
            "Options remains second",
            "No expression duplicates or disappears"
          ],
          "implementationNotes": [
            "Verify syntax structure without executing candidate expressions."
          ],
          "verification": [
            "Transform ordinary expressions",
            "Use synthetic call expressions in both positions"
          ],
          "deliverables": [
            "Transformation and AST-order checks"
          ],
          "rollout": "Revert transformed files if evaluation order cannot be preserved.",
          "skills": [
            "Semantics",
            "Refactoring"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "59496b96-e717-44d6-86ea-c726e6f6897d",
          "key": "CMIGR-105",
          "title": "Preserve configuration-call comments during transformation",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "transform",
          "dependsOn": [
            "CMIGR-104"
          ],
          "scenario": "Comments between arguments vanish in generated output. Attach trivia using a documented preservation rule.",
          "acceptanceCriteria": [
            "Leading and trailing comments survive",
            "Argument comments remain near their expression",
            "Unrepresentable trivia causes skip"
          ],
          "implementationNotes": [
            "Do not silently relocate a directive comment."
          ],
          "verification": [
            "Transform commented call",
            "Use directive-like ambiguous comment"
          ],
          "deliverables": [
            "Trivia-preserving transform and cases"
          ],
          "rollout": "Leave affected call unchanged with a review reason.",
          "skills": [
            "Syntax trees",
            "Comments"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "55207d12-36b8-40be-a69f-53f51641903f",
          "key": "CMIGR-106",
          "title": "Make the configuration migration idempotent",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "transform",
          "dependsOn": [
            "CMIGR-104",
            "CMIGR-105"
          ],
          "scenario": "Running the migration twice wraps an already migrated call again. Recognize new syntax and preserve it.",
          "acceptanceCriteria": [
            "Second run produces no diff",
            "Mixed old/new files transform eligible old calls",
            "Unrelated object arguments remain unchanged"
          ],
          "implementationNotes": [
            "Idempotence is checked on printed source as well as AST."
          ],
          "verification": [
            "Run twice on migrated fixture",
            "Run on mixed file"
          ],
          "deliverables": [
            "Idempotency cases and migration guard"
          ],
          "rollout": "Stop repeated application if the second run changes output.",
          "skills": [
            "Refactoring",
            "Idempotency"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 80
            },
            {
              "field": "Developer tooling",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "21911cae-fa21-42e0-a2e1-e072678ee138",
          "key": "CMIGR-107",
          "title": "Reject overlapping configuration source edits before writing",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "transform",
          "dependsOn": [
            "CMIGR-104",
            "CMIGR-106"
          ],
          "scenario": "Nested eligible calls produce overlapping text edits and corrupt files. Plan edits with deterministic nesting handling.",
          "acceptanceCriteria": [
            "Edits do not overlap",
            "Nested calls follow documented policy",
            "Ambiguous overlap skips file safely"
          ],
          "implementationNotes": [
            "Prefer one syntax-tree rewrite over blind offset patches."
          ],
          "verification": [
            "Transform disjoint calls",
            "Transform nested eligible calls"
          ],
          "deliverables": [
            "Edit planner and overlap cases"
          ],
          "rollout": "Emit preview only for files with unresolved overlaps.",
          "skills": [
            "Algorithms",
            "Source transformation"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "abd17d7c-b233-4cb3-86c4-5cc449833c17",
          "key": "CMIGR-108",
          "title": "Preview configuration migration changes before applying them",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "delivery",
          "dependsOn": [
            "CMIGR-107"
          ],
          "scenario": "Developers need to review the exact transformation scope. Add a dry-run diff and skipped-call summary.",
          "acceptanceCriteria": [
            "Preview writes no source files",
            "Diff reflects proposed bytes",
            "Skipped reasons include locations"
          ],
          "implementationNotes": [
            "Default command mode should be explicit in usage."
          ],
          "verification": [
            "Preview supported fixture",
            "Preview ambiguous file and compare unchanged bytes"
          ],
          "deliverables": [
            "Dry-run report and immutability check"
          ],
          "rollout": "Disable apply mode if preview differs from actual output.",
          "skills": [
            "CLI",
            "Developer experience"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 60
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "4766fe65-8c01-4d70-a717-78a48bed274d",
          "key": "CMIGR-109",
          "title": "Apply configuration migration files with stale-input protection",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "delivery",
          "dependsOn": [
            "CMIGR-108"
          ],
          "scenario": "A developer edits a file after preview and apply overwrites it. Compare the original digest before replacement.",
          "acceptanceCriteria": [
            "Matching source applies",
            "Changed source is rejected",
            "Failed replacement preserves recoverable original"
          ],
          "implementationNotes": [
            "Restrict writes to the explicit fixture root."
          ],
          "verification": [
            "Apply unchanged preview",
            "Modify file before apply"
          ],
          "deliverables": [
            "Guarded writer and failure cases"
          ],
          "rollout": "Restore preserved original only after checking target identity.",
          "skills": [
            "Concurrency",
            "Filesystem"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "42975b91-4ff2-493c-9961-76f062495875",
          "key": "CMIGR-110",
          "title": "Summarize configuration migration outcomes without claiming full compatibility",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "delivery",
          "dependsOn": [
            "CMIGR-109"
          ],
          "scenario": "A green migration summary implies the whole package is compatible despite skipped sites. Report exact supported outcomes.",
          "acceptanceCriteria": [
            "Counts distinguish changed unchanged and skipped",
            "Follow-up checks are listed",
            "No semantic proof is asserted beyond tested contract"
          ],
          "implementationNotes": [
            "Run parser/type checks available in the fixture harness."
          ],
          "verification": [
            "Summarize complete supported fixture",
            "Summarize mixed skipped case"
          ],
          "deliverables": [
            "Migration report and verification record"
          ],
          "rollout": "Mark migration incomplete when required checks fail.",
          "skills": [
            "Reporting",
            "Verification"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 60
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
