{
  "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": "9e8f3851-5a67-45b4-b7ea-05be8f9a803f",
      "key": "CMODAL",
      "title": "Accessible overlays and notifications in a team portal",
      "field": "Accessibility",
      "summary": "Make dialogs, menus, toasts and nested workflows predictable across input methods.",
      "context": "Fictional membership portal Juniper manages synthetic team settings. Use locally owned components and a local settings adapter.",
      "stack": [
        "React",
        "TypeScript",
        "Base UI",
        "CSS Modules"
      ],
      "prerequisites": [
        "Create synthetic settings forms and destructive-action stubs.",
        "Provide delayed success, rejection and removed-trigger cases."
      ],
      "developerValue": "Practice focus containment, dismissal and asynchronous feedback.",
      "companyValue": "Inspect whether shared UI primitives protect users across many product flows.",
      "delivery": "Change one owned primitive at a time and record affected portal consumers.",
      "phases": [
        {
          "id": "contracts",
          "title": "Specify overlay contracts",
          "goal": "Name dialogs and define dismissal."
        },
        {
          "id": "composition",
          "title": "Handle nested interactions",
          "goal": "Preserve focus and pending user work."
        },
        {
          "id": "feedback",
          "title": "Make feedback durable",
          "goal": "Support zoom and verify reusable behavior."
        }
      ],
      "tickets": [
        {
          "id": "5c8d129a-8969-4b50-a9a0-3355f2710707",
          "key": "CMODAL-101",
          "title": "Name team-setting dialogs from visible headings",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "contracts",
          "dependsOn": [],
          "scenario": "Screen readers announce Dialog without a purpose. Connect each settings dialog to its visible heading.",
          "acceptanceCriteria": [
            "Dialog has a meaningful name",
            "Description excludes the entire form",
            "Heading IDs remain unique"
          ],
          "implementationNotes": [
            "Use the owned primitive's naming API."
          ],
          "verification": [
            "Open two dialog types",
            "Mount repeated instances"
          ],
          "deliverables": [
            "Dialog naming fix and checks"
          ],
          "rollout": "Revert consumer composition if names collide.",
          "skills": [
            "Accessible names",
            "Composition"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 80
            },
            {
              "field": "Frontend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "3319f07e-2e79-4a61-a3e8-41826272824b",
          "key": "CMODAL-102",
          "title": "Make portal notification dismissal keyboard operable",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "contracts",
          "dependsOn": [],
          "scenario": "Toast close icons have no accessible name and cannot receive focus. Add an explicit dismissal control.",
          "acceptanceCriteria": [
            "Close has an action name",
            "Keyboard activation dismisses",
            "Dismissal preserves sensible focus"
          ],
          "implementationNotes": [
            "Notifications cannot trap focus."
          ],
          "verification": [
            "Dismiss via keyboard",
            "Dismiss notification whose trigger disappeared"
          ],
          "deliverables": [
            "Dismiss control and focus cases"
          ],
          "rollout": "Keep notifications persistent if dismissal becomes unreachable.",
          "skills": [
            "Keyboard",
            "Focus"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "0129c725-af78-460b-a1d2-846202ff3a0a",
          "key": "CMODAL-103",
          "title": "Define when unsaved settings dialogs may close",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "contracts",
          "dependsOn": [
            "CMODAL-101"
          ],
          "scenario": "Escape silently discards edited settings. Add a dirty-state close contract shared by close button and outside interaction.",
          "acceptanceCriteria": [
            "Clean dialogs close normally",
            "Dirty close requests confirmation",
            "Cancel keeps draft and focus"
          ],
          "implementationNotes": [
            "Avoid browser-wide beforeunload for local overlay changes."
          ],
          "verification": [
            "Close clean dialog",
            "Cancel dirty dismissal"
          ],
          "deliverables": [
            "Close policy and interaction cases"
          ],
          "rollout": "Disable outside dismissal while correcting the policy.",
          "skills": [
            "Forms",
            "State machines"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "Accessibility",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "e94885c4-025e-47b9-98f4-cc0ae22fe105",
          "key": "CMODAL-104",
          "title": "Return focus when a portal dialog trigger disappears",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 165,
          "phaseId": "composition",
          "dependsOn": [
            "CMODAL-103"
          ],
          "scenario": "After deleting a row through its dialog, the original trigger no longer exists. Provide a surviving fallback target.",
          "acceptanceCriteria": [
            "Existing trigger regains focus",
            "Deleted trigger uses nearest contextual control",
            "Failure keeps focus inside dialog"
          ],
          "implementationNotes": [
            "Resolve fallback after committed row removal."
          ],
          "verification": [
            "Save without deleting trigger",
            "Delete the trigger's row"
          ],
          "deliverables": [
            "Focus-return resolver and cases"
          ],
          "rollout": "Keep an action-result placeholder if no valid target exists.",
          "skills": [
            "Focus management",
            "DOM"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "dd12ae09-2103-4fe2-bf3d-4f20da4ffe89",
          "key": "CMODAL-105",
          "title": "Keep parent settings inert while a nested confirmation is open",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "composition",
          "dependsOn": [
            "CMODAL-103",
            "CMODAL-104"
          ],
          "scenario": "Tab reaches the parent form behind a confirmation dialog. Compose modal ownership across one nested level.",
          "acceptanceCriteria": [
            "Tab stays in active confirmation",
            "Escape closes only top layer",
            "Parent state survives confirmation cancellation"
          ],
          "implementationNotes": [
            "Use the accessible primitive rather than manual document-wide traps."
          ],
          "verification": [
            "Cycle Tab through nested dialog",
            "Cancel then resume parent form"
          ],
          "deliverables": [
            "Nested-dialog composition tests"
          ],
          "rollout": "Replace nested confirmation with an inline confirmation step.",
          "skills": [
            "Accessibility",
            "Modal composition"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "87e54181-f529-4674-8a58-c23c0c12a028",
          "key": "CMODAL-106",
          "title": "Prevent menu dismissal from swallowing a settings action",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "composition",
          "dependsOn": [
            "CMODAL-104"
          ],
          "scenario": "Choosing Rename closes the menu before its dialog receives the intended row. Make the action payload stable through dismissal.",
          "acceptanceCriteria": [
            "Rename targets selected row",
            "Keyboard and pointer match",
            "Removed rows show unavailable state"
          ],
          "implementationNotes": [
            "Capture immutable row identity at activation."
          ],
          "verification": [
            "Rename from keyboard menu",
            "Remove row before dialog load"
          ],
          "deliverables": [
            "Menu-to-dialog handoff"
          ],
          "rollout": "Disable the menu action if identity is unresolved.",
          "skills": [
            "Event ordering",
            "State ownership"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 80
            },
            {
              "field": "Accessibility",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "73b2eeaa-62b5-499c-acb3-e9abe5b9e9d5",
          "key": "CMODAL-107",
          "title": "Keep pending portal dialog saves cancellable without duplicate writes",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "composition",
          "dependsOn": [
            "CMODAL-105",
            "CMODAL-106"
          ],
          "scenario": "A slow save invites repeated clicks and users cannot tell whether closing cancels the write. Specify operation and view lifecycles separately.",
          "acceptanceCriteria": [
            "One pending write per revision",
            "Closing does not claim server cancellation",
            "Reopen reconciles operation status"
          ],
          "implementationNotes": [
            "Adapter cancellation may be advisory only."
          ],
          "verification": [
            "Close after accepted save",
            "Timeout then reopen same operation"
          ],
          "deliverables": [
            "Pending-operation model and races"
          ],
          "rollout": "Disable closing during unresolved operations with an explicit explanation.",
          "skills": [
            "Concurrency",
            "Failure semantics"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "API design",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "5929d491-ce01-4b5c-bce0-756131ccf00d",
          "key": "CMODAL-108",
          "title": "Reflow portal dialogs without hiding their confirmation actions",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "feedback",
          "dependsOn": [
            "CMODAL-105"
          ],
          "scenario": "Magnified text pushes Save below a fixed-height dialog with no reachable scroll path. Reflow the dialog shell.",
          "acceptanceCriteria": [
            "Content scrolls inside labeled region",
            "Actions stay reachable",
            "Document background remains inert"
          ],
          "implementationNotes": [
            "Avoid fixed pixel heights for text containers."
          ],
          "verification": [
            "Check 200 percent text sizing",
            "Use long error descriptions"
          ],
          "deliverables": [
            "Responsive dialog styles"
          ],
          "rollout": "Use full-page forms if actions cannot remain reachable.",
          "skills": [
            "CSS",
            "Responsive design"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "a8c3ef95-2d38-451e-acc6-666eb0e90a4d",
          "key": "CMODAL-109",
          "title": "Make critical portal notifications persistent until acknowledged",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "feedback",
          "dependsOn": [
            "CMODAL-102",
            "CMODAL-107"
          ],
          "scenario": "A failed permission change disappears after four seconds. Separate persistent actionable failures from transient informational status.",
          "acceptanceCriteria": [
            "Failed changes remain visible",
            "Acknowledgement is explicit",
            "Repeated same failure coalesces without losing action"
          ],
          "implementationNotes": [
            "Do not use urgency announcements for every toast."
          ],
          "verification": [
            "Reject permission change",
            "Repeat rejection and inspect coalescing"
          ],
          "deliverables": [
            "Notification priority contract"
          ],
          "rollout": "Disable auto-dismiss for all actionable messages if classification fails.",
          "skills": [
            "Live regions",
            "Error handling"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "1935ea54-b140-4201-836c-d17096293a6d",
          "key": "CMODAL-110",
          "title": "Audit shared portal overlays across input and theme settings",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "feedback",
          "dependsOn": [
            "CMODAL-108",
            "CMODAL-109"
          ],
          "scenario": "Primitive fixes may regress different consumers. Run a bounded matrix on settings, rename and deletion flows.",
          "acceptanceCriteria": [
            "Matrix covers keyboard and pointer",
            "Light dark and forced colors are recorded",
            "Failures include minimal reproduction"
          ],
          "implementationNotes": [
            "Report actual local observations and remaining gaps."
          ],
          "verification": [
            "Complete rename flow",
            "Exercise rejected delete in constrained display"
          ],
          "deliverables": [
            "Overlay audit record"
          ],
          "rollout": "Keep affected consumer disabled until its blocking regression is fixed.",
          "skills": [
            "Accessibility testing",
            "Regression analysis"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Quality engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
