{
  "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": "59651a16-82cd-4363-984c-d4fc68ebfdf3",
      "key": "BTRIAGE",
      "title": "Incident assistant with read-only tools",
      "field": "Applied AI",
      "summary": "Draft incident summaries from authorized operational records without granting remediation authority.",
      "context": "A fictional on-call team wants an assistant that joins alerts, deployment notes, and runbooks. Incomplete telemetry and hostile log content make unsupported conclusions dangerous.",
      "stack": [
        "TypeScript",
        "AiEvaluationProvider",
        "JSON Schema"
      ],
      "prerequisites": [
        "Author synthetic alerts, deployment records, and runbooks plus deterministic tool and model doubles."
      ],
      "developerValue": "Practice constrained tool use, operational uncertainty, and traceable AI outputs.",
      "companyValue": "Produce concise incident drafts that preserve source traceability and operator control.",
      "delivery": "Deliver a local read-only prototype; it must execute no remediation and contact no external service.",
      "phases": [
        {
          "id": "inputs",
          "title": "Scope incident inputs",
          "goal": "Authorize and normalize incident records."
        },
        {
          "id": "assist",
          "title": "Build draft assistance",
          "goal": "Constrain tools, sources, and unsupported conclusions."
        },
        {
          "id": "assess",
          "title": "Assess operator usefulness",
          "goal": "Evaluate bounded behavior and safe failure handling."
        }
      ],
      "tickets": [
        {
          "id": "d6b4a496-08a5-4feb-b019-87bb57a0d1d3",
          "key": "BTRIAGE-101",
          "title": "Define a common timeline record for operational events",
          "type": "TASK",
          "priority": "MEDIUM",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "inputs",
          "dependsOn": [],
          "scenario": "Alerts and deployment records disagree about timestamp formats.",
          "acceptanceCriteria": [
            "Normalize timestamps to UTC.",
            "Preserve source identity and original timestamp.",
            "Mark missing or uncertain event times."
          ],
          "implementationNotes": [
            "Do not invent ordering for ambiguous records."
          ],
          "verification": [
            "Merge valid records in stable order.",
            "Keep equal or missing timestamps visibly uncertain."
          ],
          "deliverables": [
            "Timeline schema."
          ],
          "rollout": "Import synthetic records first; retain original source records.",
          "skills": [
            "Data modeling"
          ],
          "fieldMix": [
            {
              "field": "Data engineering",
              "percentage": 60
            },
            {
              "field": "Site reliability",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "9bc28ca4-667c-4a42-acec-d88eeaa8fc93",
          "key": "BTRIAGE-102",
          "title": "Limit incident retrieval to the caller's service grants",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "inputs",
          "dependsOn": [
            "BTRIAGE-101"
          ],
          "scenario": "A related-service lookup exposes another team's restricted incident notes.",
          "acceptanceCriteria": [
            "Scope every tool read by caller grants.",
            "Recheck access for referenced records.",
            "Return non-enumerating denial responses."
          ],
          "implementationNotes": [
            "Tool definitions cannot widen caller permissions."
          ],
          "verification": [
            "Read an authorized service timeline.",
            "Deny a cross-service record guessed by ID."
          ],
          "deliverables": [
            "Authorized tool boundary."
          ],
          "rollout": "Disable assistance when grant resolution fails.",
          "skills": [
            "Authorization",
            "Tool design"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 60
            },
            {
              "field": "Applied AI",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "85e27613-f0f6-47c8-9f6f-db3aec034f9a",
          "key": "BTRIAGE-103",
          "title": "Bound tool arguments and returned telemetry volume",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 120,
          "phaseId": "assist",
          "dependsOn": [
            "BTRIAGE-102"
          ],
          "scenario": "A broad query attempts to retrieve days of raw logs.",
          "acceptanceCriteria": [
            "Require bounded time range and record count.",
            "Reject unknown tool names and properties.",
            "Truncate with explicit completeness metadata."
          ],
          "implementationNotes": [
            "Use aggregate synthetic records instead of secret-bearing logs."
          ],
          "verification": [
            "Retrieve a bounded incident window.",
            "Reject excessive ranges and unsupported tool arguments."
          ],
          "deliverables": [
            "Tool request validator."
          ],
          "rollout": "Start with conservative limits; report incomplete context rather than expanding silently.",
          "skills": [
            "Schema validation"
          ],
          "fieldMix": [
            {
              "field": "Applied AI",
              "percentage": 50
            },
            {
              "field": "API design",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "48c3302b-6089-4fce-8639-d4fd1bbc2516",
          "key": "BTRIAGE-104",
          "title": "Keep log content from issuing new tool instructions",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "assist",
          "dependsOn": [
            "BTRIAGE-103"
          ],
          "scenario": "An error message contains text requesting privileged configuration reads.",
          "acceptanceCriteria": [
            "Treat log text as untrusted data.",
            "Allow only declared read-only tools.",
            "Validate every proposed tool call independently."
          ],
          "implementationNotes": [
            "No shell, configuration writes, or remediation tools are exposed."
          ],
          "verification": [
            "Summarize a benign failure record.",
            "Inject a privileged instruction and verify no unauthorized call occurs."
          ],
          "deliverables": [
            "Adversarial tool-use checks."
          ],
          "rollout": "Block provider output on policy failure and preserve sanitized diagnostics.",
          "skills": [
            "Prompt injection"
          ],
          "fieldMix": [
            {
              "field": "Security",
              "percentage": 50
            },
            {
              "field": "Applied AI",
              "percentage": 50
            }
          ],
          "patterns": []
        },
        {
          "id": "f0575f9d-ba8d-4899-81fb-c941027140c9",
          "key": "BTRIAGE-105",
          "title": "Require source references for incident summary statements",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "ADVANCED",
          "estimateMinutes": 180,
          "phaseId": "assist",
          "dependsOn": [
            "BTRIAGE-101",
            "BTRIAGE-103"
          ],
          "scenario": "The generated summary invents a deployment that never happened.",
          "acceptanceCriteria": [
            "Bind factual statements to retrieved source identities.",
            "Reject nonexistent and unauthorized references.",
            "Separate observations from hypotheses."
          ],
          "implementationNotes": [
            "Use AiEvaluationProvider and schema-validated structured responses."
          ],
          "verification": [
            "Accept a source-backed timeline statement.",
            "Reject invented deployments and uncited root-cause assertions."
          ],
          "deliverables": [
            "Summary validator."
          ],
          "rollout": "Render only validated drafts; return unavailable on invalid output.",
          "skills": [
            "Grounding",
            "Schema validation"
          ],
          "fieldMix": [
            {
              "field": "Applied AI",
              "percentage": 80
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "2373fe5e-d735-4cb1-a12b-aadd5f5a83b1",
          "key": "BTRIAGE-106",
          "title": "Represent competing incident hypotheses explicitly",
          "type": "STORY",
          "priority": "MEDIUM",
          "difficulty": "ADVANCED",
          "estimateMinutes": 150,
          "phaseId": "assist",
          "dependsOn": [
            "BTRIAGE-105"
          ],
          "scenario": "A latency spike follows a deployment but also overlaps a dependency outage.",
          "acceptanceCriteria": [
            "List supporting and contradicting observations per hypothesis.",
            "Avoid declaring causation from timing alone.",
            "Identify a bounded next observation for discrimination."
          ],
          "implementationNotes": [
            "Recommendations remain read-only diagnostic suggestions."
          ],
          "verification": [
            "Represent two plausible causes.",
            "Keep a hypothesis unresolved when discriminating telemetry is absent."
          ],
          "deliverables": [
            "Hypothesis draft format."
          ],
          "rollout": "Require operator review before acting on a hypothesis.",
          "skills": [
            "Incident reasoning",
            "Uncertainty"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 60
            },
            {
              "field": "Applied AI",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "3cd314df-79f9-4241-a417-4e40503cba0f",
          "key": "BTRIAGE-107",
          "title": "Cancel obsolete drafts when new incident context arrives",
          "type": "BUG",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "assist",
          "dependsOn": [
            "BTRIAGE-105"
          ],
          "scenario": "An older slow response overwrites the summary after a recovery event arrives.",
          "acceptanceCriteria": [
            "Bind drafts to context revision.",
            "Cancel or discard superseded work.",
            "Preserve the latest accepted timeline revision."
          ],
          "implementationNotes": [
            "Record provider/model/version, timeout, retries, cost, and trace safely."
          ],
          "verification": [
            "Complete the newest draft first.",
            "Resolve an older request late and reject its update."
          ],
          "deliverables": [
            "Revision-aware draft coordinator."
          ],
          "rollout": "Keep the last valid draft visible with its timestamp when refresh fails.",
          "skills": [
            "Concurrency",
            "Provider design"
          ],
          "fieldMix": [
            {
              "field": "Applied AI",
              "percentage": 60
            },
            {
              "field": "Backend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "5a958da2-eb7d-4185-8160-7ccba8c2da73",
          "key": "BTRIAGE-108",
          "title": "Prevent repeated refreshes from exhausting incident budgets",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "INTERMEDIATE",
          "estimateMinutes": 150,
          "phaseId": "assess",
          "dependsOn": [
            "BTRIAGE-107"
          ],
          "scenario": "Several operators refresh the same incident and trigger duplicate model calls.",
          "acceptanceCriteria": [
            "Coalesce identical in-flight context requests.",
            "Enforce per-incident reservation and timeout.",
            "Settle usage once per provider attempt."
          ],
          "implementationNotes": [
            "Provider failure cannot trigger unbounded retry loops."
          ],
          "verification": [
            "Share one in-flight synthetic response.",
            "Exhaust the budget and return a bounded unavailable state."
          ],
          "deliverables": [
            "Incident request budget."
          ],
          "rollout": "Default to deterministic mode; pause new refreshes when accounting is uncertain.",
          "skills": [
            "Cost controls"
          ],
          "fieldMix": [
            {
              "field": "Applied AI",
              "percentage": 60
            },
            {
              "field": "Backend",
              "percentage": 40
            }
          ],
          "patterns": []
        },
        {
          "id": "5d1d120e-4c45-43d8-a16a-02ec7f30a3c4",
          "key": "BTRIAGE-109",
          "title": "Evaluate summary utility without rewarding confident guesses",
          "type": "TASK",
          "priority": "HIGH",
          "difficulty": "EXPERT",
          "estimateMinutes": 300,
          "phaseId": "assess",
          "dependsOn": [
            "BTRIAGE-104",
            "BTRIAGE-106",
            "BTRIAGE-108"
          ],
          "scenario": "The team needs a useful assessment that does not equate fluent prose with correct incident analysis.",
          "acceptanceCriteria": [
            "Measure citation validity, omitted critical observations, and unsupported assertions separately.",
            "Include partial, contradictory, and malicious context cases.",
            "Report deterministic boundary results separately from live-model quality."
          ],
          "implementationNotes": [
            "Do not claim reduced incident duration from this local prototype."
          ],
          "verification": [
            "Detect an invented root cause.",
            "Accept a concise unresolved summary with valid diagnostic next steps."
          ],
          "deliverables": [
            "Evaluation protocol and failure report."
          ],
          "rollout": "Expand incident coverage only after reviewing unsupported-claim failures.",
          "skills": [
            "AI evaluation",
            "Incident response"
          ],
          "fieldMix": [
            {
              "field": "Applied AI",
              "percentage": 50
            },
            {
              "field": "Quality engineering",
              "percentage": 30
            },
            {
              "field": "Site reliability",
              "percentage": 20
            }
          ],
          "patterns": []
        },
        {
          "id": "ca9dd116-7a68-4a74-92d8-3755c87b856d",
          "key": "BTRIAGE-110",
          "title": "Write an operator handoff for stale or unavailable assistance",
          "type": "CHORE",
          "priority": "LOW",
          "difficulty": "FOUNDATIONAL",
          "estimateMinutes": 60,
          "phaseId": "assess",
          "dependsOn": [
            "BTRIAGE-109"
          ],
          "scenario": "Operators must continue handling incidents when the assistant is down.",
          "acceptanceCriteria": [
            "Show draft age and source window.",
            "Link the original authorized records.",
            "Document the manual timeline workflow."
          ],
          "implementationNotes": [
            "The assistant is never a dependency for incident response."
          ],
          "verification": [
            "Continue from source records during provider failure.",
            "Verify stale drafts cannot appear current."
          ],
          "deliverables": [
            "Operator fallback guide."
          ],
          "rollout": "Ship the fallback with the prototype and rehearse it locally.",
          "skills": [
            "Runbooks"
          ],
          "fieldMix": [
            {
              "field": "Site reliability",
              "percentage": 60
            },
            {
              "field": "Applied AI",
              "percentage": 40
            }
          ],
          "patterns": []
        }
      ]
    }
  ]
}
