why.diagnose
What a reader's own symptoms imply: the moments the selection resolves to, the operational areas and audiences they weigh towards, and the capabilities, commands, claims, rules and use cases that answer them — each carrying the moments that produced it. Counting, not inference: there is no weighting and no percentage.
What a reader's own symptoms imply: the moments the selection resolves to, the operational areas and audiences they weigh towards, and the capabilities, commands, claims, rules and use cases that answer them — each carrying the moments that produced it. Counting, not inference: there is no weighting and no percentage.
- query
- behaviorally_verified
- module why
- #why
- #diagnostics
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_why_diagnose |
| HTTP | GET /api/v1/why/diagnose operationId why.diagnose |
| command line | majordomus why diagnose |
Schemas
The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.
input · DiagnoseInput
What a reader recognised, as a comma-separated list of names. A name is a signal id or a moment id: a person ticking symptoms and a script naming moments reach the same answer, because a signal resolves to the moment that owns it. The parameter is one string rather than a list because a diagnosis changes nothing and is therefore a `GET`, and this repository binds a `GET` input to the query string.
| property | type | required | description |
|---|---|---|---|
| signals | string | no | Signal ids or moment ids, separated by commas. Empty selects nothing and is answered with an empty diagnosis rather than an error. default "" |
JSON Schema
{
"additionalProperties": false,
"description": "What a reader recognised, as a comma-separated list of names.\n\nA name is a signal id or a moment id: a person ticking symptoms and a script naming\nmoments reach the same answer, because a signal resolves to the moment that owns it.\nThe parameter is one string rather than a list because a diagnosis changes nothing and\nis therefore a `GET`, and this repository binds a `GET` input to the query string.",
"properties": {
"signals": {
"default": "",
"description": "Signal ids or moment ids, separated by commas. Empty selects nothing and is\nanswered with an empty diagnosis rather than an error.",
"type": "string"
}
},
"title": "DiagnoseInput",
"type": "object"
}output · Diagnosis
What a reader's selection implies, computed by counting rather than by inference. The arithmetic is the whole model and is stated so a reader can check it: a selection resolves to a set of moments; an area or an audience scores the number of selected moments that name it; a recommendation scores the number that name it and carries their ids. There is no weighting and no percentage, because there is no model behind one.
| property | type | required | description |
|---|---|---|---|
| also_worth_reading | array | yes | Moments the selection did not include that share an area with one that it did. |
| areas | array | yes | Operational areas by how many selected moments fall under them, heaviest first. |
| audiences | array | yes | Audiences by how many selected moments they recognise, heaviest first. |
| capabilities | array | yes | Capabilities of the executable that answer the selected moments. |
| claims | array | yes | Claims that say what is guaranteed. |
| commands | array | yes | Commands that answer them. |
| doctrines | array | yes | Rules of the effective set that govern them. |
| moments | array | yes | The moments the selection resolved to, in presentation order. |
| unresolved | array | yes | Selected names that resolved to nothing. |
| use_cases | array | yes | Use cases that show the way out. |
JSON Schema
{
"$defs": {
"Recommendation": {
"description": "One recommendation, with the moments that produced it. A recommendation with no\n`matched_because` is a recommendation nobody can check.",
"properties": {
"count": {
"description": "How many of the selected moments name it.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"id": {
"description": "The thing recommended: a capability id, a command, a claim, a rule, a use case.",
"type": "string"
},
"matched_because": {
"description": "The selected moments that named it, in presentation order.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"id",
"count",
"matched_because"
],
"type": "object"
}
},
"description": "What a reader's selection implies, computed by counting rather than by inference.\n\nThe arithmetic is the whole model and is stated so a reader can check it: a selection\nresolves to a set of moments; an area or an audience scores the number of selected\nmoments that name it; a recommendation scores the number that name it and carries\ntheir ids. There is no weighting and no percentage, because there is no model behind\none.",
"properties": {
"also_worth_reading": {
"description": "Moments the selection did not include that share an area with one that it did.",
"items": {
"type": "string"
},
"type": "array"
},
"areas": {
"description": "Operational areas by how many selected moments fall under them, heaviest first.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"audiences": {
"description": "Audiences by how many selected moments they recognise, heaviest first.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"capabilities": {
"description": "Capabilities of the executable that answer the selected moments.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"claims": {
"description": "Claims that say what is guaranteed.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"commands": {
"description": "Commands that answer them.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"doctrines": {
"description": "Rules of the effective set that govern them.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
},
"moments": {
"description": "The moments the selection resolved to, in presentation order.",
"items": {
"type": "string"
},
"type": "array"
},
"unresolved": {
"description": "Selected names that resolved to nothing.",
"items": {
"type": "string"
},
"type": "array"
},
"use_cases": {
"description": "Use cases that show the way out.",
"items": {
"$ref": "#/$defs/Recommendation"
},
"type": "array"
}
},
"required": [
"moments",
"unresolved",
"areas",
"audiences",
"capabilities",
"commands",
"claims",
"doctrines",
"use_cases",
"also_worth_reading"
],
"title": "Diagnosis",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- process — up to 32 entries in the process, scoped by the registry fingerprint
Benchmark targets
Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.
| transport | state | cases | targets |
|---|---|---|---|
| direct | covered | 1 | three-moments cold+warm |
| mcp | covered | 1 | three-moments cold+warm |
| http | covered | 1 | three-moments cold+warm |