changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "candidateOnlyKeys": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys kept alive only by the bare-candidate net: a dotted string somewhere shares their name, but nothing a frontend calls a usage references them. Not orphans, but where dead references hide.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "candidateOnlyNote": {
+ "description": "How to read the candidate-only keys. Present alongside them.",
+ "type": "string"
+ },
+ "declaredNamespaceNote": {
+ "description": "How to read the declared namespaces. Present alongside them.",
+ "type": "string"
+ },
+ "declaredNamespaces": {
+ "description": "Every declared namespace with the keys it covers — the keys this scan will not report. Present when the config declares any.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "matchedKeys": {
+ "description": "Keys of the checked layers this pattern covers. Empty means the declaration is stale.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "pattern": {
+ "description": "The declaredNamespaces pattern from the project config, e.g. \"views.defaults.**\".",
+ "type": "string"
+ },
+ "reason": {
+ "description": "What keeps these keys alive, as the config declares it.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "pattern",
+ "reason",
+ "matchedKeys"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "dynamicKeyWarning": {
+ "description": "Present when dynamic key expressions were found, which is when the orphan list is a candidate list rather than a verdict.",
+ "type": "string"
+ },
+ "dynamicKeys": {
+ "description": "Dynamic key expressions found in source, with their call sites.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "expression": {
+ "description": "The key expression as written in source, e.g. \"`errors.${code}`\".",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file, relative to the project directory. Absent for context-free bare candidates, which have no single call site.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number in that file. Absent with file.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "expression"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "linkedNote": {
+ "description": "Why keys linked with @: from another message's value are not orphans. Present when any is.",
+ "type": "string"
+ },
+ "misplacedUsageNote": {
+ "description": "What to do about the misplaced usages. Present alongside them.",
+ "type": "string"
+ },
+ "misplacedUsages": {
+ "description": "Keys referenced only from apps that do not consume the owning layer. Reported instead of being called orphans, and never deleted.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "description": "Dot-path key referenced only from outside its layer's consumption scope.",
+ "type": "string"
+ },
+ "layer": {
+ "description": "Layer the key is defined in.",
+ "type": "string"
+ },
+ "usingApps": {
+ "description": "Scan units (apps or layers) that reference it without consuming that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "key",
+ "layer",
+ "usingApps"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "orphanKeys": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys no source code of a consuming app references. The only keys remove ever deletes.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "summary": {
+ "additionalProperties": false,
+ "description": "What the scan covered and what it found. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "candidateOnlyCount": {
+ "description": "Keys kept alive only by the bare-candidate net.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "declaredCount": {
+ "description": "Keys withheld from the orphan list by a declaredNamespaces entry.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "dirsScanned": {
+ "description": "Directories the source scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dynamicMatchedCount": {
+ "description": "Keys kept alive by a dynamic key expression rather than a literal call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesDeclined": {
+ "description": "Files a syntax frontend declined; pattern matching read them instead.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "ignoredCount": {
+ "description": "Keys excluded by an orphanScan ignorePattern.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "layersChecked": {
+ "description": "Layer names the scan covered.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "linkedCount": {
+ "description": "Keys withheld because another message's value links to them with @:. Protected in every layer, never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "locale": {
+ "description": "Locale the translation keys were read from.",
+ "type": "string"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "misplacedCount": {
+ "description": "Keys used only from apps that do not consume their layer. Never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "orphanCount": {
+ "description": "Keys nothing references. The counter the orphan gate reads.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "scanScope": {
+ "additionalProperties": {
+ "description": "Directories that layer was checked against.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Each layer's effective scope: the code of the apps that consume it.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "totalKeys": {
+ "description": "Translation keys of the checked layers.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uncertainCount": {
+ "description": "Keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "usedCount": {
+ "description": "Keys with usage evidence in a consuming app.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "totalKeys",
+ "orphanCount",
+ "filesScanned"
+ ],
+ "type": "object"
+ },
+ "uncertainKeys": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "unresolvedKeyWarnings": {
+ "description": "Dynamic expressions that could not be resolved to concrete keys, each with an ignore pattern that would cover it.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "callee": {
+ "description": "The translation function the expression was passed to, e.g. \"t\" or \"$t\".",
+ "type": "string"
+ },
+ "expression": {
+ "description": "The dynamic key expression that could not be resolved to concrete keys.",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file, relative to the project directory.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number of the call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "suggestedIgnorePattern": {
+ "description": "A key glob for orphanScan.ignorePatterns that would cover this expression, when one can be derived.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "expression",
+ "file",
+ "line",
+ "callee"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "orphanKeys",
+ "summary"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "declaredNamespaceNote": {
+ "description": "How to read the declared namespaces. Present alongside them.",
+ "type": "string"
+ },
+ "declaredNamespaces": {
+ "description": "Every declared namespace with the keys it covers — the keys this scan will not report. Present when the config declares any.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "matchedKeys": {
+ "description": "Keys of the checked layers this pattern covers. Empty means the declaration is stale.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "pattern": {
+ "description": "The declaredNamespaces pattern from the project config, e.g. \"views.defaults.**\".",
+ "type": "string"
+ },
+ "reason": {
+ "description": "What keeps these keys alive, as the config declares it.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "pattern",
+ "reason",
+ "matchedKeys"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "dynamicKeyWarning": {
+ "description": "Present when dynamic key expressions were found, which is when the orphan list is a candidate list rather than a verdict.",
+ "type": "string"
+ },
+ "dynamicKeys": {
+ "description": "Dynamic key expressions found in source, with their call sites.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "expression": {
+ "description": "The key expression as written in source, e.g. \"`errors.${code}`\".",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file, relative to the project directory. Absent for context-free bare candidates, which have no single call site.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number in that file. Absent with file.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "expression"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "misplacedUsageNote": {
+ "description": "What to do about the misplaced usages. Present alongside them.",
+ "type": "string"
+ },
+ "misplacedUsages": {
+ "description": "Keys referenced only from apps that do not consume the owning layer. Reported instead of being called orphans, and never deleted.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "description": "Dot-path key referenced only from outside its layer's consumption scope.",
+ "type": "string"
+ },
+ "layer": {
+ "description": "Layer the key is defined in.",
+ "type": "string"
+ },
+ "usingApps": {
+ "description": "Scan units (apps or layers) that reference it without consuming that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "key",
+ "layer",
+ "usingApps"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "orphanKeys": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys that were found unreferenced. Present on a dry run.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "removed": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys deleted from every locale file of that layer.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "summary": {
+ "additionalProperties": false,
+ "description": "What the removal covered and what it deleted. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "declaredCount": {
+ "description": "Keys withheld from the orphan list by a declaredNamespaces entry.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "dirsScanned": {
+ "description": "Directories the source scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dryRun": {
+ "description": "True when nothing was deleted because a preview was asked for.",
+ "type": "boolean"
+ },
+ "dynamicMatchedCount": {
+ "description": "Keys kept alive by a dynamic key expression rather than a literal call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesWritten": {
+ "description": "Locale files changed on disk.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "ignoredCount": {
+ "description": "Keys excluded by an orphanScan ignorePattern.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "layersChecked": {
+ "description": "Layer names the scan covered.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "linkedCount": {
+ "description": "Keys withheld because another message's value links to them with @:. Protected in every layer, never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "locale": {
+ "description": "Locale the translation keys were read from.",
+ "type": "string"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "misplacedCount": {
+ "description": "Keys used only from apps that do not consume their layer. Never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "orphanCount": {
+ "description": "Keys nothing references. The counter the orphan gate reads.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "remainingCount": {
+ "description": "Keys left in the layer after the removal.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "removedCount": {
+ "description": "Keys deleted from their layer.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "scanScope": {
+ "additionalProperties": {
+ "description": "Directories that layer was checked against.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Each layer's effective scope: the code of the apps that consume it.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "totalKeys": {
+ "description": "Translation keys of the checked layers.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uncertainCount": {
+ "description": "Keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "usedCount": {
+ "description": "Keys with usage evidence in a consuming app.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "totalKeys"
+ ],
+ "type": "object"
+ },
+ "uncertainKeys": {
+ "additionalProperties": {
+ "description": "Dot-path keys of that layer.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Layer → keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "unresolvedKeyWarnings": {
+ "description": "Dynamic expressions that could not be resolved to concrete keys, each with an ignore pattern that would cover it.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "callee": {
+ "description": "The translation function the expression was passed to, e.g. \"t\" or \"$t\".",
+ "type": "string"
+ },
+ "expression": {
+ "description": "The dynamic key expression that could not be resolved to concrete keys.",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file, relative to the project directory.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number of the call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "suggestedIgnorePattern": {
+ "description": "A key glob for orphanScan.ignorePatterns that would cover this expression, when one can be derived.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "expression",
+ "file",
+ "line",
+ "callee"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "summary"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "dynamicKeys": {
+ "description": "Dynamic expressions that could reach the requested keys.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "expression": {
+ "description": "The key expression as written in source, e.g. \"`errors.${code}`\".",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file, relative to the project directory. Absent for context-free bare candidates, which have no single call site.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number in that file. Absent with file.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "expression"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "notFoundInCode": {
+ "description": "Requested keys with no reference anywhere in the scanned source.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "summary": {
+ "additionalProperties": false,
+ "description": "What the usage scan covered and what it found. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "dirsScanned": {
+ "description": "Directories the scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "filesDeclined": {
+ "description": "Files a syntax frontend declined; pattern matching read them instead.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "totalReferences": {
+ "description": "Reference sites across every key.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uniqueKeysFound": {
+ "description": "Distinct keys with at least one reference.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "uniqueKeysFound",
+ "totalReferences",
+ "filesScanned"
+ ],
+ "type": "object"
+ },
+ "usages": {
+ "additionalProperties": {
+ "description": "Every place that key is referenced.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "callee": {
+ "description": "The translation function the key was passed to, e.g. \"t\" or \"$t\".",
+ "type": "string"
+ },
+ "file": {
+ "description": "Source file the key is referenced from, relative to the project directory.",
+ "type": "string"
+ },
+ "line": {
+ "description": "1-based line number of the reference.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "file",
+ "line",
+ "callee"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "description": "Key → its references in source. Only keys with at least one reference appear.",
+ "propertyNames": {
+ "description": "Dot-path key.",
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "usages",
+ "summary"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "reportFile": {
+ "description": "Absolute path the full JSON result was written to. Read the file for the findings; the summary below is all that came back.",
+ "type": "string"
+ },
+ "summary": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "What the scan covered and what it found. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "candidateOnlyCount": {
+ "description": "Keys kept alive only by the bare-candidate net.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "declaredCount": {
+ "description": "Keys withheld from the orphan list by a declaredNamespaces entry.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "dirsScanned": {
+ "description": "Directories the source scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dynamicMatchedCount": {
+ "description": "Keys kept alive by a dynamic key expression rather than a literal call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesDeclined": {
+ "description": "Files a syntax frontend declined; pattern matching read them instead.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "ignoredCount": {
+ "description": "Keys excluded by an orphanScan ignorePattern.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "layersChecked": {
+ "description": "Layer names the scan covered.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "linkedCount": {
+ "description": "Keys withheld because another message's value links to them with @:. Protected in every layer, never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "locale": {
+ "description": "Locale the translation keys were read from.",
+ "type": "string"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "misplacedCount": {
+ "description": "Keys used only from apps that do not consume their layer. Never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "orphanCount": {
+ "description": "Keys nothing references. The counter the orphan gate reads.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "scanScope": {
+ "additionalProperties": {
+ "description": "Directories that layer was checked against.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Each layer's effective scope: the code of the apps that consume it.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "totalKeys": {
+ "description": "Translation keys of the checked layers.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uncertainCount": {
+ "description": "Keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "usedCount": {
+ "description": "Keys with usage evidence in a consuming app.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "totalKeys",
+ "orphanCount",
+ "filesScanned"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "What the removal covered and what it deleted. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "declaredCount": {
+ "description": "Keys withheld from the orphan list by a declaredNamespaces entry.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "dirsScanned": {
+ "description": "Directories the source scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dryRun": {
+ "description": "True when nothing was deleted because a preview was asked for.",
+ "type": "boolean"
+ },
+ "dynamicMatchedCount": {
+ "description": "Keys kept alive by a dynamic key expression rather than a literal call.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesWritten": {
+ "description": "Locale files changed on disk.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "ignoredCount": {
+ "description": "Keys excluded by an orphanScan ignorePattern.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "layersChecked": {
+ "description": "Layer names the scan covered.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "linkedCount": {
+ "description": "Keys withheld because another message's value links to them with @:. Protected in every layer, never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "locale": {
+ "description": "Locale the translation keys were read from.",
+ "type": "string"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "misplacedCount": {
+ "description": "Keys used only from apps that do not consume their layer. Never deleted.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "orphanCount": {
+ "description": "Keys nothing references. The counter the orphan gate reads.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "remainingCount": {
+ "description": "Keys left in the layer after the removal.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "removedCount": {
+ "description": "Keys deleted from their layer.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "scanScope": {
+ "additionalProperties": {
+ "description": "Directories that layer was checked against.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Each layer's effective scope: the code of the apps that consume it.",
+ "propertyNames": {
+ "description": "Layer name.",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "totalKeys": {
+ "description": "Translation keys of the checked layers.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uncertainCount": {
+ "description": "Keys with ambiguous usage evidence. Never deleted, in any mode.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "usedCount": {
+ "description": "Keys with usage evidence in a consuming app.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "totalKeys"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "What the usage scan covered and what it found. This is what comes back when the full result is diverted to a file.",
+ "properties": {
+ "dirsScanned": {
+ "description": "Directories the scan walked.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "filesDeclined": {
+ "description": "Files a syntax frontend declined; pattern matching read them instead.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "filesScanned": {
+ "description": "Source files read.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "message": {
+ "description": "One sentence stating what the scan found.",
+ "type": "string"
+ },
+ "totalReferences": {
+ "description": "Reference sites across every key.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "uniqueKeysFound": {
+ "description": "Distinct keys with at least one reference.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "uniqueKeysFound",
+ "totalReferences",
+ "filesScanned"
+ ],
+ "type": "object"
+ }
+ ],
+ "description": "The counts from the full result, so a caller can act on them without reading the file."
+ }
+ },
+ "required": [
+ "reportFile",
+ "summary"
+ ],
+ "type": "object"
+ }
+ ],
+ "type": "object"
+}