{
  "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": "2b33069c-9cb1-47c9-a1a7-8d54f07ffdb9",
      "key": "CGRID",
      "title": "An inventory grid with trustworthy edits",
      "field": "Frontend",
      "summary": "Make spreadsheet-like stock editing predictable across validation and concurrent updates.",
      "context": "Fictional supplier Reedworks uses a browser inventory table. Quantities are planning records, not live warehouse instructions.",
      "stack": [
        "React",
        "TypeScript",
        "CSS Modules",
        "Playwright"
      ],
      "prerequisites": [
        "Create synthetic SKUs with revisions and nullable quantities.",
        "Implement a local paginated adapter with conditional updates."
      ],
      "developerValue": "Practice grid interaction and concurrent edit recovery.",
      "companyValue": "Inspect how changes protect operator intent during partial failures.",
      "delivery": "Deliver separate pull requests using synthetic stock.",
      "phases": [
        {
          "id": "cells",
          "title": "Understand cells",
          "goal": "Define value and edit contracts."
        },
        {
          "id": "edits",
          "title": "Protect edits",
          "goal": "Preserve selection and drafts."
        },
        {
          "id": "release",
          "title": "Handle interruption",
          "goal": "Recover from partial writes."
        }
      ],
      "tickets": [
        {
          "id": "1b80a753-efea-4ad3-8157-028a1a57f570",
          "key": "CGRID-101",
          "title": "Render unknown stock separately from zero",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "cells",
          "dependsOn": [],
          "scenario": "Buyers mistake missing quantities for zero because the grid coerces null. Preserve the API distinction.",
          "acceptanceCriteria": [
            "Null displays Unknown",
            "Zero displays 0",
            "Unknown values sort last"
          ],
          "implementationNotes": [
            "Do not mutate stored quantities."
          ],
          "verification": [
            "Render null beside zero",
            "Reject nonnumeric values without showing NaN"
          ],
          "deliverables": [
            "Quantity renderer and cases"
          ],
          "rollout": "Revert the renderer without migration.",
          "skills": [
            "Rendering",
            "Data contracts"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 80
            },
            {
              "field": "API design",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "a9da8cd1-8adb-49b3-a688-2d55a5ee929b",
          "key": "CGRID-102",
          "title": "Keep inventory column widths after reload",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "cells",
          "dependsOn": [],
          "scenario": "Operators resize the SKU column every morning. Save bounded widths per grid version.",
          "acceptanceCriteria": [
            "Widths restore after reload",
            "Limits prevent hidden controls",
            "Reset removes overrides"
          ],
          "implementationNotes": [
            "Persist layout only."
          ],
          "verification": [
            "Restore two widths",
            "Corrupt saved JSON and verify defaults"
          ],
          "deliverables": [
            "Width persistence and reset control"
          ],
          "rollout": "Disable persistence if controls disappear.",
          "skills": [
            "Browser storage",
            "Layout"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "0aed0914-bb05-43fd-82b2-db6e3d96a6e7",
          "key": "CGRID-103",
          "title": "Validate stock edits before saving",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "cells",
          "dependsOn": [
            "CGRID-101"
          ],
          "scenario": "Pasting a decimal quantity sends an invalid stock update. Add recoverable field validation.",
          "acceptanceCriteria": [
            "Nonnegative integers save",
            "Decimals and negatives remain editable",
            "Errors identify the cell"
          ],
          "implementationNotes": [
            "Follow the local adapter contract."
          ],
          "verification": [
            "Save quantity 12",
            "Paste -1 and verify no request"
          ],
          "deliverables": [
            "Cell validator and interaction cases"
          ],
          "rollout": "Restore read-only quantities if valid saves fail.",
          "skills": [
            "Forms",
            "Validation"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "b917a431-552a-4556-90bb-99334d37a519",
          "key": "CGRID-104",
          "title": "Maintain inventory selection while sorted rows update",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "edits",
          "dependsOn": [
            "CGRID-101"
          ],
          "scenario": "A background refresh reorders rows and moves the editing highlight to another SKU. Anchor selection to identity.",
          "acceptanceCriteria": [
            "Selected SKU remains selected",
            "Deleted selection clears explicitly",
            "Sorting cannot change edit target"
          ],
          "implementationNotes": [
            "Array indices cannot identify rows."
          ],
          "verification": [
            "Refresh reordered rows",
            "Delete the selected SKU mid-edit"
          ],
          "deliverables": [
            "Identity-based selection coordinator"
          ],
          "rollout": "Disable background refresh if selection diverges.",
          "skills": [
            "State management",
            "Identity"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 100
            }
          ],
          "patterns": []
        },
        {
          "id": "c00e399a-d101-4b7b-a6dd-5d181365f97a",
          "key": "CGRID-105",
          "title": "Reject stale stock updates without losing drafts",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "edits",
          "dependsOn": [
            "CGRID-103"
          ],
          "scenario": "Two buyers edit the same row and the second overwrites the first. Handle revision conflicts.",
          "acceptanceCriteria": [
            "Saves include expected revision",
            "Conflict preserves draft and current value",
            "Resubmission requires reconciliation"
          ],
          "implementationNotes": [
            "Never blindly retry conflicts."
          ],
          "verification": [
            "Accept matching revision",
            "Reject stale revision and inspect draft"
          ],
          "deliverables": [
            "Conflict panel and adapter cases"
          ],
          "rollout": "Gate editing while conflict handling is repaired.",
          "skills": [
            "Concurrency",
            "HTTP"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "API design",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "6f578554-b6ce-41f0-b541-86e96775b83d",
          "key": "CGRID-106",
          "title": "Define keyboard entry and escape for inventory cells",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "edits",
          "dependsOn": [
            "CGRID-103",
            "CGRID-104"
          ],
          "scenario": "Arrow keys sometimes move cells while users edit text. Introduce explicit navigation and editing states.",
          "acceptanceCriteria": [
            "Enter starts editing",
            "Escape restores committed value",
            "Editor arrows retain native behavior"
          ],
          "implementationNotes": [
            "Provide semantic controls and visible focus."
          ],
          "verification": [
            "Edit without a pointer",
            "Escape an invalid draft"
          ],
          "deliverables": [
            "Keyboard contract and checks"
          ],
          "rollout": "Fall back to ordinary row forms.",
          "skills": [
            "Accessibility",
            "Keyboard"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9a577bc6-cdd0-4f0c-a8bf-5a4f88eee321",
          "key": "CGRID-107",
          "title": "Undo only an uncontested stock change",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "edits",
          "dependsOn": [
            "CGRID-105"
          ],
          "scenario": "A blind Undo would erase a colleague's newer stock value. Add one guarded inverse update.",
          "acceptanceCriteria": [
            "Undo uses resulting revision",
            "Newer revisions reject undo",
            "Failure preserves current row"
          ],
          "implementationNotes": [
            "Undo must be a conditional write."
          ],
          "verification": [
            "Undo an uncontested save",
            "Advance revision before undo"
          ],
          "deliverables": [
            "Guarded undo and race case"
          ],
          "rollout": "Hide Undo while retaining ordinary edits.",
          "skills": [
            "Concurrency",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 50
            },
            {
              "field": "API design",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "ffbe691a-b90f-4685-8ed9-7a215f8d059d",
          "key": "CGRID-108",
          "title": "Preview pasted stock ranges before applying them",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "release",
          "dependsOn": [
            "CGRID-103",
            "CGRID-106"
          ],
          "scenario": "A spreadsheet paste includes headers and an extra column. Show its target mapping before writing.",
          "acceptanceCriteria": [
            "Preview names target SKUs",
            "Malformed rows show errors",
            "Confirm sends selected valid rows only"
          ],
          "implementationNotes": [
            "Bound paste size and treat text as untrusted."
          ],
          "verification": [
            "Preview three rows",
            "Reject oversized formula-like input safely"
          ],
          "deliverables": [
            "Paste parser and confirmation preview"
          ],
          "rollout": "Disable paste while preserving manual edits.",
          "skills": [
            "Parsing",
            "Input security"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 70
            },
            {
              "field": "Security",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "88cca219-2074-4d93-8470-c3f057073a41",
          "key": "CGRID-109",
          "title": "Report individual results for a partial stock save",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "release",
          "dependsOn": [
            "CGRID-105",
            "CGRID-108"
          ],
          "scenario": "Bulk edit says Saved when one row failed. Return stable per-row outcomes.",
          "acceptanceCriteria": [
            "Success shows committed revision",
            "Failure retains draft",
            "Retry selects failed rows only"
          ],
          "implementationNotes": [
            "Timeouts remain unresolved until reconciled."
          ],
          "verification": [
            "Save mixed valid and invalid rows",
            "Timeout one row and inspect uncertainty"
          ],
          "deliverables": [
            "Result summary and retry controls"
          ],
          "rollout": "Disable bulk save if result mapping fails.",
          "skills": [
            "Partial failure",
            "UX"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 70
            },
            {
              "field": "API design",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "7346772b-385e-435c-9e56-b5433646a66c",
          "key": "CGRID-110",
          "title": "Export inventory-grid diagnostics without stock data",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 90,
          "phaseId": "release",
          "dependsOn": [
            "CGRID-104",
            "CGRID-109"
          ],
          "scenario": "Support needs grid state but copying rows exposes inventory. Add an opt-in diagnostic download.",
          "acceptanceCriteria": [
            "Includes grid version and flags",
            "Omits quantities and SKU labels",
            "User previews the report"
          ],
          "implementationNotes": [
            "Allowlist diagnostic fields."
          ],
          "verification": [
            "Export populated grid",
            "Verify secret-like fixture values are absent"
          ],
          "deliverables": [
            "Exporter and exclusion checks"
          ],
          "rollout": "Remove export if unexpected fields appear.",
          "skills": [
            "Observability",
            "Data minimization"
          ],
          "fieldMix": [
            {
              "field": "Privacy engineering",
              "percentage": 60
            },
            {
              "field": "Frontend",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
