Back to Skiasharp

Triage Schema Quick Reference

.agents/skills/issue-triage/references/schema-cheatsheet.md

3.119.48.8 KB
Original Source

Triage Schema Quick Reference

Read this BEFORE generating JSON. Full schema: references/triage-schema.json.

Required Top-Level Fields

FieldTypeRequired Sub-fields
metaobjectschemaVersion ("1.0"), number (int), repo ("mono/SkiaSharp"), analyzedAt (ISO 8601)
summarystring— (one-sentence description)
classificationobjecttype + area (see below)
evidenceobject— (no sub-fields required, but include what's relevant)
analysisobjectsummary (string, required)
outputobjectactionability + actions (see below)

Classification (required sub-objects)

json
"classification": {
  "type": { "value": "<classifiedType>", "confidence": 0.0-1.0 },
  "area": { "value": "<classifiedArea>", "confidence": 0.0-1.0 },
  "platforms": ["<classifiedPlatform>", ...],   // optional, plain strings NOT objects
  "backends": ["<classifiedBackend>", ...],     // optional, plain strings NOT objects
  "tenets": ["<classifiedTenet>", ...],         // optional, plain strings NOT objects
  "partner": "<classifiedPartner>"              // optional, plain string NOT object
}

⚠️ platforms, backends, tenets are plain string arrays — NOT {value, confidence} objects.

Evidence & Analysis Fields

FieldStructure / Notes
evidence.bugSignals{ severity, regressionClaimed, errorType, errorMessage, stackTrace, reproQuality, targetFrameworks }. Include ONLY for bugs.
evidence.reproEvidenceExtract ALL screenshots, attachments, code snippets, steps. Preserve every URL.
evidence.versionAnalysis{ mentionedVersions[], workedIn, brokeIn, currentRelevance, relevanceReason }. Include when version info is mentioned.
evidence.regression{ isRegression, confidence, reason, workedInVersion, brokeInVersion }. Include if regression signals exist.
evidence.fixStatus{ likelyFixed, confidence, reason, relatedPRs, relatedCommits, fixedInVersion }. Include if fix evidence exists.
analysis.codeInvestigationArray of { file, finding, relevance, lines? }. MANDATORY: At least one for bugs, two for close-* actions.
analysis.keySignalsArray of { text, source, interpretation? }. Structured evidence quotes.
analysis.rationaleSingle string summarizing key classification decisions.
analysis.workaroundsArray of workaround strings found during triage.
analysis.nextQuestionsArray of open questions for repro/fix to investigate.
analysis.errorFingerprintNormalized error fingerprint for cross-issue dedup (optional).
analysis.resolution{ hypothesis?, proposals[], recommendedProposal, recommendedReason }. Omit for duplicates/abandoned.

Enum Values

EnumValues
classifiedTypetype/bug, type/feature-request, type/question, type/enhancement, type/documentation
classifiedAreaarea/Build, area/Docs, area/HarfBuzzSharp, area/libHarfBuzzSharp.native, area/libSkiaSharp.native, area/SkiaSharp, area/SkiaSharp.HarfBuzz, area/SkiaSharp.Views, area/SkiaSharp.Views.Blazor, area/SkiaSharp.Views.Forms, area/SkiaSharp.Views.Maui, area/SkiaSharp.Views.Uno, area/SkiaSharp.Workbooks
classifiedPlatformos/Android, os/iOS, os/macOS, os/Linux, os/Windows-Classic, os/Windows-WinUI, os/Windows-Universal-UWP, os/Windows-Nano-Server, os/WASM, os/Tizen, os/tvOS, os/watchOS
classifiedBackendbackend/OpenGL, backend/Metal, backend/Vulkan, backend/Raster, backend/Direct3D, backend/PDF, backend/SVG, backend/XPS
suggestedActionneeds-investigation, close-as-fixed, close-as-by-design, close-with-docs, close-as-duplicate, convert-to-discussion, request-info, keep-open
errorTypecrash, exception, wrong-output, missing-output, performance, build-error, memory-leak, platform-specific, other
severitycritical, high, medium, low

Severity rubric (bugs only)

SeverityCriteria
criticalCrash/data loss affecting most users, no workaround
highCrash or memory corruption possible, narrow trigger or workaround exists
mediumWrong output, degraded behavior, workaround available
lowCosmetic, edge case, minor inconvenience

| reproQuality | complete, partial, none | | currentRelevance | likely, unlikely, unknown | | relevance (codeInvestigation) | direct, related, context | | category (proposals) | workaround, fix, alternative, investigation | | validated (proposals) | untested, yes, no | | suggestedReproPlatform | linux, macos, windows | | actionType | update-labels, add-comment, close-issue, convert-to-discussion, link-related, link-duplicate, set-milestone |

Choosing suggestedAction by issue type

TypeCommon suggestedActionWhen
type/bugneeds-investigationRepro code provided, bug seems real
type/bugrequest-infoMissing repro, vague description
type/bugclose-as-by-designBehavior is correct but confusing
type/enhancementneeds-investigationWell-specified, has clear scope
type/enhancementkeep-openValid but low priority / needs design
type/feature-requestneeds-investigationClear request with implementation path
type/feature-requestkeep-openValid but requires design discussion
type/questionclose-with-docsAnswer exists in docs
type/questionconvert-to-discussionBetter suited for community Q&A
type/documentationneeds-investigationDocs are missing or wrong

Distinguishing request-info vs convert-to-discussion:

  • Use request-info when there IS a signal worth following up (regression claim, partial repro, plausible bug) — give the reporter a chance to provide details.
  • Use convert-to-discussion when there is NO actionable signal (empty template, "how do I?" question, vague feature wish).

Empty-template heuristic: If the code/repro sections contain only template placeholders or are completely empty, use request-info regardless of type classification. A regression claim in the version fields upgrades priority even with sparse content.

Output (required)

json
"output": {
  "actionability": {
    "suggestedAction": "<suggestedAction enum>",
    "confidence": 0.0-1.0,
    "reason": "Why this action",
    "suggestedReproPlatform": "linux|macos|windows (optional)"
  },
  "missingInfo": ["What info is needed from reporter"],
  "actions": [
    { "type": "<actionType>", "description": "...", "risk": "low|medium|high", "confidence": 0.0-1.0, ... }
  ]
}

missingInfo is optional — include when reporter needs to provide more details (pair with request-info action).

Action Types & Required Fields

TypeRiskRequired Fields
update-labelslowlabels (array of label strings to apply)
add-commentdynamic (see below)comment (markdown string). See response-guidelines.md.
close-issuemediumstateReason (completed or not_planned)
link-relatedlowlinkedIssue (integer issue number)
link-duplicatemediumlinkedIssue (integer issue number)
convert-to-discussionhighcategory (discussion category name)
set-milestonelowmilestone (milestone title)

add-comment Risk Calculation

Risk for add-comment is computed from the comment's content and the action's confidence score:

ConditionRiskRationale
Factual only (repro findings, version matrix, link references) AND confidence ≥ 0.85lowReporting observed facts — minimal reputation exposure
Includes workaround or technical suggestion AND confidence ≥ 0.85mediumAdvice could be wrong, but evidence is strong
Suggests closing, rejects the issue, or states "by-design" (any confidence)highTelling a reporter their issue isn't valid always needs human review
Any content AND confidence < 0.70highNot confident enough to speak for the maintainer
Default / everything elsemedium

Common Mistakes

  1. platforms/backends as objects — They're plain string arrays, NOT {value, confidence}
  2. Missing meta.analyzedAt — Must be ISO 8601: "2026-02-19T12:00:00Z"
  3. Extra fieldsadditionalProperties: false at every level. No extra keys allowed.
  4. Null values — Omit optional fields entirely. Never set to null.
  5. Absolute paths — Redact /Users/name/$HOME/, /tmp/... → relative descriptions.
  6. bugSignals without type/bug — Only include when classification.type.value is "type/bug".