Skip to main content
Glama

absorb_document

Destructive

Convert a CLAUDE.md/AGENTS.md instruction file into typed ontology nodes, splitting sections and classifying policies, while preserving non-absorbed content with backup and dry-run safety.

Instructions

Slice 0 (PRODUCT-PLAN-2026-07.md §4/§9) — the "absorption tool". Converts a CLAUDE.md/AGENTS.md-style markdown file into typed vault nodes so a tech lead's existing agent-instruction file stops needing dual maintenance. Splits the file by ## sections and classifies each:

  • rule/policy/decision sections → kind: document nodes with a role: policy frontmatter extra.

  • architecture/component sections → element/capability SUGGESTIONS only — never auto-written; review and land with add_concept if useful.

  • sections matching an injection-suspect pattern (Tier 1 — imperative instruction-hijack phrasing, shell/SQL fragments) are excluded from absorption regardless of category and reported for human review. The file body is always treated as untrusted data; parsing never executes or evaluates its content. Two-stage safety, same shape as delete_concept:

  1. Without confirm: true the call is a dry-run — returns the classification plan per section, no writes.

  2. With confirm: true, absorbed sections are written as document nodes, the source file is backed up to <file>.pre-absorb.bak, then rewritten into a "slim pointer" that reproduces every non-absorbed section (suggested, unclassified, or injection-suspect) verbatim — content is never destroyed. Throws instead of overwriting an existing backup file. The canonical source path must be inside repoRoot; outside paths (including symlink escapes) require an reviewed dry-run plus explicit allowOutsideRepo:true.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
