{
  "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": "b36fc115-2462-454c-a65f-b038da1ea5a6",
      "key": "CTABLE",
      "title": "An accessible reporting workbench",
      "field": "Accessibility",
      "summary": "Give charts, sortable tables and exports equivalent understandable information.",
      "context": "Fictional cooperative Quarry reviews synthetic service-volume reports. Build local report fixtures with empty, missing and delayed values.",
      "stack": [
        "React",
        "TypeScript",
        "CSS Modules",
        "Playwright"
      ],
      "prerequisites": [
        "Create synthetic report series with explicit missing values.",
        "Stub report loading, sorting and export responses."
      ],
      "developerValue": "Practice semantic data presentation and robust interaction.",
      "companyValue": "Inspect whether reporting decisions remain possible without color or pointer use.",
      "delivery": "Submit focused report changes with manual checks; no compliance certification is implied.",
      "phases": [
        {
          "id": "meaning",
          "title": "Expose report meaning",
          "goal": "Define labels and missing values."
        },
        {
          "id": "interaction",
          "title": "Operate report controls",
          "goal": "Keep sorting, disclosure and export accessible."
        },
        {
          "id": "validation",
          "title": "Verify equivalent access",
          "goal": "Test constrained display and failure feedback."
        }
      ],
      "tickets": [
        {
          "id": "72dd31e1-90fa-440a-9a0c-dbbe8ae37892",
          "key": "CTABLE-101",
          "title": "Give report charts a textual trend summary",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "meaning",
          "dependsOn": [],
          "scenario": "A line chart has only an image label reading Chart. Add a concise summary sourced from the displayed series.",
          "acceptanceCriteria": [
            "Summary names metric and period",
            "Missing samples are disclosed",
            "Summary does not invent causation"
          ],
          "implementationNotes": [
            "Compute facts from fixture data only."
          ],
          "verification": [
            "Summarize rising series",
            "Summarize incomplete series"
          ],
          "deliverables": [
            "Trend summary projection"
          ],
          "rollout": "Hide summary if it disagrees with displayed data.",
          "skills": [
            "Data visualization",
            "Semantics"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "d79e6c2c-dc9d-42d5-8550-fcb648a1935c",
          "key": "CTABLE-102",
          "title": "Preserve table header associations in the reporting workbench",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "meaning",
          "dependsOn": [],
          "scenario": "Sticky styling replaced table headers with generic containers. Restore native table relationships.",
          "acceptanceCriteria": [
            "Column headers use correct semantics",
            "Row labels identify rows",
            "Sticky behavior preserves reading order"
          ],
          "implementationNotes": [
            "Avoid ARIA overrides of native table roles."
          ],
          "verification": [
            "Inspect header relationships",
            "Render grouped and empty rows"
          ],
          "deliverables": [
            "Semantic table markup"
          ],
          "rollout": "Remove sticky styling if it breaks semantics.",
          "skills": [
            "HTML",
            "Tables"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "49633b20-7d34-4613-9a7f-9d886177bac2",
          "key": "CTABLE-103",
          "title": "Represent missing report observations distinctly from zero",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "meaning",
          "dependsOn": [
            "CTABLE-101",
            "CTABLE-102"
          ],
          "scenario": "Missing intervals are graphed at zero and alter the apparent trend. Define equivalent chart and table representations.",
          "acceptanceCriteria": [
            "Zero remains numeric",
            "Missing values have explicit text",
            "Chart gaps match table omissions"
          ],
          "implementationNotes": [
            "Do not impute values within this ticket."
          ],
          "verification": [
            "Compare zero and missing rows",
            "Use all-missing series"
          ],
          "deliverables": [
            "Missing-value contract and cases"
          ],
          "rollout": "Disable chart interpolation if gaps are misrepresented.",
          "skills": [
            "Data integrity",
            "Visualization"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "Data engineering",
              "percentage": 20
            },
            {
              "field": "Accessibility",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "2afec68f-511f-46eb-9d08-cf536d92f036",
          "key": "CTABLE-104",
          "title": "Expose report sorting through semantic header buttons",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "interaction",
          "dependsOn": [
            "CTABLE-102",
            "CTABLE-103"
          ],
          "scenario": "Column sorting works only by clicking an unlabeled header. Add named buttons and current sort direction.",
          "acceptanceCriteria": [
            "Buttons identify sortable field",
            "Current direction is exposed",
            "Unsortable headers remain plain text"
          ],
          "implementationNotes": [
            "Preserve native table navigation."
          ],
          "verification": [
            "Sort ascending then descending",
            "Activate with keyboard"
          ],
          "deliverables": [
            "Sort controls and keyboard cases"
          ],
          "rollout": "Restore fixed documented ordering if controls fail.",
          "skills": [
            "Accessibility",
            "Sorting"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "095d55d5-a733-4445-8bbe-8962e3f5db31",
          "key": "CTABLE-105",
          "title": "Keep report filter errors near their controls",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "interaction",
          "dependsOn": [
            "CTABLE-104"
          ],
          "scenario": "Invalid date ranges produce a toast that disappears before users reach the fields. Add persistent linked errors.",
          "acceptanceCriteria": [
            "Error names affected range",
            "Correction clears the message",
            "Submitted values remain editable"
          ],
          "implementationNotes": [
            "Do not automatically reset user dates."
          ],
          "verification": [
            "Submit reversed range",
            "Correct only end date"
          ],
          "deliverables": [
            "Date-filter errors and focus checks"
          ],
          "rollout": "Fall back to explicit apply with inline errors.",
          "skills": [
            "Forms",
            "Error recovery"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "4c51e0cd-d6b5-4a5c-baeb-a9973efd15df",
          "key": "CTABLE-106",
          "title": "Provide a keyboard alternative to chart range brushing",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "interaction",
          "dependsOn": [
            "CTABLE-101",
            "CTABLE-105"
          ],
          "scenario": "Selecting a chart interval requires dragging across the plot. Add equivalent start/end interval controls.",
          "acceptanceCriteria": [
            "Controls select the same range",
            "Selection is visible in table",
            "Out-of-range values explain limits"
          ],
          "implementationNotes": [
            "Keep brushing optional."
          ],
          "verification": [
            "Select identical range both ways",
            "Enter range outside data"
          ],
          "deliverables": [
            "Range selector and equivalence tests"
          ],
          "rollout": "Disable brushing if it diverges from controls.",
          "skills": [
            "Keyboard",
            "Data visualization"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "09761a98-c142-499b-9059-8e2a7f1a4cf2",
          "key": "CTABLE-107",
          "title": "Keep report details discoverable after virtualized rows leave view",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "interaction",
          "dependsOn": [
            "CTABLE-104",
            "CTABLE-106"
          ],
          "scenario": "Expanded row details unmount during scrolling and leave focus nowhere. Bound virtualization around active interaction.",
          "acceptanceCriteria": [
            "Focused details remain mounted",
            "Collapsed rows release retained nodes",
            "Large fixtures stay within documented DOM budget"
          ],
          "implementationNotes": [
            "Do not pin every previously opened row forever."
          ],
          "verification": [
            "Scroll focused detail out of view",
            "Collapse and verify reclamation"
          ],
          "deliverables": [
            "Focus-aware virtualization policy"
          ],
          "rollout": "Disable virtualization for interactive details if focus is lost.",
          "skills": [
            "Virtualization",
            "Focus management"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 40
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "2eeee55f-abac-4af4-80c7-91ccd10b6404",
          "key": "CTABLE-108",
          "title": "Announce reporting export readiness without stealing focus",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "validation",
          "dependsOn": [
            "CTABLE-105"
          ],
          "scenario": "A completed export opens a modal and interrupts filter editing. Expose a stable download action with a status message.",
          "acceptanceCriteria": [
            "Readiness announces once",
            "Focus stays in active control",
            "Failure exposes retry"
          ],
          "implementationNotes": [
            "Keep file status outside the table live region."
          ],
          "verification": [
            "Complete export while editing",
            "Fail export before completion"
          ],
          "deliverables": [
            "Export status component"
          ],
          "rollout": "Use explicit status refresh if announcements repeat.",
          "skills": [
            "Async UI",
            "Live regions"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "d3e5b338-8cff-48ae-a275-80cfe7f81771",
          "key": "CTABLE-109",
          "title": "Keep report distinctions visible in forced-color mode",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 150,
          "phaseId": "validation",
          "dependsOn": [
            "CTABLE-103",
            "CTABLE-107"
          ],
          "scenario": "Report lines and selected rows vanish under forced colors. Add structural distinctions using patterns and borders.",
          "acceptanceCriteria": [
            "Series have non-color identifiers",
            "Selected rows retain visible state",
            "Focus outline remains discernible"
          ],
          "implementationNotes": [
            "Honor system colors instead of forcing brand fills."
          ],
          "verification": [
            "Inspect forced-color rendering",
            "Check selected row on empty refresh"
          ],
          "deliverables": [
            "Styles and captured verification notes"
          ],
          "rollout": "Use the data table as the default constrained view.",
          "skills": [
            "Forced colors",
            "CSS"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "135c5ace-7524-4fa8-8b3a-4b35ae3ea645",
          "key": "CTABLE-110",
          "title": "Document report equivalence through a narrow assistive audit",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "validation",
          "dependsOn": [
            "CTABLE-107",
            "CTABLE-108",
            "CTABLE-109"
          ],
          "scenario": "The team cannot verify that the chart alternative carries the same decisions. Execute a defined fixture-based comparison.",
          "acceptanceCriteria": [
            "Audit compares values and gaps",
            "Keyboard sort and export are covered",
            "Unresolved limitations remain explicit"
          ],
          "implementationNotes": [
            "Record environment and actual observations."
          ],
          "verification": [
            "Find highest known interval both ways",
            "Inspect missing data and failed export"
          ],
          "deliverables": [
            "Audit protocol and findings"
          ],
          "rollout": "Block wider report rollout for reproducible information loss.",
          "skills": [
            "Accessibility testing",
            "Data quality"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 50
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            },
            {
              "field": "Data engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
