{
  "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": "7f9c9b7a-6c9b-4e03-baba-9fc0db864ade",
      "key": "CLSP",
      "title": "A focused language server for configuration editing",
      "field": "Compiler and language tooling",
      "summary": "Add document versions, diagnostics, completion and safe edits to a local protocol server.",
      "context": "Fictional config editor Hazel speaks a bounded subset of the Language Server Protocol through a local transport adapter. Use a tiny declared configuration grammar and synthetic documents.",
      "stack": [
        "TypeScript",
        "JSON-RPC",
        "Local protocol adapter",
        "Vitest"
      ],
      "prerequisites": [
        "Define the supported protocol subset and configuration grammar.",
        "Create synthetic open/change/close messages and workspace fixtures."
      ],
      "developerValue": "Practice protocol ordering and document-safe editing.",
      "companyValue": "Inspect whether editor assistance preserves current user text and file boundaries.",
      "delivery": "Test through local protocol messages; editor marketplace publishing is excluded.",
      "phases": [
        {
          "id": "documents",
          "title": "Own document state",
          "goal": "Validate lifecycle and positions."
        },
        {
          "id": "features",
          "title": "Provide scoped assistance",
          "goal": "Return current diagnostics and bounded edits."
        },
        {
          "id": "recovery",
          "title": "Handle client interruption",
          "goal": "Cancel stale work and recover protocol errors."
        }
      ],
      "tickets": [
        {
          "id": "52d0c625-6fa3-433e-b09b-1982b1bd8f4c",
          "key": "CLSP-101",
          "title": "Reject configuration edits for unopened language-server documents",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "documents",
          "dependsOn": [],
          "scenario": "A change notification for an unknown URI crashes the document map. Validate document lifecycle.",
          "acceptanceCriteria": [
            "Open establishes document state",
            "Unknown change is handled explicitly",
            "Close releases state"
          ],
          "implementationNotes": [
            "Follow the declared protocol subset's error behavior."
          ],
          "verification": [
            "Open then change fixture",
            "Change unopened document"
          ],
          "deliverables": [
            "Document lifecycle handler and cases"
          ],
          "rollout": "Ignore unsupported lifecycle notifications with bounded diagnostics.",
          "skills": [
            "Protocols",
            "State machines"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 80
            },
            {
              "field": "API design",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "e6c4bf78-25c2-4f65-a227-d86953e93623",
          "key": "CLSP-102",
          "title": "Convert language-server positions using a declared encoding",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "documents",
          "dependsOn": [
            "CLSP-101"
          ],
          "scenario": "Emoji before an error shifts the underline. Add position conversion matching the negotiated encoding.",
          "acceptanceCriteria": [
            "ASCII positions map correctly",
            "Supplementary characters map correctly",
            "Out-of-range positions are rejected"
          ],
          "implementationNotes": [
            "Do not assume byte offsets equal editor positions."
          ],
          "verification": [
            "Edit after emoji",
            "Request position beyond line end"
          ],
          "deliverables": [
            "Position codec and Unicode cases"
          ],
          "rollout": "Advertise only the verified encoding until others are implemented.",
          "skills": [
            "Unicode",
            "Source positions"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "71d68d80-78db-472a-aa51-fb550b761901",
          "key": "CLSP-103",
          "title": "Apply configuration document edits in the supplied version order",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "documents",
          "dependsOn": [
            "CLSP-101",
            "CLSP-102"
          ],
          "scenario": "Delayed changes replace newer document content. Track monotonic document versions and ordered edits.",
          "acceptanceCriteria": [
            "New valid version applies",
            "Old version cannot overwrite",
            "Invalid range leaves prior snapshot intact"
          ],
          "implementationNotes": [
            "Apply one notification atomically to a cloned snapshot."
          ],
          "verification": [
            "Apply ordered incremental edits",
            "Send stale version and invalid range"
          ],
          "deliverables": [
            "Versioned document store"
          ],
          "rollout": "Request full resynchronization after rejected inconsistent edits.",
          "skills": [
            "Concurrency",
            "Document models"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "7cf186c3-8884-4914-8191-8758916f0066",
          "key": "CLSP-104",
          "title": "Publish configuration diagnostics for the checked document version",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "features",
          "dependsOn": [
            "CLSP-103"
          ],
          "scenario": "Parser results are published after users type more text. Bind diagnostics to the source snapshot checked.",
          "acceptanceCriteria": [
            "Current results publish",
            "Superseded results drop",
            "Closed documents clear diagnostics"
          ],
          "implementationNotes": [
            "Snapshot identity includes URI and version."
          ],
          "verification": [
            "Check unchanged document",
            "Close or edit before check completes"
          ],
          "deliverables": [
            "Diagnostic publication guard"
          ],
          "rollout": "Disable background checking and use explicit validation temporarily.",
          "skills": [
            "Async state",
            "Diagnostics"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "c4bf974a-ae92-43fc-95a6-65a568455e38",
          "key": "CLSP-105",
          "title": "Complete configuration keys only within valid assignment contexts",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "features",
          "dependsOn": [
            "CLSP-102",
            "CLSP-103"
          ],
          "scenario": "Completion suggests keys inside string literals and comments. Restrict suggestions using syntax context.",
          "acceptanceCriteria": [
            "Assignment context gets known keys",
            "String/comment contexts suppress keys",
            "Incomplete assignment remains supported"
          ],
          "implementationNotes": [
            "Use public grammar metadata, not hidden evaluator assets."
          ],
          "verification": [
            "Complete incomplete key",
            "Request completion inside quoted value"
          ],
          "deliverables": [
            "Context completion and cases"
          ],
          "rollout": "Return no suggestions when context cannot be determined.",
          "skills": [
            "Syntax analysis",
            "Completion"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "7a17d29c-35e1-4431-934b-b895f7baaab5",
          "key": "CLSP-106",
          "title": "Return configuration rename edits only for resolved local bindings",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "features",
          "dependsOn": [
            "CLSP-103",
            "CLSP-105"
          ],
          "scenario": "Rename replaces matching text inside comments and unrelated scopes. Resolve the selected symbol before creating edits.",
          "acceptanceCriteria": [
            "Bound references rename",
            "Shadowed symbols stay unchanged",
            "Unresolved selection yields no edit"
          ],
          "implementationNotes": [
            "This ticket supports one document only."
          ],
          "verification": [
            "Rename binding and references",
            "Select comment text or shadowed name"
          ],
          "deliverables": [
            "Symbol rename and isolation cases"
          ],
          "rollout": "Disable rename if symbol resolution is ambiguous.",
          "skills": [
            "Refactoring",
            "Scopes"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "c85dbf2b-d8cf-4e74-85d3-c4343b2fd161",
          "key": "CLSP-107",
          "title": "Attach expected document versions to configuration code actions",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "features",
          "dependsOn": [
            "CLSP-104",
            "CLSP-106"
          ],
          "scenario": "Applying an old quick fix corrupts newer text. Include the snapshot version in the edit contract.",
          "acceptanceCriteria": [
            "Matching version applies",
            "Changed version is rejected or recomputed",
            "Action describes its actual mutation"
          ],
          "implementationNotes": [
            "Do not apply stale offsets optimistically."
          ],
          "verification": [
            "Apply fresh missing-delimiter fix",
            "Edit before applying old action"
          ],
          "deliverables": [
            "Versioned code action and cases"
          ],
          "rollout": "Hide code actions if client cannot enforce edit versions.",
          "skills": [
            "Protocol design",
            "Concurrency"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 70
            },
            {
              "field": "API design",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "d5738bfd-45f9-4d82-ae5c-e4c33e936545",
          "key": "CLSP-108",
          "title": "Cancel language-server requests without leaking pending work",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "recovery",
          "dependsOn": [
            "CLSP-104",
            "CLSP-107"
          ],
          "scenario": "Repeated completion cancellation leaves tasks in memory. Add request-scoped cleanup for all terminal paths.",
          "acceptanceCriteria": [
            "Success removes pending entry",
            "Cancellation removes entry",
            "Late result does not emit another response"
          ],
          "implementationNotes": [
            "Request IDs may be reused only per protocol rules."
          ],
          "verification": [
            "Complete request",
            "Cancel then deliver late result"
          ],
          "deliverables": [
            "Request registry and cleanup tests"
          ],
          "rollout": "Limit concurrency if cleanup cannot be guaranteed.",
          "skills": [
            "Cancellation",
            "Resource management"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 60
            },
            {
              "field": "Performance engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "67ce0bdd-9b38-43a3-8cc8-ef48d35255e5",
          "key": "CLSP-109",
          "title": "Handle malformed language-server messages without losing healthy documents",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 150,
          "phaseId": "recovery",
          "dependsOn": [
            "CLSP-101",
            "CLSP-108"
          ],
          "scenario": "A malformed request resets the whole server and loses open buffers. Isolate parsing and protocol failures.",
          "acceptanceCriteria": [
            "Invalid message gets bounded error",
            "Healthy documents remain intact",
            "Transport stays usable when framing permits"
          ],
          "implementationNotes": [
            "Never log full document contents on parse failure."
          ],
          "verification": [
            "Send valid request after malformed one",
            "Send oversized message"
          ],
          "deliverables": [
            "Protocol error boundary and cases"
          ],
          "rollout": "Close only the offending transport when framing is unrecoverable.",
          "skills": [
            "Error isolation",
            "Input security"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 60
            },
            {
              "field": "Security",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "3bc7e34b-b140-481c-8fe6-37b6d3670e46",
          "key": "CLSP-110",
          "title": "Create a reproducible configuration language-server transcript harness",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "recovery",
          "dependsOn": [
            "CLSP-107",
            "CLSP-109"
          ],
          "scenario": "Editor reports are difficult to replay. Record synthetic protocol transcripts with deterministic response assertions.",
          "acceptanceCriteria": [
            "Harness replays open/edit/action/close",
            "Versions and request IDs are explicit",
            "Fixture text is synthetic"
          ],
          "implementationNotes": [
            "Recorded transcripts are public regression cases, not hidden grading answers."
          ],
          "verification": [
            "Replay successful rename",
            "Replay stale action rejection"
          ],
          "deliverables": [
            "Transcript runner and fixtures"
          ],
          "rollout": "Retain prior passing transcripts when behavior changes intentionally.",
          "skills": [
            "Testing",
            "Protocols"
          ],
          "fieldMix": [
            {
              "field": "Quality engineering",
              "percentage": 60
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
