{
  "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": "643e4728-d41f-4522-88a6-dde5400d0894",
      "key": "CBACK",
      "title": "Verifiable archive backup and restore",
      "field": "Storage systems",
      "summary": "Build manifest-based local backup, validation and staged restoration.",
      "context": "Fictional archive Alder backs up synthetic document metadata and generated blobs into a dedicated local directory. No real organizational data or cloud accounts are required.",
      "stack": [
        "TypeScript",
        "SQLite",
        "Filesystem adapter",
        "Vitest"
      ],
      "prerequisites": [
        "Create synthetic metadata and generated blob fixtures.",
        "Provide isolated source backup and restore directories."
      ],
      "developerValue": "Practice consistent snapshots and recoverable restoration.",
      "companyValue": "Inspect whether backup success can be substantiated by a usable restore.",
      "delivery": "Record local restore evidence; production disaster-recovery qualification remains separate.",
      "phases": [
        {
          "id": "manifest",
          "title": "Describe backup content",
          "goal": "Define scope and integrity."
        },
        {
          "id": "capture",
          "title": "Capture coherently",
          "goal": "Handle interruption and version boundaries."
        },
        {
          "id": "restore",
          "title": "Restore into isolation",
          "goal": "Validate before switching authority."
        }
      ],
      "tickets": [
        {
          "id": "4a9be09c-a900-42a0-babf-e7a2c2afa5a7",
          "key": "CBACK-101",
          "title": "Define archive backup manifests with explicit format versions",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "manifest",
          "dependsOn": [],
          "scenario": "Backup folders contain unnamed files with no declared schema. Add a bounded manifest describing required objects.",
          "acceptanceCriteria": [
            "Manifest declares version",
            "Entries have size and digest",
            "Duplicate logical paths fail validation"
          ],
          "implementationNotes": [
            "Treat manifest text as untrusted input."
          ],
          "verification": [
            "Parse valid fixture",
            "Reject duplicate and future-version entries"
          ],
          "deliverables": [
            "Manifest schema and parser"
          ],
          "rollout": "Keep unknown backup versions read-only.",
          "skills": [
            "Serialization",
            "Validation"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 80
            },
            {
              "field": "Data engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "b8a05152-889a-405a-aa00-81b358ced380",
          "key": "CBACK-102",
          "title": "Exclude temporary archive uploads from backup inventories",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "manifest",
          "dependsOn": [
            "CBACK-101"
          ],
          "scenario": "A backup includes partial uploads and later calls them missing documents. Inventory only committed archive references.",
          "acceptanceCriteria": [
            "Committed blobs are listed",
            "Temporary uploads are excluded",
            "Excluded counts are reported separately"
          ],
          "implementationNotes": [
            "Inventory must derive from authoritative metadata state."
          ],
          "verification": [
            "Inventory committed fixture",
            "Add incomplete upload"
          ],
          "deliverables": [
            "Backup inventory projection"
          ],
          "rollout": "Pause backup capture if committed scope is uncertain.",
          "skills": [
            "Data modeling",
            "Storage"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 60
            },
            {
              "field": "Database engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "c7409114-ef65-4ed5-8b57-e5999bd724fe",
          "key": "CBACK-103",
          "title": "Verify archive backup bytes against manifest digests",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "manifest",
          "dependsOn": [
            "CBACK-101",
            "CBACK-102"
          ],
          "scenario": "Copy completion alone marks backup success. Stream verification of every required object before success.",
          "acceptanceCriteria": [
            "Digest and size both match",
            "Missing object fails verification",
            "Failure identifies logical object safely"
          ],
          "implementationNotes": [
            "Do not buffer entire backups in memory."
          ],
          "verification": [
            "Verify generated fixture",
            "Flip one copied byte"
          ],
          "deliverables": [
            "Streaming verifier and corruption cases"
          ],
          "rollout": "Mark affected backups unusable until reverified.",
          "skills": [
            "Hashing",
            "Streaming"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "56d3d468-c133-4d1b-82bf-8a70a06a4dc5",
          "key": "CBACK-104",
          "title": "Capture archive metadata and blob references at one snapshot boundary",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "capture",
          "dependsOn": [
            "CBACK-102",
            "CBACK-103"
          ],
          "scenario": "A document changes while backup runs and the manifest references an uncopied blob. Define one consistent capture boundary.",
          "acceptanceCriteria": [
            "Manifest reflects one metadata snapshot",
            "Required blobs remain pinned during capture",
            "Concurrent new versions belong to later backups"
          ],
          "implementationNotes": [
            "Specify adapter transaction and pin lifetime."
          ],
          "verification": [
            "Update after snapshot",
            "Delete reference during capture"
          ],
          "deliverables": [
            "Snapshot protocol and race cases"
          ],
          "rollout": "Pause pruning until capture pins are reliable.",
          "skills": [
            "Consistency",
            "Transactions"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 50
            },
            {
              "field": "Database engineering",
              "percentage": 30
            },
            {
              "field": "Distributed systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "e9339028-0541-478e-a477-54faf776a353",
          "key": "CBACK-105",
          "title": "Resume archive backup copying without accepting stale partial files",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "capture",
          "dependsOn": [
            "CBACK-103",
            "CBACK-104"
          ],
          "scenario": "Restarted backup trusts an existing filename although the earlier copy was interrupted. Revalidate reusable files.",
          "acceptanceCriteria": [
            "Matching verified files may be reused",
            "Partial files are recopied",
            "Resume retains original snapshot identity"
          ],
          "implementationNotes": [
            "Reuse decisions require digest agreement."
          ],
          "verification": [
            "Resume with valid copied file",
            "Resume with truncated file"
          ],
          "deliverables": [
            "Copy-resume coordinator and cases"
          ],
          "rollout": "Start a new isolated backup if snapshot identity is lost.",
          "skills": [
            "Recovery",
            "Integrity"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 70
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "e01fc9ca-4643-4971-80cd-4b038d9d5b6c",
          "key": "CBACK-106",
          "title": "Finalize archive backups with an explicit complete marker",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "capture",
          "dependsOn": [
            "CBACK-103",
            "CBACK-105"
          ],
          "scenario": "Operators select directories still being copied. Publish a durable completion marker only after required verification.",
          "acceptanceCriteria": [
            "Incomplete directories are not selectable",
            "Marker binds manifest digest",
            "Failure cannot leave valid-looking completion"
          ],
          "implementationNotes": [
            "Marker creation follows verification acknowledgement."
          ],
          "verification": [
            "Finish valid backup",
            "Crash before marker creation"
          ],
          "deliverables": [
            "Finalization protocol and tests"
          ],
          "rollout": "Withdraw completion marker if later validation fails.",
          "skills": [
            "Atomic publication",
            "Durability"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 80
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "db04f45e-a8b4-4b97-aea6-cb225bc1683c",
          "key": "CBACK-107",
          "title": "Refuse archive restore paths outside the selected target directory",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 150,
          "phaseId": "capture",
          "dependsOn": [
            "CBACK-101",
            "CBACK-106"
          ],
          "scenario": "A crafted backup path can escape the restore root. Validate resolved destinations before creating files.",
          "acceptanceCriteria": [
            "Traversal and absolute paths fail",
            "Symlink escape is rejected by adapter policy",
            "Valid files remain inside target"
          ],
          "implementationNotes": [
            "Use a dedicated empty fixture directory."
          ],
          "verification": [
            "Restore valid nested object",
            "Attempt parent traversal or symlink escape"
          ],
          "deliverables": [
            "Restore-path boundary and cases"
          ],
          "rollout": "Abort restore before writes if containment cannot be established.",
          "skills": [
            "Filesystem",
            "Security"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 60
            },
            {
              "field": "Storage systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "a7cca6f0-fe05-4949-9ced-3425f418493d",
          "key": "CBACK-108",
          "title": "Restore archive backups into an isolated staging generation",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "restore",
          "dependsOn": [
            "CBACK-106",
            "CBACK-107"
          ],
          "scenario": "Direct restoration overwrites the active archive before integrity checks finish. Build and validate a separate generation.",
          "acceptanceCriteria": [
            "Active data remains untouched",
            "Staging contains all required records",
            "Failed validation leaves active generation selected"
          ],
          "implementationNotes": [
            "No recursive operations on unspecified user directories."
          ],
          "verification": [
            "Restore valid fixture",
            "Fail halfway through copying"
          ],
          "deliverables": [
            "Staged restore and isolation checks"
          ],
          "rollout": "Discard only the verified staging directory on failure.",
          "skills": [
            "Recovery",
            "Isolation"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "08d2d30b-586d-44fb-b14a-1615075049be",
          "key": "CBACK-109",
          "title": "Switch restored archive authority with a rollback pointer",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "restore",
          "dependsOn": [
            "CBACK-108"
          ],
          "scenario": "A successful staging restore still needs a safe handoff. Activate one generation while retaining the previous pointer.",
          "acceptanceCriteria": [
            "Switch selects one validated generation",
            "Interrupted activation recovers deterministically",
            "Rollback selects prior intact generation"
          ],
          "implementationNotes": [
            "Document concurrent-reader behavior at the switch."
          ],
          "verification": [
            "Activate restored fixture",
            "Crash during pointer update"
          ],
          "deliverables": [
            "Activation record and recovery tests"
          ],
          "rollout": "Restore previous validated pointer if post-switch checks fail.",
          "skills": [
            "Atomicity",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Storage systems",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "01cd4850-6f30-46eb-ab01-bb3ec6c0cf0e",
          "key": "CBACK-110",
          "title": "Prove one archive restore through observable consistency checks",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "restore",
          "dependsOn": [
            "CBACK-109"
          ],
          "scenario": "A backup report says Success without reading restored documents. Add a repeatable restore exercise and recorded checks.",
          "acceptanceCriteria": [
            "Restored references resolve",
            "Document counts match manifest scope",
            "Excluded temporary data stays excluded"
          ],
          "implementationNotes": [
            "Report local fixture results and unresolved assumptions."
          ],
          "verification": [
            "Read every small fixture object",
            "Remove one restored blob and detect failure"
          ],
          "deliverables": [
            "Restore exercise and result record"
          ],
          "rollout": "Reclassify the backup as unverified if checks fail.",
          "skills": [
            "Verification",
            "Operations"
          ],
          "fieldMix": [
            {
              "field": "Quality engineering",
              "percentage": 40
            },
            {
              "field": "Storage systems",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
