Path Classification
bob path <repository-relative-path> [workspace] is a read-only, offline explanation of Bob's relationship to one exact path. It uses the same canonical workspace, rendered recipe, complete plan, bob.lock, symlink checks, special-file checks, and whole-file ownership rules as the engine. Recipe extension patterns are considered only after managed and reserved paths have been classified.
The command does not return file bodies and never emits safe_to_edit. Outside Bob ownership means only that Bob does not own the path; it is not a product, security, or behavioral safety claim.
Schema version 1
The standard CLI envelope has command: "path". Its data includes:
{
"schema_version": 1,
"workspace": "/canonical/workspace",
"path": "internal/cli/root.go",
"exists": true,
"classification": "managed",
"state": "managed_in_sync",
"human_edit_effect": "will_conflict",
"ownership": {
"recipe": {"id": "go-agent-tool", "version": 4},
"locked_sha256": "...",
"current_sha256": "..."
},
"plan_action": {"kind": "unchanged", "code": "in_sync"},
"artifact": {"id": "cli.root", "roles": ["cli", "composition_root"], "capability_ids": ["surface.cli", "surface.json"]},
"extension_points": [],
"related_playbooks": ["add-cli-command"],
"notices": [],
"actions": [],
"truncation": {"profile": "path", "byte_limit": 8192, "truncated": false, "omitted": {}}
}Closed vocabularies
classification is one of managed, reserved, extension_point, unmanaged, or missing.
state is one of managed_in_sync, managed_modified, managed_missing, retired_owned, extension_point, unmanaged_present, unmanaged_missing, reserved, symlink, or special_file.
human_edit_effect is one of will_conflict, outside_bob_ownership, reserved_for_bob, requires_manifest_change, or unsafe.
bob.yamlis reserved withrequires_manifest_change: it is the human-owned contract surface.bob.lock,.bob.apply.lock, and.gitare reserved for Bob or repository machinery.- A desired absent artifact is
managed_missing; manually creating different bytes will conflict. - A lock-owned path retired by the current recipe is
retired_owned. - A matching human extension pattern is
extension_pointonly when the path is not desired, locked, or reserved. - Absolute paths, traversal, empty paths, NUL, and invalid UTF-8 are rejected.
Consumers branch on these codes and on plan_action.code, never on prose. Results are capped at 8 KiB. Deterministic omission removes only supplemental artifact detail, notices, and non-blocking continuation actions; the truncation object reports every omission.