confirmNoActually write when true. Omit or false for a dry-run (plan only, no writes).
filePathYesPath to the CLAUDE.md/AGENTS.md-style markdown file to absorb (absolute, or relative to the MCP server cwd).
allowOutsideRepoNoExplicit destructive opt-in required only when filePath resolves outside repoRoot. Dry-run reports outsideRepo and keeps canConfirm:false without it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
titleNo
dryRunYes
changedNo
messageYes
summaryYes
writtenNo
filePathYes
sectionsYes
backupPathNo
canConfirmYesTrue only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in.
outsideRepoYes
sourceLabelYes
wouldChangeYesTrue only when the dry-run predicts a disk or Git change.
previewReadyYesTrue only when this response is a complete dry-run preview that an agent can review.
blockedReasonsYesMachine-readable human explanations for every condition currently blocking confirmation.
postWriteMaintenanceNoCompact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv1.3.0
    • changedOutput schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enum
      Previous value: -[
      -  "inspect_compile_issue",
      -  "break_dependency_cycle",
      -  "canonicalize_graph_arrays",
      -  "resolve_dangling_reference",
      -  "add_missing_relation",
      -  "materialize_external_element",
      -  "unassigned_node",
      -  "empty_domain",
      -  "separate_evidence_from_concept",
      -  "fold_bulk_siblings",
      -  "retire_unearned_node",
      -  "capability_without_evidence",
      -  "rejudge_summary_membership"
      -]New value: +[
      +  "inspect_compile_issue",
      +  "break_dependency_cycle",
      +  "canonicalize_graph_arrays",
      +  "resolve_dangling_reference",
      +  "add_missing_relation",
      +  "materialize_external_element",
      +  "unassigned_node",
      +  "empty_domain",
      +  "separate_evidence_from_concept",
      +  "fold_bulk_siblings",
      +  "retire_unearned_node",
      +  "capability_without_evidence",
      +  "rejudge_summary_membership",
      +  "definition_missing",
      +  "boundary_missing",
      +  "epistemic_exclusion",
      +  "folder_only_evidence",
      +  "slug_outside_kind_folder",
      +  "uncertainty_missing",
      +  "retire_starter_example"
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enum
      Previous value: -[
      -  "inspect_compile_issue",
      -  "break_dependency_cycle",
      -  "canonicalize_graph_arrays",
      -  "resolve_dangling_reference",
      -  "add_missing_relation",
      -  "materialize_external_element",
      -  "unassigned_node",
      -  "empty_domain",
      -  "separate_evidence_from_concept",
      -  "fold_bulk_siblings",
      -  "retire_unearned_node",
      -  "capability_without_evidence",
      -  "rejudge_summary_membership"
      -]New value: +[
      +  "inspect_compile_issue",
      +  "break_dependency_cycle",
      +  "canonicalize_graph_arrays",
      +  "resolve_dangling_reference",
      +  "add_missing_relation",
      +  "materialize_external_element",
      +  "unassigned_node",
      +  "empty_domain",
      +  "separate_evidence_from_concept",
      +  "fold_bulk_siblings",
      +  "retire_unearned_node",
      +  "capability_without_evidence",
      +  "rejudge_summary_membership",
      +  "definition_missing",
      +  "boundary_missing",
      +  "epistemic_exclusion",
      +  "folder_only_evidence",
      +  "slug_outside_kind_folder",
      +  "uncertainty_missing",
      +  "retire_starter_example"
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enum
      Previous value: -[
      -  "inspect_compile_issue",
      -  "break_dependency_cycle",
      -  "canonicalize_graph_arrays",
      -  "resolve_dangling_reference",
      -  "add_missing_relation",
      -  "materialize_external_element",
      -  "unassigned_node",
      -  "empty_domain",
      -  "separate_evidence_from_concept",
      -  "fold_bulk_siblings",
      -  "retire_unearned_node",
      -  "capability_without_evidence",
      -  "rejudge_summary_membership"
      -]New value: +[
      +  "inspect_compile_issue",
      +  "break_dependency_cycle",
      +  "canonicalize_graph_arrays",
      +  "resolve_dangling_reference",
      +  "add_missing_relation",
      +  "materialize_external_element",
      +  "unassigned_node",
      +  "empty_domain",
      +  "separate_evidence_from_concept",
      +  "fold_bulk_siblings",
      +  "retire_unearned_node",
      +  "capability_without_evidence",
      +  "rejudge_summary_membership",
      +  "definition_missing",
      +  "boundary_missing",
      +  "epistemic_exclusion",
      +  "folder_only_evidence",
      +  "slug_outside_kind_folder",
      +  "uncertainty_missing",
      +  "retire_starter_example"
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enum
      Previous value: -[
      -  "inspect_compile_issue",
      -  "break_dependency_cycle",
      -  "canonicalize_graph_arrays",
      -  "resolve_dangling_reference",
      -  "add_missing_relation",
      -  "materialize_external_element",
      -  "unassigned_node",
      -  "empty_domain",
      -  "separate_evidence_from_concept",
      -  "fold_bulk_siblings",
      -  "retire_unearned_node",
      -  "capability_without_evidence",
      -  "rejudge_summary_membership"
      -]New value: +[
      +  "inspect_compile_issue",
      +  "break_dependency_cycle",
      +  "canonicalize_graph_arrays",
      +  "resolve_dangling_reference",
      +  "add_missing_relation",
      +  "materialize_external_element",
      +  "unassigned_node",
      +  "empty_domain",
      +  "separate_evidence_from_concept",
      +  "fold_bulk_siblings",
      +  "retire_unearned_node",
      +  "capability_without_evidence",
      +  "rejudge_summary_membership",
      +  "definition_missing",
      +  "boundary_missing",
      +  "epistemic_exclusion",
      +  "folder_only_evidence",
      +  "slug_outside_kind_folder",
      +  "uncertainty_missing",
      +  "retire_starter_example"
      +]
  2. Changed8 schema fields changedv1.2.5
    • addedOutput schema / properties / postWriteMaintenance / properties / actions / items / allOf
      Added value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "executable": {
      +          "const": true
      +        }
      +      },
      +      "required": [
      +        "executable"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "proposedAction": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args": {
      +              "oneOf": [
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "kind": {
      +                      "enum": [
      +                        "project",
      +                        "domain",
      +                        "capability",
      +                        "element",
      +                        "document",
      +                        "vault-readme"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "title": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "kind",
      +                    "title"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "from": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "to": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "enum": [
      +                        "depends_on",
      +                        "relates",
      +                        "contains",
      +                        "describes",
      +                        "domains",
      +                        "capabilities",
      +                        "elements",
      +                        "domain"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "why": {
      +                      "description": "One-line rationale for this relation (\"A leans on B because ...\"). Stored in the SAME frontmatter write as the ref (relation_notes map) — write it whenever you know the reason; a graph edge without a why is a mind-map line, not an ontology claim.",
      +                      "maxLength": 300,
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "from",
      +                    "to",
      +                    "type"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "expected_mtime": {
      +                      "minimum": 0,
      +                      "type": "number"
      +                    },
      +                    "frontmatter": {
      +                      "additionalProperties": false,
      +                      "properties": {
      +                        "broader": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "capabilities": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "contains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "dependencies": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "depends_on": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "describes": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "domains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "elements": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "relates": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        }
      +                      },
      +                      "type": "object"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "frontmatter",
      +                    "expected_mtime"
      +                  ],
      +                  "type": "object"
      +                }
      +              ]
      +            },
      +            "tool": {
      +              "enum": [
      +                "add_concept",
      +                "add_relation",
      +                "patch_concept"
      +              ],
      +              "minLength": 1,
      +              "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "tool",
      +            "args"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "proposedAction"
      +      ]
      +    }
      +  }
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / actions / items / required
      Previous value: -[
      -  "id",
      -  "phase",
      -  "kind",
      -  "severity",
      -  "score",
      -  "executable",
      -  "reason",
      -  "proposedAction"
      -]New value: +[
      +  "id",
      +  "phase",
      +  "kind",
      +  "severity",
      +  "score",
      +  "executable",
      +  "reason"
      +]
    • addedOutput schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOf
      Added value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "executable": {
      +          "const": true
      +        }
      +      },
      +      "required": [
      +        "executable"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "proposedAction": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args": {
      +              "oneOf": [
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "kind": {
      +                      "enum": [
      +                        "project",
      +                        "domain",
      +                        "capability",
      +                        "element",
      +                        "document",
      +                        "vault-readme"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "title": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "kind",
      +                    "title"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "from": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "to": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "enum": [
      +                        "depends_on",
      +                        "relates",
      +                        "contains",
      +                        "describes",
      +                        "domains",
      +                        "capabilities",
      +                        "elements",
      +                        "domain"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "why": {
      +                      "description": "One-line rationale for this relation (\"A leans on B because ...\"). Stored in the SAME frontmatter write as the ref (relation_notes map) — write it whenever you know the reason; a graph edge without a why is a mind-map line, not an ontology claim.",
      +                      "maxLength": 300,
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "from",
      +                    "to",
      +                    "type"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "expected_mtime": {
      +                      "minimum": 0,
      +                      "type": "number"
      +                    },
      +                    "frontmatter": {
      +                      "additionalProperties": false,
      +                      "properties": {
      +                        "broader": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "capabilities": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "contains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "dependencies": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "depends_on": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "describes": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "domains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "elements": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "relates": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        }
      +                      },
      +                      "type": "object"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "frontmatter",
      +                    "expected_mtime"
      +                  ],
      +                  "type": "object"
      +                }
      +              ]
      +            },
      +            "tool": {
      +              "enum": [
      +                "add_concept",
      +                "add_relation",
      +                "patch_concept"
      +              ],
      +              "minLength": 1,
      +              "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "tool",
      +            "args"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "proposedAction"
      +      ]
      +    }
      +  }
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / nextExecutableAction / required
      Previous value: -[
      -  "id",
      -  "phase",
      -  "kind",
      -  "severity",
      -  "score",
      -  "executable",
      -  "reason",
      -  "proposedAction"
      -]New value: +[
      +  "id",
      +  "phase",
      +  "kind",
      +  "severity",
      +  "score",
      +  "executable",
      +  "reason"
      +]
    • addedOutput schema / properties / postWriteMaintenance / properties / nextReviewAction / allOf
      Added value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "executable": {
      +          "const": true
      +        }
      +      },
      +      "required": [
      +        "executable"
      +      ]
      +    },
      +    "then": {
      +      "properties": {
      +        "proposedAction": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "args": {
      +              "oneOf": [
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "kind": {
      +                      "enum": [
      +                        "project",
      +                        "domain",
      +                        "capability",
      +                        "element",
      +                        "document",
      +                        "vault-readme"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "title": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "kind",
      +                    "title"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "from": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "to": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "enum": [
      +                        "depends_on",
      +                        "relates",
      +                        "contains",
      +                        "describes",
      +                        "domains",
      +                        "capabilities",
      +                        "elements",
      +                        "domain"
      +                      ],
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    },
      +                    "why": {
      +                      "description": "One-line rationale for this relation (\"A leans on B because ...\"). Stored in the SAME frontmatter write as the ref (relation_notes map) — write it whenever you know the reason; a graph edge without a why is a mind-map line, not an ontology claim.",
      +                      "maxLength": 300,
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "from",
      +                    "to",
      +                    "type"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "expected_mtime": {
      +                      "minimum": 0,
      +                      "type": "number"
      +                    },
      +                    "frontmatter": {
      +                      "additionalProperties": false,
      +                      "properties": {
      +                        "broader": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "capabilities": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "contains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "dependencies": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "depends_on": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "describes": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "domains": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "elements": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        },
      +                        "relates": {
      +                          "items": {
      +                            "minLength": 1,
      +                            "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                            "type": "string"
      +                          },
      +                          "maxItems": 500,
      +                          "type": "array"
      +                        }
      +                      },
      +                      "type": "object"
      +                    },
      +                    "slug": {
      +                      "minLength": 1,
      +                      "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "slug",
      +                    "frontmatter",
      +                    "expected_mtime"
      +                  ],
      +                  "type": "object"
      +                }
      +              ]
      +            },
      +            "tool": {
      +              "enum": [
      +                "add_concept",
      +                "add_relation",
      +                "patch_concept"
      +              ],
      +              "minLength": 1,
      +              "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "tool",
      +            "args"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "proposedAction"
      +      ]
      +    }
      +  }
      +]
    • changedOutput schema / properties / postWriteMaintenance / properties / nextReviewAction / required
      Previous value: -[
      -  "id",
      -  "phase",
      -  "kind",
      -  "severity",
      -  "score",
      -  "executable",
      -  "reason",
      -  "proposedAction"
      -]New value: +[
      +  "id",
      +  "phase",
      +  "kind",
      +  "severity",
      +  "score",
      +  "executable",
      +  "reason"
      +]
    • addedOutput schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidence
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / postWriteMaintenance / properties / summary / required
      Previous value: -[
      -  "totalActions",
      -  "filteredActions",
      -  "remainingActions",
      -  "executableActions",
      -  "reviewActions",
      -  "compileIssues",
      -  "dependencyCycles",
      -  "canonicalizationActions",
      -  "danglingReferences",
      -  "relationRecommendations",
      -  "externalElementRefs",
      -  "externalElementRefsIgnored",
      -  "unassignedNodes",
      -  "emptyDomains"
      -]New value: +[
      +  "totalActions",
      +  "filteredActions",
      +  "remainingActions",
      +  "executableActions",
      +  "reviewActions",
      +  "compileIssues",
      +  "dependencyCycles",
      +  "canonicalizationActions",
      +  "danglingReferences",
      +  "relationRecommendations",
      +  "externalElementRefs",
      +  "externalElementRefsIgnored",
      +  "unassignedNodes",
      +  "emptyDomains",
      +  "capabilitiesWithoutEvidence"
      +]
  3. First observedv0.13.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description richly discloses behavior beyond annotations: dry-run by default, backup creation, rewriting into a 'slim pointer,' throwing instead of overwriting an existing backup, and the rule that the file body is 'always treated as untrusted data.' These details align with destructiveHint:true while also clarifying exactly what is and isn't destroyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely informative, with each clause carrying operational or safety meaning. It is front-loaded with the core purpose and then structures the two-stage safety flow clearly. The 'Slice 0 (PRODUCT-PLAN-2026-07.md §4/§9)' prefix is slightly extraneous for invocation, but it does not obscure the essential guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool of this complexity: it covers dry-run behavior, write behavior, backup and fallback semantics, content preservation, injection-suspect handling, and path restrictions. Since an output schema exists, it does not need to enumerate return fields, and it already states that the dry-run returns the 'classification plan per section.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining that confirm controls dry-run vs write, that allowOutsideRepo requires a reviewed dry-run, and that outside paths are blocked without it. This makes the parameters' behavioral impact clearer than the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it 'converts a CLAUDE.md/AGENTS.md-style markdown file into typed vault nodes' and explicitly distinguishes its classification behavior from related sibling tools like add_concept and delete_concept. It also clearly separates absorbed, suggested, and excluded sections, leaving no ambiguity about the tool's role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the motivating use case ('stops needing dual maintenance') and gives explicit routing guidance: architecture/component sections become suggestions only and should be 'review and land with add_concept if useful.' It also states when behavior changes (dry-run vs confirm:true) and when allowOutsideRepo is required, so an agent knows exactly when to invoke this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.