{
  "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": "932216f7-640e-4a54-8e90-40a3d812dd51",
      "key": "PWEB",
      "title": "Make a large scheduling screen respond to the next click",
      "summary": "Investigate browser loading, rendering and interaction costs while preserving usable scheduling workflows.",
      "context": "A fictional repair coordinator opens a week containing 2,000 jobs. The initial page loads, but filtering and selecting a job can freeze the interface. Build a synthetic scheduling screen with keyboard operation before measuring changes.",
      "stack": [
        "TypeScript",
        "React",
        "CSS Modules",
        "Playwright",
        "Browser Performance API"
      ],
      "prerequisites": [
        "Create a local schedule UI with 2,000 synthetic jobs, long labels, empty results and deterministic responses.",
        "Record browser version, viewport, device emulation, CPU/network throttling and build mode for every comparison."
      ],
      "developerValue": "Connect bundle, rendering and interaction measurements to user-visible behavior without losing accessibility.",
      "companyValue": "Produce a bounded performance investigation and regression workflow for dense operational interfaces.",
      "delivery": "Ten tickets across measurement, implementation and regression phases. Lab timings apply only to the documented local browser setup; field-user performance is not inferred.",
      "phases": [
        {
          "id": "measure",
          "title": "Capture the slow interactions",
          "goal": "Record repeatable navigation and interaction traces with correct results."
        },
        {
          "id": "improve",
          "title": "Reduce avoidable browser work",
          "goal": "Change loading and rendering paths while preserving navigation and assistive-technology behavior."
        },
        {
          "id": "sustain",
          "title": "Guard responsiveness",
          "goal": "Cover memory, interrupted work and regression budgets in a repeatable browser check."
        }
      ],
      "field": "Performance engineering",
      "tickets": [
        {
          "id": "051d4b8e-4108-4694-86df-527da501464c",
          "key": "PWEB-101",
          "title": "Record the schedule workflow that freezes after filtering",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "measure",
          "dependsOn": [],
          "scenario": "The issue report says the screen feels slow. Developers reproduce it with different data and disagree about which interaction is responsible.",
          "acceptanceCriteria": [
            "Define a deterministic sequence: load 2,000 jobs, filter by technician, select the final visible job and clear the filter.",
            "Record build mode, browser version, viewport and any throttling alongside trace timestamps.",
            "Assert the selected job and final result count so an incomplete interaction cannot appear fast."
          ],
          "implementationNotes": [
            "Use only synthetic names and job descriptions; record navigation and interaction phases separately."
          ],
          "verification": [
            "Replay the sequence twice and confirm identical selected IDs and result counts.",
            "Run with an empty technician result and verify the sequence reports that expected state rather than timing an absent control."
          ],
          "deliverables": [
            "Browser workflow fixture and annotated baseline trace"
          ],
          "rollout": "Keep the baseline workflow versioned before changing the page; fixture changes invalidate direct timing comparisons.",
          "skills": [
            "Browser profiling",
            "Reproducibility"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 50
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            },
            {
              "field": "Frontend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "2ea40150-782a-43d7-a60d-e18c6c05617b",
          "key": "PWEB-102",
          "title": "Identify which schedule code is shipped before the first interaction",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 90,
          "phaseId": "measure",
          "dependsOn": [
            "PWEB-101"
          ],
          "scenario": "The screen downloads export and map code before the user opens either feature. The team needs sizes and dependency paths before splitting bundles.",
          "acceptanceCriteria": [
            "Report transferred and parsed script sizes for the production build with cache state recorded.",
            "Identify the dependency paths for export and map features and their actual use in the baseline workflow.",
            "Separate first-load transfers from subsequent navigation and avoid adding compressed sizes to uncompressed sizes."
          ],
          "implementationNotes": [
            "Use local build artifacts and browser network records; do not compare development bundles with production output."
          ],
          "verification": [
            "Capture cold-cache and warm-cache navigation separately.",
            "Open the export and map features after baseline load and verify which additional resources are requested."
          ],
          "deliverables": [
            "Bundle inventory and a justified split proposal"
          ],
          "rollout": "This ticket changes no loading behavior; preserve the measured build identifier for the implementation comparison.",
          "skills": [
            "Bundle analysis",
            "Network loading"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "f3cf9b8b-5c55-4fba-aa93-d06127c8819a",
          "key": "PWEB-103",
          "title": "Measure long tasks caused by filtering rather than counting renders alone",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "measure",
          "dependsOn": [
            "PWEB-101"
          ],
          "scenario": "A render counter improved after memoization, but typing still stalls because sorting and formatting happen before React commits.",
          "acceptanceCriteria": [
            "Record input-event start, result commit and long-task observations around the filter workflow.",
            "Attribute measured time to filtering, sorting, rendering and layout where supported; label gaps as unknown.",
            "Keep measurements bounded and remove observers when the screen is left."
          ],
          "implementationNotes": [
            "A lab interaction duration is not a claim about field Core Web Vitals; name the measured boundary explicitly."
          ],
          "verification": [
            "Inject a known synchronous filter delay and verify it appears in the recorded interaction.",
            "Navigate away and back repeatedly and confirm only one active observer set remains."
          ],
          "deliverables": [
            "Interaction measurement helper and trace interpretation notes"
          ],
          "rollout": "Enable the helper only for the local profiling build; detach it without changing application behavior.",
          "skills": [
            "Main-thread work",
            "Instrumentation"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "121eb091-931c-41d9-9f09-65e6724581e1",
          "key": "PWEB-104",
          "title": "Load the schedule export code when export is requested",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "improve",
          "dependsOn": [
            "PWEB-102"
          ],
          "scenario": "The spreadsheet export dependency adds work to every schedule visit even though the baseline user never exports.",
          "acceptanceCriteria": [
            "Move export-only code behind an explicit load boundary and preserve the generated file contents.",
            "Show a keyboard-accessible loading state and prevent duplicate export starts while the module loads.",
            "Handle module-load failure with a retry action without losing selected filters."
          ],
          "implementationNotes": [
            "Compare initial transfer and parse work in the same production build configuration; do not defer code required to display the schedule."
          ],
          "verification": [
            "Verify the initial workflow makes no export-module request, then trigger export and compare the file with the baseline fixture.",
            "Fail the module request once and confirm retry succeeds with the original filter state."
          ],
          "deliverables": [
            "Deferred export implementation, network comparison and failure regression"
          ],
          "rollout": "Keep a loading-boundary switch in the exercise; revert to eager loading if export compatibility fails.",
          "skills": [
            "Code splitting",
            "Failure states"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 50
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            },
            {
              "field": "Accessibility",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "836709ef-eb4b-46e5-9e98-93fdfabb1a65",
          "key": "PWEB-105",
          "title": "Render only the visible schedule rows without losing keyboard position",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 270,
          "phaseId": "improve",
          "dependsOn": [
            "PWEB-101",
            "PWEB-103"
          ],
          "scenario": "Every filter mounts hundreds of offscreen job rows. A first virtualization attempt is faster but drops focus when the selected row scrolls away.",
          "acceptanceCriteria": [
            "Bound mounted rows by viewport and overscan while retaining stable job identity.",
            "Define and implement keyboard movement, focus restoration and accessible row position information.",
            "Support long wrapped labels and the empty state without overlapping rows or selecting a different job after filtering."
          ],
          "implementationNotes": [
            "Document the chosen virtualization semantics and test with zoom and a narrow viewport; do not hide all nonvisible records from search without an explicit alternative."
          ],
          "verification": [
            "Traverse beyond the initial viewport with the keyboard, filter the selected row out and verify the declared focus behavior.",
            "Measure mounted nodes and interaction duration at 200 and 2,000 jobs while checking the selected job ID."
          ],
          "deliverables": [
            "Bounded row rendering, accessibility checks and before/after traces"
          ],
          "rollout": "Gate virtualization independently; reverting renders the full list while preserving selected IDs and filter state.",
          "skills": [
            "Rendering performance",
            "Accessible interaction"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 40
            },
            {
              "field": "Frontend",
              "percentage": 30
            },
            {
              "field": "Accessibility",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "07fbda9b-1a86-4ce2-b53f-4dbdbb22a93f",
          "key": "PWEB-106",
          "title": "Reuse formatted job data only while its inputs remain unchanged",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "improve",
          "dependsOn": [
            "PWEB-103"
          ],
          "scenario": "Date and duration formatting dominates repeated filters. A broad memoization patch reuses labels after the schedule time zone changes.",
          "acceptanceCriteria": [
            "Cache or precompute expensive formatting with all relevant inputs, including locale and time zone, in the invalidation rule.",
            "Bound retained derived data and remove entries for jobs no longer present.",
            "Keep visible labels identical to the uncached formatter across updates and daylight-saving boundary fixtures."
          ],
          "implementationNotes": [
            "Measure formatting calls and interaction time together; memoization alone is not evidence of a useful improvement."
          ],
          "verification": [
            "Change the time zone and job start time independently, comparing every visible label with the baseline formatter.",
            "Replace the dataset repeatedly and check that retained derived entries stay within the declared bound."
          ],
          "deliverables": [
            "Derived-data cache, invalidation regressions and profiling comparison"
          ],
          "rollout": "Disable derived-data reuse through one path if stale labels appear; the original formatter remains the reference behavior.",
          "skills": [
            "Memoization",
            "Invalidation"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "5ec679ad-812d-4ff5-9615-acb8c8584bfe",
          "key": "PWEB-107",
          "title": "Let a new filter supersede expensive work already in progress",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 330,
          "phaseId": "improve",
          "dependsOn": [
            "PWEB-101",
            "PWEB-103",
            "PWEB-105"
          ],
          "scenario": "Fast typing schedules several expensive filter computations. Results from an earlier query briefly replace the latest selection and consume time after they are irrelevant.",
          "acceptanceCriteria": [
            "Choose a bounded scheduling or worker strategy and explain why it fits the measured bottleneck.",
            "Publish results only for the current dataset and query revision; discard superseded work safely.",
            "Preserve responsive keyboard input and a clear pending state without moving focus or showing stale result counts."
          ],
          "implementationNotes": [
            "If using a worker, include transfer/serialization cost in the comparison and terminate it when the screen unmounts."
          ],
          "verification": [
            "Complete an older query after a newer query and verify only current results appear.",
            "Type and clear rapidly while replacing the dataset, then inspect responsiveness, final IDs and worker or task cleanup.",
            "Repeat baseline and selected-strategy runs three times under the same recorded browser workload; compare input-latency distributions and long-task counts, including worker transfer and serialization overhead when applicable."
          ],
          "deliverables": [
            "Scheduling decision, implementation and out-of-order completion tests"
          ],
          "rollout": "Canary the alternate filter path locally; reverting cancels its work and restores synchronous filtering with the same query state.",
          "skills": [
            "Scheduling",
            "Concurrency correctness"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 50
            },
            {
              "field": "Frontend",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "a0f4d22e-6a0e-47ab-97c5-323e1372ce05",
          "key": "PWEB-108",
          "title": "Find retained job rows after repeated schedule navigation",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "sustain",
          "dependsOn": [
            "PWEB-105",
            "PWEB-107"
          ],
          "scenario": "The screen starts responsive and degrades after operators open and close it throughout a shift. Detached rows remain reachable through subscriptions.",
          "acceptanceCriteria": [
            "Identify a reproducible retention path using repeated mount, interaction and unmount cycles.",
            "Release listeners, workers and subscriptions owned by the screen without cancelling shared application resources.",
            "Define a post-cleanup retained-object bound on the declared browser and distinguish temporary allocation from a leak."
          ],
          "implementationNotes": [
            "Use heap snapshots and retaining paths; do not claim a leak from one process-memory sample."
          ],
          "verification": [
            "Run 20 navigation cycles and inspect retained job objects after the same cleanup procedure at each checkpoint.",
            "Navigate away during a pending filter and verify no late update, leaked listener or unhandled exception."
          ],
          "deliverables": [
            "Retention diagnosis, lifecycle fix and repeatable memory check"
          ],
          "rollout": "Revert only the offending optimization if cleanup cannot be demonstrated; keep the regression cycle in the local suite.",
          "skills": [
            "Memory profiling",
            "Resource cleanup"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "e3c17fe1-bc7b-4077-b1ee-91f938847ae2",
          "key": "PWEB-109",
          "title": "Make the schedule performance run include slow devices and empty results",
          "type": "CHORE",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "sustain",
          "dependsOn": [
            "PWEB-101",
            "PWEB-104",
            "PWEB-105"
          ],
          "scenario": "The fastest desktop run became the benchmark. It misses the narrow layout and empty-filter transition used by coordinators on older laptops.",
          "acceptanceCriteria": [
            "Define two repeatable local profiles with explicit viewport, throttling and cache state.",
            "Run nonempty, empty and large-label workflows and assert visual state plus selected identity.",
            "Separate trace artifacts by profile and build revision; invalid runs report failure instead of a zero timing."
          ],
          "implementationNotes": [
            "Emulation defines an exercise profile, not a claim to reproduce every physical device."
          ],
          "verification": [
            "Execute both profiles three times with a fixed warmup rule and retain all measurements.",
            "Remove a required result element deliberately and confirm the run fails its correctness check before reporting success."
          ],
          "deliverables": [
            "Browser profile matrix and repeatable benchmark command"
          ],
          "rollout": "Use both profiles in local release review; revise profiles only with a recorded reason and a new baseline.",
          "skills": [
            "Performance testing",
            "Browser automation"
          ],
          "fieldMix": [
            {
              "field": "Quality engineering",
              "percentage": 50
            },
            {
              "field": "Performance engineering",
              "percentage": 30
            },
            {
              "field": "Frontend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "d4707980-8df9-4c48-ba7a-ad7ae4a293c3",
          "key": "PWEB-110",
          "title": "Approve schedule optimizations only when the measured interaction improves",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "sustain",
          "dependsOn": [
            "PWEB-104",
            "PWEB-105",
            "PWEB-106",
            "PWEB-107",
            "PWEB-108",
            "PWEB-109"
          ],
          "scenario": "Several changes reduced different counters. The team needs a release decision tied to the actual filter-and-select workflow and its accessibility contract.",
          "acceptanceCriteria": [
            "Compare three paired runs per declared profile and require at least 20% lower median filter-to-result duration on the constrained profile.",
            "Require unchanged selected IDs, keyboard behavior and empty-state behavior, with no increase beyond 10% in initial transferred script bytes.",
            "Report all timings, spread, retained-object observations and inconclusive results; document which changes are included and why."
          ],
          "implementationNotes": [
            "The numerical budgets apply only to this fixture and lab profile. Preserve raw traces so reviewers can assess attribution and noise."
          ],
          "verification": [
            "Run the complete workflow against baseline and candidate in alternating order.",
            "Revert the combined candidate and verify both functional behavior and measured baseline recovery under the same profiles."
          ],
          "deliverables": [
            "Release decision, paired trace bundle and rollback rehearsal"
          ],
          "rollout": "Promote the chosen combination only after the exercise gates pass; keep each optimization independently reversible where state compatibility permits.",
          "skills": [
            "Performance budgets",
            "Release decisions"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 50
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            },
            {
              "field": "Accessibility",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
