{
  "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": "ad1d2a4c-4a0a-4163-b967-e66fda0e3ab0",
      "key": "BCALENDAR",
      "title": "Calendar availability synchronization",
      "field": "Integrations",
      "summary": "Reconcile availability and event changes across a scheduling app and a local calendar provider.",
      "context": "A fictional booking service supports consultants in multiple time zones. Recurring events, revoked access, and delayed callbacks cause missed conflicts.",
      "stack": [
        "TypeScript",
        "iCalendar",
        "HTTP"
      ],
      "prerequisites": [
        "Author synthetic calendars and a local provider double with recurrence, timezone, and access-revocation cases."
      ],
      "developerValue": "Practice temporal modeling, synchronization lifecycles, and privacy-preserving projections.",
      "companyValue": "Reduce scheduling ambiguity through explicit availability contracts and recoverable synchronization.",
      "delivery": "Deliver local availability calculations and sync behavior; send no invitations or calendar writes externally.",
      "phases": [
        {
          "id": "time",
          "title": "Define temporal semantics",
          "goal": "Model instants, zones, and recurrence."
        },
        {
          "id": "sync",
          "title": "Synchronize availability",
          "goal": "Handle event updates and provider failures."
        },
        {
          "id": "release",
          "title": "Rehearse edge cases",
          "goal": "Verify privacy, cutover, and recovery."
        }
      ],
      "tickets": [
        {
          "id": "62dacf22-0cf9-45d2-9a55-afa5c7c606aa",
          "key": "BCALENDAR-101",
          "title": "Distinguish all-day events from timed calendar intervals",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "time",
          "dependsOn": [],
          "scenario": "An all-day absence becomes a twenty-four-hour UTC interval and shifts across local dates.",
          "acceptanceCriteria": [
            "Represent all-day dates separately from instants.",
            "Declare exclusive end semantics.",
            "Preserve the event's timezone context."
          ],
          "implementationNotes": [
            "Do not infer an event zone from the server timezone."
          ],
          "verification": [
            "Render a timed event and all-day absence correctly.",
            "Reject missing timezone context for ambiguous local times."
          ],
          "deliverables": [
            "Temporal data contract."
          ],
          "rollout": "Version the contract before importing calendar records.",
          "skills": [
            "Time modeling"
          ],
          "fieldMix": [
            {
              "field": "Integrations",
              "percentage": 60
            },
            {
              "field": "Backend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9cb30c75-0c33-4e96-9c10-35f15f6e15f9",
          "key": "BCALENDAR-102",
          "title": "Resolve daylight-saving gaps and repeated local times",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "time",
          "dependsOn": [
            "BCALENDAR-101"
          ],
          "scenario": "A recurring appointment lands in a nonexistent local hour during a timezone transition.",
          "acceptanceCriteria": [
            "Define explicit gap and overlap policies.",
            "Keep original local time and selected offset.",
            "Return ambiguity when policy cannot resolve the occurrence."
          ],
          "implementationNotes": [
            "Use a maintained timezone database available locally."
          ],
          "verification": [
            "Exercise a spring gap and autumn repeated hour.",
            "Reject a silently guessed offset."
          ],
          "deliverables": [
            "Timezone resolution tests."
          ],
          "rollout": "Keep affected appointments unresolved until policy is applied.",
          "skills": [
            "Time zones"
          ],
          "fieldMix": [
            {
              "field": "Backend",
              "percentage": 60
            },
            {
              "field": "Integrations",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "5e1871f5-fbed-4eee-b3d6-e74066dfeebd",
          "key": "BCALENDAR-103",
          "title": "Expand recurrence within a bounded availability window",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "time",
          "dependsOn": [
            "BCALENDAR-102"
          ],
          "scenario": "An unbounded recurrence rule exhausts the availability request.",
          "acceptanceCriteria": [
            "Require finite query start and end.",
            "Limit emitted occurrences and processing work.",
            "Honor exclusions and changed single occurrences."
          ],
          "implementationNotes": [
            "Reject unsupported recurrence forms explicitly."
          ],
          "verification": [
            "Expand a weekly rule with an exception.",
            "Bound an excessive recurrence and reject unsupported syntax."
          ],
          "deliverables": [
            "Bounded recurrence engine."
          ],
          "rollout": "Start with declared supported rules; preserve unsupported events as unavailable context.",
          "skills": [
            "Recurrence",
            "Resource bounds"
          ],
          "fieldMix": [
            {
              "field": "Integrations",
              "percentage": 40
            },
            {
              "field": "Performance engineering",
              "percentage": 40
            },
            {
              "field": "Backend",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "78089c42-aaa5-4b14-8cd2-8b6714f691fe",
          "key": "BCALENDAR-104",
          "title": "Apply event revisions without reviving cancelled occurrences",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "sync",
          "dependsOn": [
            "BCALENDAR-103"
          ],
          "scenario": "An old series update recreates a cancelled individual appointment.",
          "acceptanceCriteria": [
            "Track series and occurrence revisions separately.",
            "Preserve cancellation tombstones.",
            "Ignore stale updates with an observable reason."
          ],
          "implementationNotes": [
            "Arrival order is not event version authority."
          ],
          "verification": [
            "Update one occurrence in a series.",
            "Replay an older series update after cancellation."
          ],
          "deliverables": [
            "Revision-aware event importer."
          ],
          "rollout": "Adopt on synthetic calendars first; reconcile before enabling booking decisions.",
          "skills": [
            "Event ordering"
          ],
          "fieldMix": [
            {
              "field": "Distributed systems",
              "percentage": 50
            },
            {
              "field": "Integrations",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "867f52a6-2787-491a-87c8-ad055a0d5980",
          "key": "BCALENDAR-105",
          "title": "Use incremental sync tokens without losing full-resync coverage",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "sync",
          "dependsOn": [
            "BCALENDAR-104"
          ],
          "scenario": "The provider invalidates a sync token, and the app interprets it as an empty calendar.",
          "acceptanceCriteria": [
            "Distinguish token invalidation from no changes.",
            "Start a bounded full sync on invalidation.",
            "Keep existing availability marked stale until replacement completes."
          ],
          "implementationNotes": [
            "Never clear events because a provider request failed."
          ],
          "verification": [
            "Apply a normal incremental page.",
            "Invalidate the token and preserve stale records during recovery."
          ],
          "deliverables": [
            "Sync-token recovery."
          ],
          "rollout": "Pause definitive availability claims while full sync is incomplete.",
          "skills": [
            "Synchronization"
          ],
          "fieldMix": [
            {
              "field": "Integrations",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9a37b006-7826-4fd0-bf6e-ee6b851125e8",
          "key": "BCALENDAR-106",
          "title": "Project busy intervals without exposing event descriptions",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "sync",
          "dependsOn": [
            "BCALENDAR-104"
          ],
          "scenario": "Availability responses leak private appointment titles to bookers.",
          "acceptanceCriteria": [
            "Expose only necessary busy intervals.",
            "Scope calendars by current access grants.",
            "Exclude titles, attendees, and notes from public projections."
          ],
          "implementationNotes": [
            "Private provider fields remain outside scheduling responses."
          ],
          "verification": [
            "Compute availability from authorized events.",
            "Seed sensitive markers and verify they never appear in outputs."
          ],
          "deliverables": [
            "Privacy-preserving availability projection."
          ],
          "rollout": "Replace detailed projections before public availability is enabled.",
          "skills": [
            "Privacy",
            "API projections"
          ],
          "fieldMix": [
            {
              "field": "Privacy engineering",
              "percentage": 60
            },
            {
              "field": "API design",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "47fe39d9-47d3-465e-9042-cb7dadb918a1",
          "key": "BCALENDAR-107",
          "title": "Stop provider calls immediately after access revocation",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "sync",
          "dependsOn": [
            "BCALENDAR-105",
            "BCALENDAR-106"
          ],
          "scenario": "Revoked calendars remain cached and continue receiving background refreshes.",
          "acceptanceCriteria": [
            "Invalidate active grants and queued refresh authority.",
            "Suppress cached private availability after revocation.",
            "Make reconnect an explicit new authorization flow."
          ],
          "implementationNotes": [
            "Do not retry authorization failures as transient errors."
          ],
          "verification": [
            "Refresh an authorized calendar.",
            "Revoke access mid-queue and verify no further authorized reads occur."
          ],
          "deliverables": [
            "Revocation handling."
          ],
          "rollout": "Fail closed on uncertain grants; retain only allowed operational metadata.",
          "skills": [
            "Authorization",
            "Lifecycle"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 50
            },
            {
              "field": "Privacy engineering",
              "percentage": 30
            },
            {
              "field": "Integrations",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "cbef8f7e-533d-4d35-af78-6248144aa474",
          "key": "BCALENDAR-108",
          "title": "Detect overlapping booking attempts against one availability revision",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 210,
          "phaseId": "release",
          "dependsOn": [
            "BCALENDAR-106",
            "BCALENDAR-107"
          ],
          "scenario": "Two bookers see the same open slot before either reservation is committed.",
          "acceptanceCriteria": [
            "Bind booking checks to a declared availability revision.",
            "Serialize or atomically reject overlapping local reservations.",
            "Represent external confirmation as pending when unknown."
          ],
          "implementationNotes": [
            "Use a local provider double; create no real events."
          ],
          "verification": [
            "Race two bookings for one slot.",
            "Change provider availability during booking and expose the conflict."
          ],
          "deliverables": [
            "Booking consistency checks."
          ],
          "rollout": "Keep short local reservations; reconcile unknown external outcomes before releasing them.",
          "skills": [
            "Concurrency",
            "Scheduling"
          ],
          "fieldMix": [
            {
              "field": "Database engineering",
              "percentage": 40
            },
            {
              "field": "Integrations",
              "percentage": 30
            },
            {
              "field": "Distributed systems",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "8a13fb19-bb75-438d-9f93-6805759ac562",
          "key": "BCALENDAR-109",
          "title": "Assess polling versus callbacks for calendar freshness",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "release",
          "dependsOn": [
            "BCALENDAR-105",
            "BCALENDAR-108"
          ],
          "scenario": "The provider's callbacks are delayed, but frequent polling consumes the request budget.",
          "acceptanceCriteria": [
            "Compare bounded polling and callback-assisted approaches.",
            "Declare acceptable staleness and request-budget assumptions.",
            "Rehearse dropped callbacks, duplicates, and provider outages."
          ],
          "implementationNotes": [
            "Local measurements do not establish a live provider's delivery guarantees."
          ],
          "verification": [
            "Recover a missed callback through polling.",
            "Exhaust the budget and show stale availability explicitly."
          ],
          "deliverables": [
            "Freshness tradeoff assessment."
          ],
          "rollout": "Adopt a conservative refresh policy with visible age and a manual recovery path.",
          "skills": [
            "System tradeoffs",
            "Integration reliability"
          ],
          "fieldMix": [
            {
              "field": "System design",
              "percentage": 40
            },
            {
              "field": "Integrations",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 30
            }
          ],
          "patterns": []
        },
        {
          "id": "193ed6f0-b1ad-454d-8e0c-934918b78f7c",
          "key": "BCALENDAR-110",
          "title": "Write the calendar recovery checklist for invalid sync state",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "release",
          "dependsOn": [
            "BCALENDAR-109"
          ],
          "scenario": "Support needs to recover a calendar without deleting local reservations.",
          "acceptanceCriteria": [
            "Identify the calendar, grant, and sync revision.",
            "Show safe resync and status commands.",
            "Preserve local reservations while replacing imported events."
          ],
          "implementationNotes": [
            "No direct lifecycle-state edits."
          ],
          "verification": [
            "Recover an invalid token using the guide.",
            "Reject recovery for a revoked grant."
          ],
          "deliverables": [
            "Calendar support runbook."
          ],
          "rollout": "Rehearse against synthetic calendars before enabling a support action.",
          "skills": [
            "Runbooks"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 60
            },
            {
              "field": "Integrations",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
