TenantAtlas/specs/156-operator-outcome-taxonomy/contracts/operator-taxonomy-entry.schema.json
ahmido 3c3daae405 feat: normalize operator outcome taxonomy (#186)
## Summary
- introduce a shared operator outcome taxonomy with semantic axes, severity bands, and next-action policy
- apply the taxonomy to operations, evidence/review completeness, baseline semantics, and restore semantics
- harden badge rendering, tenant-safe filtering/search behavior, and operator-facing summary/notification wording
- add the spec kit artifacts, reference documentation, and regression coverage for diagnostic-vs-primary state handling

## Testing
- focused Pest coverage for taxonomy registry and badge guardrails
- operations presentation and notification tests
- evidence, baseline, restore, and tenant-scope regression tests

## Notes
- Livewire v4.0+ compliance is preserved in the existing Filament v5 stack
- panel provider registration remains unchanged in bootstrap/providers.php
- no new globally searchable resource was added; adopted resources remain tenant-safe and out of global search where required
- no new destructive action family was introduced; existing actions keep their current authorization and confirmation behavior
- no new frontend asset strategy was introduced; existing deploy flow with filament:assets remains unchanged

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #186
2026-03-22 12:13:34 +00:00

188 lines
3.8 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://tenantpilot.local/contracts/operator-taxonomy-entry.schema.json",
"title": "Operator Taxonomy Entry",
"description": "Documentation-first schema for one taxonomy-backed operator state mapping. The severity enum matches the runtime Filament badge color band.",
"type": "object",
"additionalProperties": false,
"required": [
"domain",
"raw_value",
"axis",
"primary_label",
"severity",
"classification_level",
"next_action_policy",
"legacy_aliases",
"notes"
],
"properties": {
"domain": {
"type": "string",
"minLength": 1,
"examples": [
"restore_result_status"
]
},
"raw_value": {
"type": "string",
"minLength": 1,
"examples": [
"manual_required"
]
},
"axis": {
"type": "string",
"enum": [
"execution_lifecycle",
"execution_outcome",
"item_result",
"data_coverage",
"evidence_depth",
"product_support_maturity",
"data_freshness",
"operator_actionability",
"publication_readiness",
"governance_deviation"
],
"examples": [
"operator_actionability"
]
},
"primary_label": {
"type": "string",
"minLength": 1,
"examples": [
"Manual follow-up needed"
]
},
"severity": {
"type": "string",
"description": "Operator-facing severity band, mapped to the Filament badge color used at runtime.",
"enum": [
"gray",
"info",
"success",
"warning",
"danger",
"primary"
],
"examples": [
"warning"
]
},
"classification_level": {
"type": "string",
"enum": [
"primary",
"diagnostic"
],
"examples": [
"primary"
]
},
"next_action_policy": {
"type": "string",
"enum": [
"required",
"optional",
"none"
],
"examples": [
"required"
]
},
"legacy_aliases": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"examples": [
[
"Manual required"
]
]
},
"diagnostic_label": {
"type": [
"string",
"null"
],
"examples": [
null
]
},
"notes": {
"type": "string",
"minLength": 1,
"examples": [
"The operator must handle this item manually."
]
}
},
"allOf": [
{
"if": {
"properties": {
"classification_level": {
"const": "diagnostic"
}
}
},
"then": {
"properties": {
"severity": {
"enum": [
"gray",
"info",
"primary"
]
}
}
}
},
{
"if": {
"properties": {
"severity": {
"enum": [
"warning",
"danger"
]
},
"classification_level": {
"const": "primary"
}
}
},
"then": {
"properties": {
"next_action_policy": {
"enum": [
"required",
"optional"
]
}
}
}
}
],
"examples": [
{
"domain": "restore_result_status",
"raw_value": "manual_required",
"axis": "operator_actionability",
"primary_label": "Manual follow-up needed",
"severity": "warning",
"classification_level": "primary",
"next_action_policy": "required",
"legacy_aliases": [
"Manual required"
],
"diagnostic_label": null,
"notes": "The operator must handle this item manually."
}
]
}