{
  "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": "1de4edb2-d5f4-4590-a0b4-a0e7e23e6c54",
      "key": "CPARSE",
      "title": "A configuration-language parser with usable diagnostics",
      "field": "Compiler and language tooling",
      "summary": "Implement a small explicitly specified parser and recoverable source diagnostics.",
      "context": "Fictional build tool Sprig reads a tiny configuration language with identifiers, strings, lists and assignments. Author the grammar and synthetic source corpus locally; parsing never executes source.",
      "stack": [
        "TypeScript",
        "Vitest",
        "Parser fixtures"
      ],
      "prerequisites": [
        "Write the tiny language grammar and generated source examples.",
        "Create fixtures with Unicode, truncated tokens and nested lists."
      ],
      "developerValue": "Practice source positions, grammar boundaries and error recovery.",
      "companyValue": "Inspect whether tooling errors help users correct configuration safely.",
      "delivery": "Keep each change within the declared grammar; runtime evaluation is excluded.",
      "phases": [
        {
          "id": "lexing",
          "title": "Specify source tokens",
          "goal": "Preserve spans and literal meaning."
        },
        {
          "id": "parsing",
          "title": "Build recoverable syntax",
          "goal": "Handle malformed structure deterministically."
        },
        {
          "id": "tooling",
          "title": "Prepare editor consumers",
          "goal": "Keep diagnostics and printing stable."
        }
      ],
      "tickets": [
        {
          "id": "a473a110-9b11-41f6-9963-9dbfb49e44b4",
          "key": "CPARSE-101",
          "title": "Track configuration token spans across mixed newline styles",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "lexing",
          "dependsOn": [],
          "scenario": "Windows configuration files report errors one line late. Define offsets and line mapping for LF and CRLF.",
          "acceptanceCriteria": [
            "Spans cover exact token bytes or declared code units",
            "CRLF counts as one line break",
            "EOF has a valid location"
          ],
          "implementationNotes": [
            "State the offset unit explicitly."
          ],
          "verification": [
            "Tokenize mixed newline fixture",
            "Locate error at EOF"
          ],
          "deliverables": [
            "Span mapper and boundary cases"
          ],
          "rollout": "Fall back to offsets if line mapping is unreliable.",
          "skills": [
            "Lexing",
            "Source maps"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "6585625f-bce1-4c53-8026-640cdb4ec9be",
          "key": "CPARSE-102",
          "title": "Reject unterminated configuration strings with one useful diagnostic",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "lexing",
          "dependsOn": [
            "CPARSE-101"
          ],
          "scenario": "A missing quote produces dozens of bogus tokens. Add a bounded string error and recovery boundary.",
          "acceptanceCriteria": [
            "Diagnostic identifies opening quote",
            "Lexer makes forward progress",
            "Later valid line can tokenize"
          ],
          "implementationNotes": [
            "Do not guess a closing quote silently."
          ],
          "verification": [
            "Tokenize valid escaped string",
            "Tokenize missing final quote"
          ],
          "deliverables": [
            "String lexer and error cases"
          ],
          "rollout": "Stop at first string error if recovery becomes ambiguous.",
          "skills": [
            "Lexing",
            "Diagnostics"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "7aecab38-d395-4bb6-8bf3-fe637b527819",
          "key": "CPARSE-103",
          "title": "Preserve configuration string escape meaning",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "lexing",
          "dependsOn": [
            "CPARSE-102"
          ],
          "scenario": "Backslashes disappear inconsistently between parsed values and printed output. Define recognized escapes and reject unknown ones.",
          "acceptanceCriteria": [
            "Supported escapes decode exactly",
            "Unknown escape reports its span",
            "Decoded values retain nonescaped Unicode"
          ],
          "implementationNotes": [
            "Keep raw span separate from decoded value."
          ],
          "verification": [
            "Decode quote and backslash fixtures",
            "Reject unknown escape"
          ],
          "deliverables": [
            "Escape decoder and round-trip cases"
          ],
          "rollout": "Reject affected literals until decoding is corrected.",
          "skills": [
            "Parsing",
            "Unicode"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "dff169af-864e-4e94-9d54-7b1afe87845c",
          "key": "CPARSE-104",
          "title": "Parse configuration lists without unbounded recursion",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "parsing",
          "dependsOn": [
            "CPARSE-101",
            "CPARSE-103"
          ],
          "scenario": "Deeply nested synthetic lists exhaust the call stack. Enforce a documented nesting limit.",
          "acceptanceCriteria": [
            "Valid nesting parses",
            "Limit breach gives structured diagnostic",
            "Parser consumes bounded work after failure"
          ],
          "implementationNotes": [
            "Do not increase runtime stack limits as the fix."
          ],
          "verification": [
            "Parse at supported depth",
            "Exceed depth limit"
          ],
          "deliverables": [
            "List parser and depth cases"
          ],
          "rollout": "Lower accepted nesting cap if resource behavior is uncertain.",
          "skills": [
            "Parsing",
            "Resource limits"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 70
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "e1500425-d6e9-409e-853c-17ede27f7d6c",
          "key": "CPARSE-105",
          "title": "Recover configuration assignments at a documented synchronization point",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "parsing",
          "dependsOn": [
            "CPARSE-104"
          ],
          "scenario": "One missing equals sign hides all later keys. Resume at a safe assignment boundary.",
          "acceptanceCriteria": [
            "Error names expected token",
            "Later valid assignments appear",
            "Recovery never loops at same offset"
          ],
          "implementationNotes": [
            "Specify which tokens terminate recovery."
          ],
          "verification": [
            "Parse malformed then valid assignment",
            "Use repeated unexpected delimiters"
          ],
          "deliverables": [
            "Recovery strategy and progress tests"
          ],
          "rollout": "Use fail-fast parsing if recovery corrupts structure.",
          "skills": [
            "Error recovery",
            "Parser design"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "52d40738-f626-41a9-9cf0-c7ac630a2faa",
          "key": "CPARSE-106",
          "title": "Detect duplicate configuration keys with both source locations",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "parsing",
          "dependsOn": [
            "CPARSE-105"
          ],
          "scenario": "Repeated keys silently overwrite earlier values. Report the later assignment with a related earlier location.",
          "acceptanceCriteria": [
            "Duplicate is explicit",
            "Both spans are available",
            "Distinct nested scopes remain independent"
          ],
          "implementationNotes": [
            "Do not normalize identifiers beyond the grammar contract."
          ],
          "verification": [
            "Detect duplicate in one scope",
            "Use same key in separate scopes"
          ],
          "deliverables": [
            "Duplicate-key pass and cases"
          ],
          "rollout": "Reject duplicate-bearing files if diagnostics cannot disambiguate them.",
          "skills": [
            "Static analysis",
            "Scopes"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "4e9b944e-acd0-406f-a6f4-e5dbf8306ef7",
          "key": "CPARSE-107",
          "title": "Preserve configuration comments through syntax-tree editing",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "parsing",
          "dependsOn": [
            "CPARSE-105",
            "CPARSE-106"
          ],
          "scenario": "A key-renaming tool deletes nearby comments because the parser discards trivia. Retain comment attachment with explicit rules.",
          "acceptanceCriteria": [
            "Unchanged comments survive print",
            "Ambiguous attachment is documented",
            "Malformed comments retain source spans"
          ],
          "implementationNotes": [
            "This ticket covers one rename transform only."
          ],
          "verification": [
            "Rename commented key",
            "Rename near malformed trailing comment"
          ],
          "deliverables": [
            "Trivia representation and rename round-trip"
          ],
          "rollout": "Disable rename when comment attachment is uncertain.",
          "skills": [
            "Syntax trees",
            "Tooling"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 80
            },
            {
              "field": "Developer tooling",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "ed13ee42-405a-4b8b-ba34-bde6581547e6",
          "key": "CPARSE-108",
          "title": "Print configuration trees with stable parse equivalence",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "tooling",
          "dependsOn": [
            "CPARSE-103",
            "CPARSE-107"
          ],
          "scenario": "Formatting can change string values and list meaning. Add a deterministic printer for the supported syntax.",
          "acceptanceCriteria": [
            "Parse-print-parse preserves semantic tree",
            "Formatting is idempotent",
            "Unsupported nodes fail explicitly"
          ],
          "implementationNotes": [
            "Do not claim preservation of arbitrary source formatting."
          ],
          "verification": [
            "Round-trip all grammar fixtures",
            "Reject unsupported synthetic node"
          ],
          "deliverables": [
            "Printer and equivalence cases"
          ],
          "rollout": "Keep original source when printer cannot represent the tree.",
          "skills": [
            "Pretty printing",
            "Testing"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 70
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "3a9277ed-ef73-4b94-93aa-ed8dcf0c2c96",
          "key": "CPARSE-109",
          "title": "Bound configuration diagnostic counts for hostile input",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "tooling",
          "dependsOn": [
            "CPARSE-105",
            "CPARSE-108"
          ],
          "scenario": "A large malformed file emits thousands of repeated messages and stalls the editor. Cap diagnostics and include truncation status.",
          "acceptanceCriteria": [
            "Count is bounded",
            "Earliest useful errors remain",
            "Suppressed count is disclosed"
          ],
          "implementationNotes": [
            "Parsing must still terminate within documented input limits."
          ],
          "verification": [
            "Parse ordinary invalid file",
            "Use dense malformed fixture"
          ],
          "deliverables": [
            "Diagnostic budget and stress fixture"
          ],
          "rollout": "Stop parsing at budget exhaustion if recovery remains costly.",
          "skills": [
            "Resource limits",
            "Diagnostics"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 60
            },
            {
              "field": "Performance engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "32d12811-9e4e-40a9-87c0-74a91d055492",
          "key": "CPARSE-110",
          "title": "Publish a configuration parser compatibility corpus",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "tooling",
          "dependsOn": [
            "CPARSE-108",
            "CPARSE-109"
          ],
          "scenario": "Downstream tools cannot tell whether parser changes altered accepted syntax. Add a versioned local corpus and expected public diagnostics.",
          "acceptanceCriteria": [
            "Corpus covers grammar productions",
            "Invalid cases specify diagnostic categories",
            "No hidden evaluator answers are included"
          ],
          "implementationNotes": [
            "These are public engineering regressions, not grading material."
          ],
          "verification": [
            "Run corpus on current parser",
            "Introduce a deliberate local grammar regression and observe failure"
          ],
          "deliverables": [
            "Corpus manifest and execution record"
          ],
          "rollout": "Revert syntax changes that break declared compatibility unintentionally.",
          "skills": [
            "Compatibility",
            "Regression testing"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 60
            },
            {
              "field": "Quality engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
