Emit human-readable domain label on review findings

Add an optional findings[].domain field to the DO review output contract so
each finding carries its own human-readable review-domain display label. Leaf
review skills set it on every finding they emit; the al-code-review super-skill
copies it verbatim during rollup and sets it to "Agent" for its own
cross-cutting agent findings. This decouples consumers from BCQuality's domain
taxonomy: they render finding.domain verbatim instead of maintaining a
sub-skill-id -> label map.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Jesper Schulz-Wedde 2026-06-25 16:42:05 +02:00
parent 8904ce583b
commit 2d54a116a9
13 changed files with 70 additions and 39 deletions

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Breaking Changes"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/breaking-changes/do-not-change-published-procedure-signatures.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Breaking Changes"
},
{
"id": "microsoft/knowledge/breaking-changes/choose-access-modifiers-deliberately.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/breaking-changes/choose-access-modifiers-deliberately.md" }
],
"confidence": "medium"
"confidence": "medium",
"domain": "Breaking Changes"
}
],
"suppressed": []

View file

@ -72,7 +72,7 @@ For each sub-skill in the worklist, executed one at a time per the discipline ab
1. Invoke the sub-skill with the orchestrator's inputs, passing only the subset each sub-skill declares in its `inputs`.
2. Capture the sub-skill's complete findings-report verbatim and append it to `sub-results`.
3. If the sub-skill's `outcome` is `failed`, stop here for this sub-skill: its findings are not reliable per the DO contract and MUST NOT be copied into the super-skill's top-level `findings[]` or counted in `summary.counts`.
4. Otherwise, append each entry from the sub-skill's `findings[]` to the super-skill's top-level `findings[]`, setting `from-sub-skill` to the sub-skill's `skill.id`. For non-citation findings (those whose `id` is a skill-defined slug rather than a reference path), prefix `id` with `<from-sub-skill>:` to prevent collisions across sub-skills. Other finding fields are preserved.
4. Otherwise, append each entry from the sub-skill's `findings[]` to the super-skill's top-level `findings[]`, setting `from-sub-skill` to the sub-skill's `skill.id` and copying each finding's `domain` field verbatim (preserve it unchanged). For non-citation findings (those whose `id` is a skill-defined slug rather than a reference path), prefix `id` with `<from-sub-skill>:` to prevent collisions across sub-skills. Other finding fields are preserved.
### Agent self-review pass
@ -90,6 +90,7 @@ For every candidate the agent identifies in this pass:
- Otherwise the candidate has no BCQuality coverage; emit it as a super-skill agent finding.
2. **Emit agent finding.** Per DO's *Agent findings* rules:
- `from-sub-skill: "agent"` (the super-skill itself produced it)
- `domain: "Agent"` (the display label for super-skill cross-cutting findings)
- `references: []`
- `id` is a skill-defined slug prefixed with `agent:` (for example, `agent:missing-error-handling-on-http-call`).
- `confidence` capped at `medium`.
@ -139,7 +140,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
{ "path": "microsoft/knowledge/performance/filter-before-find.md" }
],
"confidence": "high",
"from-sub-skill": "al-performance-review"
"from-sub-skill": "al-performance-review",
"domain": "Performance"
},
{
"id": "community/knowledge/performance/call-setloadfields-before-filters.md",
@ -153,7 +155,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
{ "path": "community/knowledge/performance/call-setloadfields-before-filters.md" }
],
"confidence": "high",
"from-sub-skill": "al-performance-review"
"from-sub-skill": "al-performance-review",
"domain": "Performance"
},
{
"id": "microsoft/knowledge/security/use-secrettext-for-credentials.md",
@ -168,7 +171,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
{ "path": "microsoft/knowledge/security/use-secrettext-for-credentials.md" }
],
"confidence": "high",
"from-sub-skill": "al-security-review"
"from-sub-skill": "al-security-review",
"domain": "Security"
},
{
"id": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md",
@ -182,7 +186,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
{ "path": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md" }
],
"confidence": "medium",
"from-sub-skill": "al-security-review"
"from-sub-skill": "al-security-review",
"domain": "Security"
},
{
"id": "agent:missing-error-handling-on-http-client",
@ -195,7 +200,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
},
"references": [],
"confidence": "medium",
"from-sub-skill": "agent"
"from-sub-skill": "agent",
"domain": "Agent"
}
],
"suppressed": [],
@ -220,7 +226,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
"references": [
{ "path": "microsoft/knowledge/performance/filter-before-find.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Performance"
},
{
"id": "community/knowledge/performance/call-setloadfields-before-filters.md",
@ -233,7 +240,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
"references": [
{ "path": "community/knowledge/performance/call-setloadfields-before-filters.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Performance"
}
],
"suppressed": []
@ -258,7 +266,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
"references": [
{ "path": "microsoft/knowledge/security/use-secrettext-for-credentials.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Security"
},
{
"id": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md",
@ -271,7 +280,8 @@ Output conforms to the DO output contract, extended with `sub-results` and `skip
"references": [
{ "path": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md" }
],
"confidence": "medium"
"confidence": "medium",
"domain": "Security"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Error Handling"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/error-handling/prefer-errorinfo-for-actionable-errors.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Error Handling"
},
{
"id": "microsoft/knowledge/error-handling/errortype-internal-vs-client-for-diagnostics.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/error-handling/errortype-internal-vs-client-for-diagnostics.md" }
],
"confidence": "medium"
"confidence": "medium",
"domain": "Error Handling"
}
],
"suppressed": []

View file

@ -94,7 +94,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Events"`. A populated example:
```json
{
@ -117,7 +117,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/events/publish-thin-onbefore-onafter-integration-events.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Events"
},
{
"id": "microsoft/knowledge/events/use-ishandled-to-make-base-behaviour-overridable.md",
@ -130,7 +131,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/events/use-ishandled-to-make-base-behaviour-overridable.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Events"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Interfaces"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/interfaces/prefer-interface-over-case-branching.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Interfaces"
},
{
"id": "microsoft/knowledge/interfaces/set-defaultimplementation-on-enum.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/interfaces/set-defaultimplementation-on-enum.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Interfaces"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Performance"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/performance/filter-before-find.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Performance"
},
{
"id": "community/knowledge/performance/call-setloadfields-before-filters.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "community/knowledge/performance/call-setloadfields-before-filters.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Performance"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Privacy"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/privacy/strsubstno-prebuild-breaks-error-telemetry-classification.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Privacy"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Security"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/security/use-secrettext-for-credentials.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Security"
},
{
"id": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/security/never-hardcode-secrets-in-al.md" }
],
"confidence": "medium"
"confidence": "medium",
"domain": "Security"
}
],
"suppressed": []

View file

@ -75,7 +75,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Style"`. A populated example:
```json
{
@ -97,7 +97,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/style/apply-approved-label-suffixes.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Style"
}
],
"suppressed": []

View file

@ -75,7 +75,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Accessibility"`. A populated example:
```json
{
@ -97,7 +97,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/ui/field-tooltips-start-with-specifies-and-end-with-period.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Accessibility"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Upgrade"`. A populated example:
```json
{
@ -99,7 +99,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/upgrade/enum-changes-must-be-additive-at-the-end.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Upgrade"
}
],
"suppressed": []

View file

@ -77,7 +77,7 @@ Outcome selection:
## Output
Output conforms to the DO output contract. A populated example:
Output conforms to the DO output contract. Every finding this skill emits MUST set `findings[].domain` to `"Web Services"`. A populated example:
```json
{
@ -100,7 +100,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/web-services/set-required-api-page-properties.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Web Services"
},
{
"id": "microsoft/knowledge/web-services/expose-systemid-as-the-api-key.md",
@ -113,7 +114,8 @@ Output conforms to the DO output contract. A populated example:
"references": [
{ "path": "microsoft/knowledge/web-services/expose-systemid-as-the-api-key.md" }
],
"confidence": "high"
"confidence": "high",
"domain": "Web Services"
}
],
"suppressed": []