{
  "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": "3a4ae0f1-d121-40a3-a798-b0494e8508ed",
      "key": "CFORM",
      "title": "A procurement form that protects drafts",
      "field": "Frontend",
      "summary": "Repair conditional fields, draft recovery, and deliberate submission.",
      "context": "Fictional procurement team Northroom collects purchase requests in a browser form. Work uses local stubs and cannot place purchases.",
      "stack": [
        "React",
        "TypeScript",
        "CSS Modules",
        "Playwright"
      ],
      "prerequisites": [
        "Create synthetic categories and conditional request fields.",
        "Stub draft revisions and submission outcomes."
      ],
      "developerValue": "Practice state boundaries and form schema transitions.",
      "companyValue": "Inspect how hidden obsolete data and duplicate requests are prevented.",
      "delivery": "Submit each form behavior as a separate change.",
      "phases": [
        {
          "id": "fields",
          "title": "Clarify fields",
          "goal": "Specify amounts and conditional values."
        },
        {
          "id": "drafts",
          "title": "Protect progress",
          "goal": "Recover drafts and schema changes."
        },
        {
          "id": "submission",
          "title": "Submit deliberately",
          "goal": "Bind review to confirmed writes."
        }
      ],
      "tickets": [
        {
          "id": "21cb669c-863e-404c-8b10-ba9a698299fe",
          "key": "CFORM-101",
          "title": "Preserve procurement amount precision during editing",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "fields",
          "dependsOn": [],
          "scenario": "Entered 19.90 becomes 19.9 and later rounds. Separate edit text from validated minor units.",
          "acceptanceCriteria": [
            "Review uses currency precision",
            "Incomplete text stays editable",
            "Excess precision blocks submit"
          ],
          "implementationNotes": [
            "Parse decimals without binary float arithmetic."
          ],
          "verification": [
            "Review 19.90",
            "Enter excess decimal places"
          ],
          "deliverables": [
            "Amount parser and field cases"
          ],
          "rollout": "Revert formatting while retaining minor-unit storage.",
          "skills": [
            "Forms",
            "Decimal arithmetic"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "c0b75bf4-accf-4c60-a05e-cdb56435ca24",
          "key": "CFORM-102",
          "title": "Link procurement error summaries to affected fields",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "fields",
          "dependsOn": [],
          "scenario": "Required fields missing gives no location. Add field errors and a navigable summary.",
          "acceptanceCriteria": [
            "Summary links focus fields",
            "Labels expose required state",
            "Corrections clear only relevant errors"
          ],
          "implementationNotes": [
            "Use stable description IDs."
          ],
          "verification": [
            "Follow summary link",
            "Submit several missing values"
          ],
          "deliverables": [
            "Summary and keyboard checks"
          ],
          "rollout": "Retain field errors if summary navigation fails.",
          "skills": [
            "Accessibility",
            "Validation"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "77f35919-ae38-4f56-a86f-eaff1a3e1794",
          "key": "CFORM-103",
          "title": "Remove obsolete shipping fields on procurement category changes",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "fields",
          "dependsOn": [
            "CFORM-101"
          ],
          "scenario": "Switching hardware to services retains a hidden shipping address in the payload. Make conditional removal explicit.",
          "acceptanceCriteria": [
            "Payload excludes inactive fields",
            "Discard prompts identify entered data",
            "Cancel preserves category"
          ],
          "implementationNotes": [
            "Hidden inputs are not a serialization policy."
          ],
          "verification": [
            "Switch empty category",
            "Cancel populated category switch"
          ],
          "deliverables": [
            "Conditional payload projection"
          ],
          "rollout": "Disable category changes until removal is corrected.",
          "skills": [
            "Data modeling",
            "Forms"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 80
            },
            {
              "field": "Privacy engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "ab21e7f9-4989-41be-82dd-7117e3bec02e",
          "key": "CFORM-104",
          "title": "Allow earlier procurement corrections after final-step errors",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "drafts",
          "dependsOn": [
            "CFORM-102",
            "CFORM-103"
          ],
          "scenario": "A final-step error blocks users from returning to fix amounts. Separate navigation from submission validity.",
          "acceptanceCriteria": [
            "Back stays available",
            "Forward validates applicable step",
            "Submit validates full active payload"
          ],
          "implementationNotes": [
            "Share one validation contract."
          ],
          "verification": [
            "Correct earlier amount",
            "Fail final validation and go Back"
          ],
          "deliverables": [
            "Step validation coordinator"
          ],
          "rollout": "Fall back to a single-page form.",
          "skills": [
            "State machines",
            "Validation"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "b2c9bc24-61f3-4b47-be5c-23b700ab6e6e",
          "key": "CFORM-105",
          "title": "Show acknowledged and unsaved procurement draft states",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "drafts",
          "dependsOn": [
            "CFORM-104"
          ],
          "scenario": "Failed autosaves look saved. Track acknowledgements without interrupting editing.",
          "acceptanceCriteria": [
            "Saved means acknowledged revision",
            "Failure retains edits",
            "Late acknowledgement cannot mark newer edits saved"
          ],
          "implementationNotes": [
            "Debouncing cannot establish revision ownership."
          ],
          "verification": [
            "Save then edit",
            "Resolve saves out of order"
          ],
          "deliverables": [
            "Draft states and race tests"
          ],
          "rollout": "Disable autosave and expose explicit save.",
          "skills": [
            "Async state",
            "Persistence"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 70
            },
            {
              "field": "API design",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "a087b3c1-9b95-4714-8e03-3f905d880627",
          "key": "CFORM-106",
          "title": "Stop conflicting procurement saves from another tab",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "drafts",
          "dependsOn": [
            "CFORM-105"
          ],
          "scenario": "Two tabs silently overwrite a draft. Require expected revisions and preserve conflicting local work.",
          "acceptanceCriteria": [
            "Stale writes fail visibly",
            "Local edits remain recoverable",
            "Reconciliation is explicit"
          ],
          "implementationNotes": [
            "Browser warnings cannot replace revision checks."
          ],
          "verification": [
            "Save one tab",
            "Submit stale save in second"
          ],
          "deliverables": [
            "Multi-tab conflict flow"
          ],
          "rollout": "Pause writes on unresolved conflict.",
          "skills": [
            "Concurrency",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "API design",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "47a850ad-3b09-4b46-97cd-9d55d41ca2de",
          "key": "CFORM-107",
          "title": "Migrate one procurement draft schema transition",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "drafts",
          "dependsOn": [
            "CFORM-103",
            "CFORM-105"
          ],
          "scenario": "A category field changes shape while drafts remain open. Add one deterministic version migration.",
          "acceptanceCriteria": [
            "Old version migrates predictably",
            "Future versions stay read-only",
            "Dropped fields appear in review"
          ],
          "implementationNotes": [
            "Preserve original draft until acknowledgement."
          ],
          "verification": [
            "Migrate old fixture",
            "Open unsupported future version"
          ],
          "deliverables": [
            "Migration and preserved-original cases"
          ],
          "rollout": "Restore old reader using preserved drafts.",
          "skills": [
            "Schema evolution",
            "Compatibility"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "f57ad6ba-0a05-4ac5-a3d1-db332cade92c",
          "key": "CFORM-108",
          "title": "Bind procurement review to the exact submission snapshot",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "submission",
          "dependsOn": [
            "CFORM-104",
            "CFORM-107"
          ],
          "scenario": "Review recomputes defaults differently from submit. Create one validated snapshot for both.",
          "acceptanceCriteria": [
            "Review matches sent values",
            "Editing invalidates review",
            "Inactive fields are excluded"
          ],
          "implementationNotes": [
            "Confirmation identifies snapshot revision."
          ],
          "verification": [
            "Review and submit unchanged",
            "Edit amount after review"
          ],
          "deliverables": [
            "Snapshot projection and checks"
          ],
          "rollout": "Disable submit if snapshot matching fails.",
          "skills": [
            "State ownership",
            "Data integrity"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 80
            },
            {
              "field": "API design",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "0be4da5b-1289-4646-88fc-1b4dacaf0094",
          "key": "CFORM-109",
          "title": "Reconcile uncertain procurement submissions before retrying",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "submission",
          "dependsOn": [
            "CFORM-108"
          ],
          "scenario": "A timeout followed by retry creates duplicate requests. Retain one submission key until resolved.",
          "acceptanceCriteria": [
            "Retry reuses key",
            "Success locks snapshot",
            "Unknown outcomes expose status lookup"
          ],
          "implementationNotes": [
            "Timeout alone cannot prove failure."
          ],
          "verification": [
            "Submit then retry",
            "Timeout after adapter acceptance"
          ],
          "deliverables": [
            "Submission coordinator and timeout case"
          ],
          "rollout": "Pause retries while allowing lookup.",
          "skills": [
            "Idempotency",
            "Failure handling"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 50
            },
            {
              "field": "API design",
              "percentage": 30
            },
            {
              "field": "Distributed systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "c09bdcb6-f980-4b07-9e18-80c8b29f710e",
          "key": "CFORM-110",
          "title": "Export one recoverable procurement draft without session data",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "submission",
          "dependsOn": [
            "CFORM-106",
            "CFORM-109"
          ],
          "scenario": "Support requests whole browser storage to recover drafts. Offer scoped, previewed export instead.",
          "acceptanceCriteria": [
            "Preview lists included fields",
            "Session tokens are omitted",
            "Invalid drafts export as drafts"
          ],
          "implementationNotes": [
            "Never trust exported content as HTML."
          ],
          "verification": [
            "Export current draft",
            "Check other drafts and tokens are absent"
          ],
          "deliverables": [
            "Draft export and scope checks"
          ],
          "rollout": "Remove export if isolation fails.",
          "skills": [
            "Data minimization",
            "Serialization"
          ],
          "fieldMix": [
            {
              "field": "Privacy engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
