repository.scope_classify
Whether a repository-relative path is in or out of the scope, the reason when it is out, and the pattern or limit that decided; an existing file is judged by name, then size, then content.
Whether a repository-relative path is in or out of the scope, the reason when it is out, and the pattern or limit that decided; an existing file is judged by name, then size, then content.
- query
- behaviorally_verified
- module repository
- #repository
- #scope
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_scope_classify |
| HTTP | GET /api/v1/scope/classify operationId repository.scope_classify |
| command line | — |
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 · ClassifyInput
Which path to judge.
| property | type | required | description |
|---|---|---|---|
| path | string | yes | Repository-relative, forward slashes; `./` is stripped. An absolute path or a `..` segment is an invalid input. |
JSON Schema
{
"additionalProperties": false,
"description": "Which path to judge.",
"properties": {
"path": {
"description": "Repository-relative, forward slashes; `./` is stripped. An absolute path or a\n`..` segment is an invalid input.",
"type": "string"
}
},
"required": [
"path"
],
"title": "ClassifyInput",
"type": "object"
}output · Classification
One path, judged.
| property | type | required | description |
|---|---|---|---|
| bytes | integer | null | no | The size, when the path is an existing file. |
| directory | boolean | yes | Whether the path is a directory; a directory is in when something beneath it can be. |
| exists | boolean | yes | Whether the path exists in the work tree; a path that does not is judged by name. |
| path | string | yes | The path, repository-relative, as judged. |
| reason | one of 2 | no | Why it is out; absent when it is in. |
| rule | string | null | no | The pattern or limit that decided: the `in` pathspec, the `out` pattern, `binary`, `max_bytes` or `fixtures.max_bytes`; absent for `undeclared`. |
| verdict | reference | yes | In or out. |
JSON Schema
{
"$defs": {
"Reason": {
"description": "Why a path is out. The order is the order the rules decide in.",
"oneOf": [
{
"const": "path",
"description": "Named under `out.paths`.",
"type": "string"
},
{
"const": "secret",
"description": "A secret.",
"type": "string"
},
{
"const": "generated",
"description": "A generated asset.",
"type": "string"
},
{
"const": "archive",
"description": "An archive.",
"type": "string"
},
{
"const": "image",
"description": "An image.",
"type": "string"
},
{
"const": "video",
"description": "Video.",
"type": "string"
},
{
"const": "pdf",
"description": "A PDF document.",
"type": "string"
},
{
"const": "database_dump",
"description": "A database dump.",
"type": "string"
},
{
"const": "undeclared",
"description": "Matches no `in` pathspec.",
"type": "string"
},
{
"const": "fixture_over_limit",
"description": "A fixture over `out.fixtures.max_bytes`.",
"type": "string"
},
{
"const": "over_limit",
"description": "Over `out.max_bytes`.",
"type": "string"
},
{
"const": "binary",
"description": "Content with a NUL byte in its first [`SNIFF_BYTES`]: not text.",
"type": "string"
}
]
},
"Verdict": {
"description": "In or out.",
"oneOf": [
{
"const": "in",
"description": "Read.",
"type": "string"
},
{
"const": "out",
"description": "Never read; the reason says why.",
"type": "string"
}
]
}
},
"description": "One path, judged.",
"properties": {
"bytes": {
"description": "The size, when the path is an existing file.",
"format": "uint64",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"directory": {
"description": "Whether the path is a directory; a directory is in when something beneath it can be.",
"type": "boolean"
},
"exists": {
"description": "Whether the path exists in the work tree; a path that does not is judged by name.",
"type": "boolean"
},
"path": {
"description": "The path, repository-relative, as judged.",
"type": "string"
},
"reason": {
"anyOf": [
{
"$ref": "#/$defs/Reason"
},
{
"type": "null"
}
],
"description": "Why it is out; absent when it is in."
},
"rule": {
"description": "The pattern or limit that decided: the `in` pathspec, the `out` pattern, `binary`,\n`max_bytes` or `fixtures.max_bytes`; absent for `undeclared`.",
"type": [
"string",
"null"
]
},
"verdict": {
"$ref": "#/$defs/Verdict",
"description": "In or out."
}
},
"required": [
"path",
"verdict",
"exists",
"directory"
],
"title": "Classification",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- disabled — every call runs the handler
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 | 5 | layer-file local-half secret undeclared first-object |
| mcp | covered | 5 | layer-file local-half secret undeclared first-object |
| http | covered | 5 | layer-file local-half secret undeclared first-object |
The moments this answers
- found two agents fixing the same bug in two branches Two workers spend a day each on one defect because ownership was implicit and neither could see the other.
- watched one worker revert another worker's change, on purpose A worker sees an unexplained change in its path, judges it wrong, and removes it — correctly, on the evidence it had.
- found a substantial change that no issue, ticket or plan ever asked for Work arrives with no bounded contract behind it, so its scope, its acceptance criteria and its ownership are all decided after the fact.