{
  "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": "ad213ad0-6963-4653-8f19-f91db05f6240",
      "key": "CLIVE",
      "title": "A live incident board with recoverable updates",
      "field": "Real-time systems",
      "summary": "Keep a synthetic service-status board ordered and replayable over server-sent events.",
      "context": "Fictional internal status team Harbor updates operational incident cards. Build a local event log and SSE adapter; incidents and service names are invented.",
      "stack": [
        "TypeScript",
        "Server-sent events",
        "PostgreSQL adapter",
        "React"
      ],
      "prerequisites": [
        "Create synthetic incident revisions and a local append-only event stub.",
        "Provide controllable disconnect, replay and retention fixtures."
      ],
      "developerValue": "Practice event projection, replay and freshness communication.",
      "companyValue": "Inspect whether dashboards remain trustworthy through network interruptions.",
      "delivery": "Use local fixtures; this board is not an emergency-response system.",
      "phases": [
        {
          "id": "events",
          "title": "Specify live events",
          "goal": "Define event identity and projection."
        },
        {
          "id": "replay",
          "title": "Recover transport gaps",
          "goal": "Make replay and mutation coherent."
        },
        {
          "id": "operation",
          "title": "Operate bounded streams",
          "goal": "Handle slow clients and explain freshness."
        }
      ],
      "tickets": [
        {
          "id": "7abfb514-9327-4837-98d4-cea65d595f58",
          "key": "CLIVE-101",
          "title": "Give live incident events stable opaque identifiers",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 75,
          "phaseId": "events",
          "dependsOn": [],
          "scenario": "Reconnecting clients cannot distinguish replay from new events because IDs change on delivery. Persist event identity.",
          "acceptanceCriteria": [
            "Replay preserves IDs",
            "Distinct events have unique IDs",
            "IDs contain no incident text"
          ],
          "implementationNotes": [
            "Delivery attempts must not mint new event IDs."
          ],
          "verification": [
            "Replay one event twice",
            "Append two equal payloads as distinct events"
          ],
          "deliverables": [
            "Event identity contract"
          ],
          "rollout": "Disable replay until stable IDs exist.",
          "skills": [
            "Event modeling",
            "Identity"
          ],
          "fieldMix": [
            {
              "field": "Real-time systems",
              "percentage": 60
            },
            {
              "field": "Data engineering",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "e536906c-fa9c-4c33-9735-51a18e1b8cb7",
          "key": "CLIVE-102",
          "title": "Render incident status text independently of severity color",
          "type": "BUG",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "events",
          "dependsOn": [],
          "scenario": "Color-only status blocks hide the distinction between investigating and monitoring. Add visible status labels.",
          "acceptanceCriteria": [
            "Every status has text",
            "Unknown status renders explicit fallback",
            "Color is optional reinforcement"
          ],
          "implementationNotes": [
            "Do not infer severity from color tokens."
          ],
          "verification": [
            "Render all fixture statuses",
            "Render unsupported status"
          ],
          "deliverables": [
            "Status presenter and cases"
          ],
          "rollout": "Use text-only presentation if color mapping is wrong.",
          "skills": [
            "Accessibility",
            "State projection"
          ],
          "fieldMix": [
            {
              "field": "Accessibility",
              "percentage": 70
            },
            {
              "field": "Frontend",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "8f79d82e-e6e3-4c62-bf96-bd3655f0df52",
          "key": "CLIVE-103",
          "title": "Apply live incident updates only to newer revisions",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "events",
          "dependsOn": [
            "CLIVE-101",
            "CLIVE-102"
          ],
          "scenario": "A delayed update reopens a resolved incident. Compare revisions before changing the projected card.",
          "acceptanceCriteria": [
            "Newer revisions apply",
            "Equal replay is harmless",
            "Older revisions cannot overwrite"
          ],
          "implementationNotes": [
            "Revision scope is per incident."
          ],
          "verification": [
            "Apply revisions in order",
            "Deliver earlier revision after resolution"
          ],
          "deliverables": [
            "Revision projector and ordering cases"
          ],
          "rollout": "Refresh full cards if ordering cannot be established.",
          "skills": [
            "Ordering",
            "Idempotency"
          ],
          "fieldMix": [
            {
              "field": "Real-time systems",
              "percentage": 60
            },
            {
              "field": "Distributed systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "541c098e-2239-4661-8393-7c297285f86a",
          "key": "CLIVE-104",
          "title": "Resume incident streams from the last applied event",
          "type": "STORY",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "replay",
          "dependsOn": [
            "CLIVE-103"
          ],
          "scenario": "A reconnect misses changes made during disconnection. Send the last applied event ID and replay retained updates.",
          "acceptanceCriteria": [
            "Resume begins after acknowledged ID",
            "Replay preserves event order",
            "Cursor advances after successful projection"
          ],
          "implementationNotes": [
            "Received is not equivalent to applied."
          ],
          "verification": [
            "Reconnect after two missed events",
            "Fail projection before cursor advancement"
          ],
          "deliverables": [
            "Resume coordinator and replay cases"
          ],
          "rollout": "Force snapshot reload instead of uncertain replay.",
          "skills": [
            "SSE",
            "Recovery"
          ],
          "fieldMix": [
            {
              "field": "Real-time systems",
              "percentage": 60
            },
            {
              "field": "Networking",
              "percentage": 20
            },
            {
              "field": "Distributed systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "f7a30be4-431c-4735-9245-a14ceb757b4d",
          "key": "CLIVE-105",
          "title": "Return a reset contract when incident replay history expired",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 135,
          "phaseId": "replay",
          "dependsOn": [
            "CLIVE-104"
          ],
          "scenario": "Old clients request a cursor outside retention and appear current with missing changes. Make replay expiry explicit.",
          "acceptanceCriteria": [
            "Expired cursor requests fresh snapshot",
            "Client clears old cursor",
            "Reset has an observable reason"
          ],
          "implementationNotes": [
            "Do not silently start at the newest event."
          ],
          "verification": [
            "Resume retained cursor",
            "Resume expired cursor"
          ],
          "deliverables": [
            "Replay reset contract"
          ],
          "rollout": "Require full reload if reset handling fails.",
          "skills": [
            "Protocol design",
            "Retention"
          ],
          "fieldMix": [
            {
              "field": "API design",
              "percentage": 50
            },
            {
              "field": "Real-time systems",
              "percentage": 30
            },
            {
              "field": "Storage systems",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "3637e32d-60db-4d8f-8d61-d454a6663ec6",
          "key": "CLIVE-106",
          "title": "Join incident snapshots and streams at one watermark",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 240,
          "phaseId": "replay",
          "dependsOn": [
            "CLIVE-104",
            "CLIVE-105"
          ],
          "scenario": "An update between snapshot fetch and stream connect disappears. Establish a snapshot watermark for replay.",
          "acceptanceCriteria": [
            "Snapshot declares its watermark",
            "Stream replays later events",
            "Boundary duplicates remain harmless"
          ],
          "implementationNotes": [
            "Define transaction or adapter ordering explicitly."
          ],
          "verification": [
            "Update before snapshot",
            "Update between snapshot and subscription"
          ],
          "deliverables": [
            "Snapshot-stream handoff and race cases"
          ],
          "rollout": "Use periodic full snapshots while handoff is repaired.",
          "skills": [
            "Consistency",
            "Transactions"
          ],
          "fieldMix": [
            {
              "field": "Distributed systems",
              "percentage": 50
            },
            {
              "field": "Real-time systems",
              "percentage": 30
            },
            {
              "field": "Database engineering",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "4edd6f7a-4180-42e3-b999-afb767820cf3",
          "key": "CLIVE-107",
          "title": "Reconcile local incident edits with streamed acknowledgements",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "replay",
          "dependsOn": [
            "CLIVE-103",
            "CLIVE-106"
          ],
          "scenario": "Saving an incident and receiving its stream event produces duplicate activity rows. Correlate the committed operation.",
          "acceptanceCriteria": [
            "One committed activity row appears",
            "Rejected edits remain actionable",
            "Unrelated remote events still apply"
          ],
          "implementationNotes": [
            "Do not suppress all events while saving."
          ],
          "verification": [
            "Save and receive acknowledgement",
            "Reject save while another user updates"
          ],
          "deliverables": [
            "Mutation-stream reconciliation"
          ],
          "rollout": "Remove optimistic activity until correlation is correct.",
          "skills": [
            "Optimistic UI",
            "Concurrency"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "Real-time systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "6c9c7000-5466-450a-8df9-8c6a6ce3b6e0",
          "key": "CLIVE-108",
          "title": "Bound each incident subscriber buffer",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "operation",
          "dependsOn": [
            "CLIVE-106"
          ],
          "scenario": "A slow status screen accumulates unbounded events. Cap its queue and require reset when it cannot keep up.",
          "acceptanceCriteria": [
            "Queue respects configured bound",
            "Overflow terminates with reset guidance",
            "Other subscribers remain independent"
          ],
          "implementationNotes": [
            "Never silently discard ordered events."
          ],
          "verification": [
            "Stream to healthy client",
            "Stall client beyond queue capacity"
          ],
          "deliverables": [
            "Subscriber backpressure policy"
          ],
          "rollout": "Disconnect slow subscribers and require fresh snapshots.",
          "skills": [
            "Backpressure",
            "Resource management"
          ],
          "fieldMix": [
            {
              "field": "Performance engineering",
              "percentage": 50
            },
            {
              "field": "Real-time systems",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "6ef0cabd-cc06-41fa-bda9-6b745b5d9a5b",
          "key": "CLIVE-109",
          "title": "Show incident-board freshness independently from incident status",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 105,
          "phaseId": "operation",
          "dependsOn": [
            "CLIVE-105",
            "CLIVE-108"
          ],
          "scenario": "A disconnected screen says All systems normal because incident cards retain their last values. Add transport freshness.",
          "acceptanceCriteria": [
            "Last applied time is visible",
            "Disconnect shows stale state",
            "Reconnect clears stale only after catch-up"
          ],
          "implementationNotes": [
            "Use synthetic clock values in tests."
          ],
          "verification": [
            "Disconnect resolved board",
            "Reconnect with missed open incident"
          ],
          "deliverables": [
            "Freshness banner and recovery cases"
          ],
          "rollout": "Hide aggregate healthy claim while freshness is uncertain.",
          "skills": [
            "UX",
            "Observability"
          ],
          "fieldMix": [
            {
              "field": "Frontend",
              "percentage": 60
            },
            {
              "field": "Real-time systems",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "a9e99bf2-dc69-462b-85ac-70af174b3fef",
          "key": "CLIVE-110",
          "title": "Record incident-stream recovery reasons without payload logging",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 90,
          "phaseId": "operation",
          "dependsOn": [
            "CLIVE-109"
          ],
          "scenario": "Investigating replay failures currently logs full incident descriptions. Add an allowlisted recovery event schema.",
          "acceptanceCriteria": [
            "Includes reset reason and cursor category",
            "Omits descriptions and author names",
            "Malformed IDs are bounded"
          ],
          "implementationNotes": [
            "Correlation identifiers cannot carry user text."
          ],
          "verification": [
            "Capture successful resume",
            "Reject secret-like malformed cursor"
          ],
          "deliverables": [
            "Recovery diagnostics and exclusion checks"
          ],
          "rollout": "Disable stream logging if payload fields appear.",
          "skills": [
            "Logging",
            "Data minimization"
          ],
          "fieldMix": [
            {
              "field": "Privacy engineering",
              "percentage": 60
            },
            {
              "field": "Real-time systems",
              "percentage": 20
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
