{
  "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": "09159d14-2fc2-426c-91cd-3728b0ebc2af",
      "key": "AARCHIVE",
      "title": "Design a searchable audit archive with retention boundaries",
      "field": "System design",
      "summary": "Choose storage, indexing and deletion semantics for a bounded audit archive.",
      "context": "A fictional procurement platform keeps append-only action records. Operators want fast recent search and affordable old records without losing provenance or leaking tenant data.",
      "stack": [
        "PostgreSQL",
        "Object storage",
        "TypeScript"
      ],
      "prerequisites": [
        "Create synthetic audit events and local storage/search adapters.",
        "Use an explicit fictional retention policy, not legal advice."
      ],
      "developerValue": "Practice storage tradeoffs, provenance and data-lifecycle decisions.",
      "companyValue": "Review archive cost and retrieval guarantees before committing to infrastructure.",
      "delivery": "Ten scoped tickets across three phases. Build a synthetic local service or select a ticket after recreating its prerequisites; estimates exclude setup.",
      "phases": [
        {
          "id": "needs",
          "title": "Define archive guarantees",
          "goal": "Specify access, retention and search expectations."
        },
        {
          "id": "contract",
          "title": "Model archive boundaries",
          "goal": "Make manifests, indexing and retrieval verifiable."
        },
        {
          "id": "lifecycle",
          "title": "Challenge long-term behavior",
          "goal": "Rehearse retention, restoration and cost changes."
        }
      ],
      "tickets": [
        {
          "id": "97196953-8185-4d77-8010-69f6a11aa840",
          "key": "AARCHIVE-101",
          "title": "Define which audit questions require indexed search versus archive retrieval",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "needs",
          "dependsOn": [],
          "scenario": "The design says all audit history must be instantly searchable, but reviewers usually inspect the last week and rarely retrieve older cases.",
          "acceptanceCriteria": [
            "List recent search and older retrieval use cases separately.",
            "State hypothetical latency and date-range targets.",
            "Identify fields that may be indexed without exposing payload contents."
          ],
          "implementationNotes": [
            "Use fabricated events and a named review workflow."
          ],
          "verification": [
            "Map a recent actor search to its target.",
            "Map an old case retrieval to the declared slower path without claiming instant search."
          ],
          "deliverables": [
            "Archive access-pattern inventory"
          ],
          "rollout": "Review the inventory before choosing storage; keep unapproved fields out of indexes.",
          "skills": [
            "Access-pattern analysis",
            "Requirements"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 60
            },
            {
              "field": "Storage systems",
              "percentage": 20
            },
            {
              "field": "Database engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "fa35ba05-5cb4-41b3-8d70-5cf944a18c18",
          "key": "AARCHIVE-102",
          "title": "Calculate archive storage growth from event size and retention assumptions",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "needs",
          "dependsOn": [
            "AARCHIVE-101"
          ],
          "scenario": "A budget proposal counts raw event bytes but omits index, replica and manifest overhead.",
          "acceptanceCriteria": [
            "Model events per day, average bytes and retention duration.",
            "Show raw, index and redundancy components separately.",
            "Label compression and growth factors as assumptions."
          ],
          "implementationNotes": [
            "Provide a small executable worksheet with no claimed measured savings."
          ],
          "verification": [
            "Calculate the baseline synthetic scenario.",
            "Double event volume and vary compression to show sensitivity."
          ],
          "deliverables": [
            "Storage-growth model"
          ],
          "rollout": "Use the model for a reviewed budget proposal; update it after real storage measurements.",
          "skills": [
            "Capacity modeling",
            "Cost reasoning"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 50
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Cloud infrastructure",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "ae94897e-1015-435b-89c6-973981d41f4f",
          "key": "AARCHIVE-103",
          "title": "Choose hot and cold archive boundaries with a reviewable decision record",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 120,
          "phaseId": "needs",
          "dependsOn": [
            "AARCHIVE-101",
            "AARCHIVE-102"
          ],
          "scenario": "The team proposes a new search cluster before checking whether bounded PostgreSQL search and object retrieval satisfy the workload.",
          "acceptanceCriteria": [
            "Compare existing database search with a separate index option.",
            "Include consistency, operational and restore costs.",
            "Choose the smallest option meeting the stated requirements."
          ],
          "implementationNotes": [
            "Do not provision speculative infrastructure for this design exercise."
          ],
          "verification": [
            "Evaluate both options against recent and old queries.",
            "Identify the threshold or query need that would reopen the decision."
          ],
          "deliverables": [
            "Archive storage decision record"
          ],
          "rollout": "Review the decision against the workload model before implementing new infrastructure.",
          "skills": [
            "Architecture decisions",
            "Tradeoff analysis"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 50
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "db9c63b5-57e8-4dbb-b889-7308fadd4dcb",
          "key": "AARCHIVE-104",
          "title": "Define an immutable archive segment manifest",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "contract",
          "dependsOn": [
            "AARCHIVE-103"
          ],
          "scenario": "An exported audit file has no trusted count or content identity, so operators cannot tell whether a partial upload is complete.",
          "acceptanceCriteria": [
            "Manifest binds segment ID, record count, range and byte hash.",
            "Publish a segment only after verifying its stored identity.",
            "Retain original event identifiers across archival."
          ],
          "implementationNotes": [
            "Use canonical synthetic serialization and exact object versions."
          ],
          "verification": [
            "Archive and verify a complete segment.",
            "Truncate bytes or alter count and reject publication."
          ],
          "deliverables": [
            "Segment contract and integrity probe"
          ],
          "rollout": "Prototype manifests alongside synthetic exports; keep unverified segments out of search.",
          "skills": [
            "Integrity",
            "Storage contracts"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 50
            },
            {
              "field": "System design",
              "percentage": 30
            },
            {
              "field": "Security",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "2f76ad51-190f-4ffb-980b-c3d3d7357ce2",
          "key": "AARCHIVE-105",
          "title": "Specify search indexing as a rebuildable projection of archived events",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "contract",
          "dependsOn": [
            "AARCHIVE-104"
          ],
          "scenario": "A search result is edited directly to correct an event, creating a version of history absent from the source archive.",
          "acceptanceCriteria": [
            "Treat the index as a projection with source segment identity.",
            "Corrections append new events rather than rewrite archived facts.",
            "Define checkpoint and duplicate-indexing semantics."
          ],
          "implementationNotes": [
            "Use an in-memory search adapter for the contract probe."
          ],
          "verification": [
            "Rebuild the index from named manifests and preserve event identities.",
            "Replay a segment and verify no duplicate search records."
          ],
          "deliverables": [
            "Index projection model and replay test"
          ],
          "rollout": "Build a shadow index generation; switch only after source-count reconciliation.",
          "skills": [
            "Projection design",
            "Append-only modeling"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 50
            },
            {
              "field": "Data engineering",
              "percentage": 30
            },
            {
              "field": "Database engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "029354cd-5126-43f7-9d74-939acc35ce20",
          "key": "AARCHIVE-106",
          "title": "Authorize archive retrieval before issuing object capabilities",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "contract",
          "dependsOn": [
            "AARCHIVE-104",
            "AARCHIVE-105"
          ],
          "scenario": "An audit search hit contains a raw object key; clients can request other tenants' segments by changing that key.",
          "acceptanceCriteria": [
            "Resolve event and segment within the caller's authorized tenant.",
            "Issue a capability scoped to the exact object version.",
            "Avoid exposing neighboring events through shared-segment retrieval."
          ],
          "implementationNotes": [
            "Choose per-tenant segments or a server-side filtered retrieval contract."
          ],
          "verification": [
            "Retrieve a permitted synthetic event through the chosen boundary.",
            "Alter tenant or segment identity and verify no capability is issued."
          ],
          "deliverables": [
            "Archive access contract and cross-tenant probe"
          ],
          "rollout": "Keep raw objects private; enable retrieval only after the projection isolation checks pass.",
          "skills": [
            "Authorization architecture",
            "Data isolation"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 50
            },
            {
              "field": "System design",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "01b13afd-0755-47f6-84f7-5370df891389",
          "key": "AARCHIVE-107",
          "title": "Define archive query pagination across hot and cold boundaries",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 180,
          "phaseId": "contract",
          "dependsOn": [
            "AARCHIVE-103",
            "AARCHIVE-105",
            "AARCHIVE-106"
          ],
          "scenario": "A query spanning the archive cutoff repeats recent events and misses records moved between stores during pagination.",
          "acceptanceCriteria": [
            "Bind the cursor to a declared snapshot or generation.",
            "Specify stable ordering and deduplication by event identity.",
            "Return explicit partial or unavailable states for missing segments."
          ],
          "implementationNotes": [
            "Model movement with local fixtures rather than live archive jobs."
          ],
          "verification": [
            "Page across a cutoff while a segment moves and retain complete ordering.",
            "Make one segment unavailable and report the gap without a complete-result claim."
          ],
          "deliverables": [
            "Cross-store query contract and boundary cases"
          ],
          "rollout": "Canary bounded date queries; fall back to separate hot/cold retrieval if completeness is uncertain.",
          "skills": [
            "Pagination",
            "Consistency"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 40
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "f28f8ae0-c60c-4aab-9d94-f3c652da964c",
          "key": "AARCHIVE-108",
          "title": "Model retention as a policy decision separate from audit immutability",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "lifecycle",
          "dependsOn": [
            "AARCHIVE-104",
            "AARCHIVE-106",
            "AARCHIVE-107"
          ],
          "scenario": "Stakeholders confuse append-only records with keeping every payload forever, while the archive has a fictional bounded retention agreement.",
          "acceptanceCriteria": [
            "Specify retention scope, expiry and hold behavior.",
            "Preserve authorized deletion facts without claiming deleted bytes remain available.",
            "Identify which policy decisions need external approval before implementation."
          ],
          "implementationNotes": [
            "Use a fictional policy and synthetic data; make no legal compliance claim."
          ],
          "verification": [
            "Apply expiry to an eligible segment in the model.",
            "Apply a hold and show that deletion remains blocked."
          ],
          "deliverables": [
            "Retention model and policy-state probe"
          ],
          "rollout": "Review policy before any delete implementation; keep proposed deletion plans read-only.",
          "skills": [
            "Data lifecycle",
            "Policy modeling"
          ],
          "fieldMix": [
            {
              "field": "Privacy engineering",
              "percentage": 50
            },
            {
              "field": "System design",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "01fccf7f-ffbf-4e30-81f0-b5a8a2a3a638",
          "key": "AARCHIVE-109",
          "title": "Rehearse archive restoration from manifests after index loss",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 240,
          "phaseId": "lifecycle",
          "dependsOn": [
            "AARCHIVE-104",
            "AARCHIVE-105",
            "AARCHIVE-108"
          ],
          "scenario": "The search projection is lost, but the recovery plan assumes an index backup rather than using the authoritative archive.",
          "acceptanceCriteria": [
            "Restore a new index generation from verified segments.",
            "Report corrupt or missing segments separately from indexed count.",
            "Keep queries from mixing partial and complete generations."
          ],
          "implementationNotes": [
            "Use a small synthetic archive with one intentionally damaged segment."
          ],
          "verification": [
            "Rebuild from complete manifests and compare query identities.",
            "Include the damaged segment and block a complete-generation claim."
          ],
          "deliverables": [
            "Restoration drill and completeness report"
          ],
          "rollout": "Run the drill before archive activation; retain the old searchable generation until reconciliation succeeds.",
          "skills": [
            "Recovery design",
            "Integrity verification"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 40
            },
            {
              "field": "System design",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "f25c2512-94f8-43b8-a337-1963aa1f5f3a",
          "key": "AARCHIVE-110",
          "title": "Prepare the archive architecture review with explicit retrieval limits",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "lifecycle",
          "dependsOn": [
            "AARCHIVE-102",
            "AARCHIVE-107",
            "AARCHIVE-109"
          ],
          "scenario": "A roadmap summary promises unlimited search and permanent audit availability despite the bounded design.",
          "acceptanceCriteria": [
            "Summarize workload, retention and recovery assumptions.",
            "Link claims to manifest, authorization and restore probes.",
            "List deferred infrastructure and unresolved provider capabilities."
          ],
          "implementationNotes": [
            "Avoid presenting the local simulator as production storage readiness."
          ],
          "verification": [
            "Trace a recent-query guarantee to its contract.",
            "Trace a missing-segment scenario and document the user-visible limitation."
          ],
          "deliverables": [
            "Archive design review packet"
          ],
          "rollout": "Review before storage commitment; revise the packet when retention or retrieval requirements change.",
          "skills": [
            "Architecture communication",
            "Evidence-based review"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 70
            },
            {
              "field": "Storage systems",
              "percentage": 30
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
