{
  "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": "a5d33835-0e83-4a2f-a546-eb3d2bc0a23e",
      "key": "CBUILD",
      "title": "An incremental build graph with correct invalidation",
      "field": "Compiler and language tooling",
      "summary": "Track local source dependencies and reuse outputs only when inputs match.",
      "context": "Fictional static documentation compiler Rowan transforms synthetic text modules through a deterministic local adapter. It never executes candidate source as code.",
      "stack": [
        "TypeScript",
        "Filesystem adapter",
        "Vitest"
      ],
      "prerequisites": [
        "Create a synthetic module graph and deterministic transform stub.",
        "Provide file-change, missing-input and interrupted-output fixtures."
      ],
      "developerValue": "Practice dependency graphs and cache correctness.",
      "companyValue": "Inspect whether build speed improvements preserve output correctness.",
      "delivery": "Measure local fixture behavior; broad compiler-performance claims are excluded.",
      "phases": [
        {
          "id": "graph",
          "title": "Establish dependency identity",
          "goal": "Parse and validate local graph edges."
        },
        {
          "id": "reuse",
          "title": "Invalidate and rebuild",
          "goal": "Reuse only compatible outputs."
        },
        {
          "id": "recovery",
          "title": "Recover interrupted builds",
          "goal": "Publish outputs and explain cache decisions."
        }
      ],
      "tickets": [
        {
          "id": "fc33c331-e03a-4e26-a4af-7cf6ec877175",
          "key": "CBUILD-101",
          "title": "Normalize local build paths without merging distinct modules",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "graph",
          "dependsOn": [],
          "scenario": "Relative spellings create duplicate graph nodes. Define canonical module identity under an explicit workspace root.",
          "acceptanceCriteria": [
            "Equivalent local paths share identity",
            "Escaping paths are rejected",
            "Case behavior is documented per adapter"
          ],
          "implementationNotes": [
            "Do not silently assume case-insensitive filesystems."
          ],
          "verification": [
            "Resolve relative alias",
            "Reject path escaping fixture root"
          ],
          "deliverables": [
            "Module identity resolver"
          ],
          "rollout": "Disable reuse for ambiguous path identities.",
          "skills": [
            "Filesystem",
            "Identity"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 30
            },
            {
              "field": "Security",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "651da7ba-a5f8-4792-88a3-01e79fb36470",
          "key": "CBUILD-102",
          "title": "Report missing static-build imports at their source location",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "graph",
          "dependsOn": [
            "CBUILD-101"
          ],
          "scenario": "A missing import yields an internal file error. Map resolution failure to the importing source span.",
          "acceptanceCriteria": [
            "Missing path identifies importer",
            "Valid imports resolve",
            "Error omits unrelated absolute paths"
          ],
          "implementationNotes": [
            "Use synthetic source content only."
          ],
          "verification": [
            "Resolve present import",
            "Reference absent module"
          ],
          "deliverables": [
            "Import diagnostic and cases"
          ],
          "rollout": "Stop affected module build while preserving other diagnostics.",
          "skills": [
            "Resolution",
            "Diagnostics"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 70
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "c1f439a3-1456-42f5-8902-e7111e62c3c9",
          "key": "CBUILD-103",
          "title": "Detect static-build dependency cycles with a readable path",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "graph",
          "dependsOn": [
            "CBUILD-101",
            "CBUILD-102"
          ],
          "scenario": "Recursive imports hang graph traversal. Detect cycles and return the concrete edge path.",
          "acceptanceCriteria": [
            "Acyclic graph builds",
            "Cycle includes involved modules",
            "Repeated traversal terminates"
          ],
          "implementationNotes": [
            "Bound reported cycle length for large inputs."
          ],
          "verification": [
            "Traverse diamond graph",
            "Introduce three-node cycle"
          ],
          "deliverables": [
            "Cycle detector and fixtures"
          ],
          "rollout": "Refuse cyclic graph outputs until cycle policy is defined.",
          "skills": [
            "Graphs",
            "Algorithms"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 60
            },
            {
              "field": "Developer tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "c3ab5090-6af5-4bbf-8d34-9cbb72fc9d7b",
          "key": "CBUILD-104",
          "title": "Include transform configuration in static-build cache identity",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "reuse",
          "dependsOn": [
            "CBUILD-103"
          ],
          "scenario": "Changing compiler options reuses output produced under older options. Hash normalized inputs and configuration.",
          "acceptanceCriteria": [
            "Same inputs reuse output",
            "Changed options invalidate",
            "Transform version participates in key"
          ],
          "implementationNotes": [
            "Hash canonical configuration, not property insertion order."
          ],
          "verification": [
            "Reorder equivalent config keys",
            "Change output-affecting option"
          ],
          "deliverables": [
            "Cache-key contract and cases"
          ],
          "rollout": "Disable cache reuse after unknown configuration changes.",
          "skills": [
            "Caching",
            "Canonicalization"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 30
            },
            {
              "field": "Performance engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "02045752-f08d-46d8-a8ea-b8583457afcc",
          "key": "CBUILD-105",
          "title": "Invalidate transitive static-build dependents after source changes",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "reuse",
          "dependsOn": [
            "CBUILD-103",
            "CBUILD-104"
          ],
          "scenario": "Updating a shared module rebuilds it but leaves dependent pages stale. Traverse reverse dependency edges.",
          "acceptanceCriteria": [
            "Direct and transitive dependents rebuild",
            "Unrelated modules remain reusable",
            "Removed edges stop unnecessary invalidation"
          ],
          "implementationNotes": [
            "Use previous and current graph where edge removal matters."
          ],
          "verification": [
            "Change shared leaf",
            "Remove dependency then change old leaf"
          ],
          "deliverables": [
            "Invalidation planner and graph cases"
          ],
          "rollout": "Rebuild all fixture modules if invalidation is uncertain.",
          "skills": [
            "Dependency graphs",
            "Incremental builds"
          ],
          "fieldMix": [
            {
              "field": "Compiler and language tooling",
              "percentage": 50
            },
            {
              "field": "Developer tooling",
              "percentage": 30
            },
            {
              "field": "Performance engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "50dfed43-1ba2-4968-a1a9-284176fefbd6",
          "key": "CBUILD-106",
          "title": "Track failed static-build nodes without caching broken outputs",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "reuse",
          "dependsOn": [
            "CBUILD-104",
            "CBUILD-105"
          ],
          "scenario": "A failed transform writes a cache entry that future builds treat as success. Separate failure from reusable output.",
          "acceptanceCriteria": [
            "Only successful validated output caches",
            "Failure retains diagnostics",
            "Next build retries affected node"
          ],
          "implementationNotes": [
            "Never replace last good output with partial bytes silently."
          ],
          "verification": [
            "Build successful node",
            "Fail transform after partial output"
          ],
          "deliverables": [
            "Build result states and failure cases"
          ],
          "rollout": "Clear only affected invalid cache entries and retry.",
          "skills": [
            "Error handling",
            "Build systems"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 60
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "1d7717fa-7032-4b19-88e6-d899fcd86cf4",
          "key": "CBUILD-107",
          "title": "Make incremental static builds deterministic across worker order",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "reuse",
          "dependsOn": [
            "CBUILD-105",
            "CBUILD-106"
          ],
          "scenario": "Parallel transform completion changes manifest ordering and output hashes. Separate execution scheduling from canonical publication.",
          "acceptanceCriteria": [
            "Equivalent graphs yield identical manifests",
            "Dependencies complete before consumers",
            "Failed nodes cannot publish"
          ],
          "implementationNotes": [
            "Use controllable local transform promises."
          ],
          "verification": [
            "Resolve independent workers in opposite order",
            "Fail one dependency"
          ],
          "deliverables": [
            "Deterministic scheduler and order cases"
          ],
          "rollout": "Use serial execution while ordering invariants are repaired.",
          "skills": [
            "Determinism",
            "Scheduling"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "028709ba-9a8b-44db-bc85-2f0e4a109526",
          "key": "CBUILD-108",
          "title": "Publish a static-build output generation only after all required nodes pass",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "recovery",
          "dependsOn": [
            "CBUILD-106",
            "CBUILD-107"
          ],
          "scenario": "Readers see mixed old and new files during a build. Write a staging generation and switch a manifest pointer.",
          "acceptanceCriteria": [
            "Failed builds keep previous generation",
            "Successful generation is complete",
            "Switch recovery selects one valid manifest"
          ],
          "implementationNotes": [
            "Keep prior generation until activation is durable."
          ],
          "verification": [
            "Publish successful fixture",
            "Crash before manifest switch"
          ],
          "deliverables": [
            "Generation publisher and recovery cases"
          ],
          "rollout": "Restore prior manifest on failed post-switch checks.",
          "skills": [
            "Atomic publication",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "083c5c00-c021-4e97-8d3f-06517f405942",
          "key": "CBUILD-109",
          "title": "Coalesce repeated static-build file events without missing deletion",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "recovery",
          "dependsOn": [
            "CBUILD-105",
            "CBUILD-108"
          ],
          "scenario": "Editors emit many change events and a final delete can be swallowed by debounce. Track final invalidation intent per module.",
          "acceptanceCriteria": [
            "Repeated updates coalesce",
            "Deletion remains authoritative",
            "Change during build schedules another pass"
          ],
          "implementationNotes": [
            "File events are hints; resolve actual state before building."
          ],
          "verification": [
            "Burst-save one file",
            "Delete during active build"
          ],
          "deliverables": [
            "Event coordinator and race cases"
          ],
          "rollout": "Use explicit rebuild requests if watcher semantics are unreliable.",
          "skills": [
            "File watching",
            "Concurrency"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 60
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "30a3d3b4-3ee5-4a12-88f7-0b88c0792e58",
          "key": "CBUILD-110",
          "title": "Explain why each static-build module was reused or rebuilt",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "recovery",
          "dependsOn": [
            "CBUILD-104",
            "CBUILD-109"
          ],
          "scenario": "Developers cannot distinguish cache misses from invalidation bugs. Emit structured decision reasons without source text.",
          "acceptanceCriteria": [
            "Reasons identify changed input category",
            "Reuse points to compatible key",
            "Diagnostics omit source contents"
          ],
          "implementationNotes": [
            "Local timing observations must state fixture and environment."
          ],
          "verification": [
            "Inspect unchanged build",
            "Change transform version and inspect reasons"
          ],
          "deliverables": [
            "Build decision report"
          ],
          "rollout": "Disable report fields that expose source content.",
          "skills": [
            "Observability",
            "Developer experience"
          ],
          "fieldMix": [
            {
              "field": "Developer tooling",
              "percentage": 80
            },
            {
              "field": "Compiler and language tooling",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
