{
  "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": "fb8c96f4-a9ca-40d7-889b-29060ac89f1e",
      "key": "CTIER",
      "title": "A local archive cache with explicit integrity and capacity",
      "field": "Storage systems",
      "summary": "Coordinate immutable blob caching, eviction and repair across local storage tiers.",
      "context": "Fictional media archive Ash serves generated byte fixtures through a fast local cache and slower provider stub. Both tiers run locally.",
      "stack": [
        "TypeScript",
        "Filesystem adapter",
        "Vitest"
      ],
      "prerequisites": [
        "Create immutable generated blobs with known digests.",
        "Implement controllable cache and origin adapters with read failures."
      ],
      "developerValue": "Practice cache correctness, request coalescing and capacity control.",
      "companyValue": "Inspect whether faster delivery preserves bytes and operating limits.",
      "delivery": "Use dedicated fixture directories and publish measured local observations only.",
      "phases": [
        {
          "id": "reads",
          "title": "Define cache reads",
          "goal": "Keep source authority explicit."
        },
        {
          "id": "capacity",
          "title": "Control cache mutation",
          "goal": "Handle contention and eviction."
        },
        {
          "id": "repair",
          "title": "Repair and observe",
          "goal": "Recover damage without hiding uncertainty."
        }
      ],
      "tickets": [
        {
          "id": "484f9fd8-c8ce-4862-a4f6-654065584e87",
          "key": "CTIER-101",
          "title": "Keep archive cache misses distinct from provider failures",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "reads",
          "dependsOn": [],
          "scenario": "Any cache read error is treated as a miss and hides damaged storage. Define typed outcomes.",
          "acceptanceCriteria": [
            "Missing key is a miss",
            "Permission failure is operational error",
            "Origin reads follow documented fallback policy"
          ],
          "implementationNotes": [
            "Do not swallow arbitrary filesystem exceptions."
          ],
          "verification": [
            "Read absent fixture",
            "Inject permission failure"
          ],
          "deliverables": [
            "Cache result contract"
          ],
          "rollout": "Bypass cache on operational failure while reporting it.",
          "skills": [
            "Error modeling",
            "Storage"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "822b4021-ffc3-4c28-90db-4ad05d21248b",
          "key": "CTIER-102",
          "title": "Key archive cache entries by immutable blob identity",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "reads",
          "dependsOn": [
            "CTIER-101"
          ],
          "scenario": "A mutable filename reuses stale cached bytes after replacement. Bind entries to immutable version or digest.",
          "acceptanceCriteria": [
            "Same identity reuses entry",
            "New version uses new key",
            "User labels do not affect identity"
          ],
          "implementationNotes": [
            "Tenant scope remains part of lookup authority."
          ],
          "verification": [
            "Read repeated identity",
            "Replace logical filename with new version"
          ],
          "deliverables": [
            "Cache-key contract and cases"
          ],
          "rollout": "Disable cache reuse if identity is uncertain.",
          "skills": [
            "Caching",
            "Identity"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 70
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "6a40ef22-f586-4bb4-a1e0-160fd48e1ae1",
          "key": "CTIER-103",
          "title": "Verify archive cache fills before promoting temporary bytes",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "reads",
          "dependsOn": [
            "CTIER-102"
          ],
          "scenario": "Interrupted origin reads leave files that future requests treat as complete. Stage and verify each fill.",
          "acceptanceCriteria": [
            "Fill checks declared digest",
            "Unverified files stay invisible",
            "Failed fill removes or quarantines its temporary file"
          ],
          "implementationNotes": [
            "Promotion must not expose partial bytes."
          ],
          "verification": [
            "Fill valid fixture",
            "Truncate origin stream"
          ],
          "deliverables": [
            "Verified fill and failure cases"
          ],
          "rollout": "Disable cache writes while serving origin directly.",
          "skills": [
            "Integrity",
            "Atomic publication"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "acc82c94-ef80-4d65-882d-39cb3e4ed5c2",
          "key": "CTIER-104",
          "title": "Coalesce concurrent archive cache fills for one blob",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "capacity",
          "dependsOn": [
            "CTIER-103"
          ],
          "scenario": "Ten simultaneous misses download the same object ten times. Share one fill without joining unrelated keys.",
          "acceptanceCriteria": [
            "Same identity shares fill",
            "Different identities remain independent",
            "Failure releases waiters consistently"
          ],
          "implementationNotes": [
            "Bound the in-flight map and clear settled entries."
          ],
          "verification": [
            "Issue concurrent same-key reads",
            "Fail shared fill then retry"
          ],
          "deliverables": [
            "Fill coordinator and concurrency cases"
          ],
          "rollout": "Disable coalescing if waiters cannot be released.",
          "skills": [
            "Concurrency",
            "Resource management"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "25f7a74e-d927-467f-8730-c280a02c2d5e",
          "key": "CTIER-105",
          "title": "Enforce archive cache capacity before admitting a fill",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "capacity",
          "dependsOn": [
            "CTIER-103",
            "CTIER-104"
          ],
          "scenario": "Parallel fills exceed the configured cache budget because each sees free space. Reserve capacity atomically.",
          "acceptanceCriteria": [
            "Active reservations count toward limit",
            "Failed fills release reservation",
            "Oversized objects bypass with explanation"
          ],
          "implementationNotes": [
            "Include temporary bytes in capacity accounting."
          ],
          "verification": [
            "Admit fitting concurrent fills",
            "Attempt object larger than budget"
          ],
          "deliverables": [
            "Admission reservations and cases"
          ],
          "rollout": "Stop cache admission until accounting reconciles.",
          "skills": [
            "Capacity planning",
            "Concurrency"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 50
            },
            {
              "field": "Performance engineering",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "080a4a24-fbf9-4d93-99fc-92f0f01dd73b",
          "key": "CTIER-106",
          "title": "Avoid evicting archive blobs while active readers hold them",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "capacity",
          "dependsOn": [
            "CTIER-105"
          ],
          "scenario": "Eviction deletes a file while a streaming reader still needs it. Define reader leases and reclamation behavior.",
          "acceptanceCriteria": [
            "Active readers finish or fail explicitly by contract",
            "New reads cannot acquire deleting entry",
            "Released leases permit eviction"
          ],
          "implementationNotes": [
            "Specify platform filesystem assumptions."
          ],
          "verification": [
            "Evict idle fixture",
            "Race eviction with active reader"
          ],
          "deliverables": [
            "Reader-lease protocol and race tests"
          ],
          "rollout": "Pause eviction if active-reader safety is uncertain.",
          "skills": [
            "Concurrency",
            "Filesystem"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 80
            },
            {
              "field": "Backend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "6b4973e2-fca0-4e37-99b0-9ed0855cd8cd",
          "key": "CTIER-107",
          "title": "Record archive cache recency without writing on every byte read",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "capacity",
          "dependsOn": [
            "CTIER-104",
            "CTIER-106"
          ],
          "scenario": "Streaming a large blob rewrites recency metadata for every chunk. Update recency at a bounded operation boundary.",
          "acceptanceCriteria": [
            "One read causes bounded metadata writes",
            "Eviction order remains documented",
            "Failed read policy is explicit"
          ],
          "implementationNotes": [
            "Use injected clocks for recency tests."
          ],
          "verification": [
            "Stream many chunks",
            "Fail midway and inspect recency"
          ],
          "deliverables": [
            "Recency policy and write-count checks"
          ],
          "rollout": "Use insertion order temporarily if recency updates regress.",
          "skills": [
            "Performance",
            "Metadata"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 60
            },
            {
              "field": "Storage systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "cfce3723-5de7-4def-837a-a6301c3e591c",
          "key": "CTIER-108",
          "title": "Detect corrupted archive cache entries before serving them again",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "repair",
          "dependsOn": [
            "CTIER-103",
            "CTIER-106"
          ],
          "scenario": "A local byte flip persists across reads. Add a bounded verification policy and quarantine path.",
          "acceptanceCriteria": [
            "Verification detects mismatch",
            "Corrupt entry is not reused",
            "Origin repair creates a new verified entry"
          ],
          "implementationNotes": [
            "State whether verification occurs per read or scheduled scan."
          ],
          "verification": [
            "Corrupt fixture then read",
            "Fail origin repair"
          ],
          "deliverables": [
            "Integrity policy and repair cases"
          ],
          "rollout": "Bypass cache for quarantined identities.",
          "skills": [
            "Hashing",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 80
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "4c67aabb-c755-4c7e-a7d3-77163b88d9b2",
          "key": "CTIER-109",
          "title": "Reconcile archive cache metadata after process restart",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "repair",
          "dependsOn": [
            "CTIER-105",
            "CTIER-108"
          ],
          "scenario": "A restart leaves reservations and temporary files consuming phantom capacity. Rebuild accounting from valid state.",
          "acceptanceCriteria": [
            "Abandoned reservations release",
            "Verified entries remain counted",
            "Unknown files are quarantined rather than silently trusted"
          ],
          "implementationNotes": [
            "Cleanup only within the configured fixture root."
          ],
          "verification": [
            "Restart after successful fill",
            "Crash with partial temporary file"
          ],
          "deliverables": [
            "Startup reconciliation and cases"
          ],
          "rollout": "Start cache read-only until reconciliation completes.",
          "skills": [
            "Crash recovery",
            "Accounting"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 80
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "bbaa1295-64fb-4db8-b442-ab9ee9a47c57",
          "key": "CTIER-110",
          "title": "Report archive cache hit rates with a defined denominator",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "repair",
          "dependsOn": [
            "CTIER-107",
            "CTIER-109"
          ],
          "scenario": "Dashboard hit rate counts every chunk and exaggerates cache usefulness. Count logical read outcomes explicitly.",
          "acceptanceCriteria": [
            "Denominator is logical read attempts",
            "Bypass and errors are separate",
            "No blob content enters events"
          ],
          "implementationNotes": [
            "Report local measurements without generalized performance claims."
          ],
          "verification": [
            "Read hit miss and bypass fixtures",
            "Retry failed read and inspect counts"
          ],
          "deliverables": [
            "Metrics contract and captured examples"
          ],
          "rollout": "Hide hit-rate panel if event accounting changes.",
          "skills": [
            "Observability",
            "Measurement"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 50
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
